82 lines
2.4 KiB
Plaintext
Executable File
82 lines
2.4 KiB
Plaintext
Executable File
#!/usr/bin/env swift
|
|
|
|
import Foundation
|
|
|
|
guard CommandLine.argc != 1 else {
|
|
print("Require first param")
|
|
exit(1)
|
|
}
|
|
|
|
let process = Process()
|
|
process.executableURL = URL(fileURLWithPath: "/usr/bin/env")
|
|
process.arguments = ["git", "symbolic-ref", "--short", "HEAD"]
|
|
|
|
var pipe = Pipe()
|
|
|
|
process.standardOutput = pipe
|
|
do{
|
|
try process.run()
|
|
let data = pipe.fileHandleForReading.readDataToEndOfFile()
|
|
if let output = String(data: data, encoding: String.Encoding.utf8) {
|
|
let branch = output.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
exit(processCommitMessage(branch: branch,
|
|
filePath: CommandLine.arguments[1]))
|
|
}
|
|
} catch {}
|
|
|
|
func processCommitMessage(branch: String, filePath: String) -> Int32 {
|
|
|
|
let taskPrefix = "PSDK"
|
|
let noissuePrefix = "noissue"
|
|
let allowedRoot = ["feature", "release", "bugfix"]
|
|
|
|
guard let commitMessage = try? String(contentsOfFile: filePath) else {
|
|
print("Error. Can't read commit message file.")
|
|
return 1
|
|
}
|
|
|
|
if commitMessage.hasPrefix("Merge") { return 0 }
|
|
if commitMessage.hasPrefix(noissuePrefix) { return 0 }
|
|
|
|
let branchComponents = branch.components(separatedBy: "/")
|
|
let rootComponent = branchComponents[0]
|
|
|
|
if branchComponents.count > 0, !allowedRoot.contains(rootComponent) {
|
|
print("Error. Branch \(branch) require starts with one of \(allowedRoot)")
|
|
return 1
|
|
}
|
|
|
|
guard let searchRegex = try? Regex("\(taskPrefix)-(\\d+) - (.*)") else {
|
|
print("Error. Internal scripts.")
|
|
return 1
|
|
}
|
|
|
|
guard let _ = try? searchRegex.firstMatch(in: commitMessage) else {
|
|
print("Error. Incorrect commit message \"\(commitMessage)\" for branch \(branch)")
|
|
return 1
|
|
}
|
|
|
|
if branchComponents.count > 1,
|
|
!allowedRoot.contains(rootComponent) {
|
|
print("Error. Invalid git path for branch \(branch)")
|
|
return 1
|
|
}
|
|
|
|
guard let branchRegex = try? Regex("\(taskPrefix)-(\\d+)") else {
|
|
print("Error. Internal scripts.")
|
|
return 1
|
|
}
|
|
guard let branchMatch = try? branchRegex.firstMatch(in: commitMessage) else {
|
|
print("Error. Incorrect commit message \(branch)")
|
|
return 1
|
|
}
|
|
|
|
let branchPart = "\(commitMessage[branchMatch.range])"
|
|
|
|
guard branchComponents.contains(branchPart) else {
|
|
print("Error. Commit message \(branchPart) not correspond to branch \(branch)")
|
|
return 1
|
|
}
|
|
|
|
return 0
|
|
} |