Files
2023-08-28 14:29:52 +03:00

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
}