Created
October 7, 2019 14:18
-
-
Save kruperfone/ee842f5186af32b4be0669a79b6ee535 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/swift | |
/* Git commit hook. Place it into your .git/hooks folder with 'prepare-commit-msg' name | |
#!/bin/sh | |
echo "Start prepare-commit-msg hook" | |
COMMIT_MSG_FILE=$1 | |
COMMIT_SOURCE=$2 | |
#SHA1=$3 | |
PATH=path-to-file | |
PREFIX=prefix | |
swift $PATH $PREFIX $COMMIT_MSG_FILE $COMMIT_SOURCE | |
echo "End prepare-commit-msg hook" | |
*/ | |
import Foundation | |
// MARK: Bash | |
func shell(launchPath: String, arguments: [String]) -> String | |
{ | |
let task = Process() | |
task.launchPath = launchPath | |
task.arguments = arguments | |
let pipe = Pipe() | |
task.standardOutput = pipe | |
task.launch() | |
let data = pipe.fileHandleForReading.readDataToEndOfFile() | |
let output = String(data: data, encoding: String.Encoding.utf8)! | |
if output.count > 0 { | |
//remove newline character. | |
let count = output.count-1 | |
return String(output.prefix(count)) | |
} | |
return output | |
} | |
func bash(_ command: String, _ arguments: String...) -> String { | |
let whichPathForCommand = shell(launchPath: "/bin/bash", arguments: [ "-l", "-c", "which \(command)" ]) | |
return shell(launchPath: whichPathForCommand, arguments: arguments) | |
} | |
// MARK: Helpers | |
func extractTicket(branch: String) -> String? { | |
guard let data = branch.split(separator: "/").last?.split(separator: "-").map({ String($0) }) else { return nil } | |
guard data.count >= 2 else { return nil } | |
guard data[0] == ticketPrefix else { return nil } | |
guard let number = Int(data[1]) else { return nil } | |
return "\(ticketPrefix)-\(number)" | |
} | |
// MARK: Script | |
let ticketPrefix = CommandLine.arguments[1] | |
let commitMessageFile = "\(bash("pwd"))/\(CommandLine.arguments[2])" | |
let commitSource = CommandLine.arguments[3] | |
let branch = bash("git", "symbolic-ref", "--short", "HEAD") | |
let ignoredCommitSources = ["merge"] | |
func main() throws { | |
print("Commit source: \(commitSource)") | |
print("Ticket prefix: \(ticketPrefix)") | |
print("Branch name: \(branch)") | |
guard !ignoredCommitSources.contains(commitSource) else { | |
print("Ignored commit source: \(commitSource)") | |
return | |
} | |
guard let ticket = extractTicket(branch: branch) else { | |
print("Ticket can not be extracted") | |
return | |
} | |
let commitText = try String(contentsOfFile: commitMessageFile, encoding: .utf8) | |
let editedCommit = "\(commitText)\n\n\(ticket)" | |
try editedCommit.write(toFile: commitMessageFile, atomically: false, encoding: .utf8) | |
print("Attached ticket: \(ticket)") | |
} | |
do { | |
try main() | |
} catch let error { | |
print(error.localizedDescription) | |
fatalError() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment