This repository has been archived by the owner on May 4, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbumpBuildVersion
executable file
·137 lines (106 loc) · 4.38 KB
/
bumpBuildVersion
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/swift
import Foundation
struct Constants {
static let gitPath = "/usr/bin/git"
static let agvtoolPath = "/usr/bin/agvtool"
}
extension String {
func stringByTrimmingWhitespace() -> String {
return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
}
func stringByTrimmingWhitespaceAndNewline() -> String {
return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
}
}
struct SystemTaskExecutor
{
func executeSystemCommandWithLaunchPath(launchPath: String, arguments: String) -> String? {
let task = NSTask()
task.launchPath = launchPath
task.arguments = arguments.characters.split{$0 == " "}.map(String.init);
let pipe = NSPipe()
task.standardOutput = pipe
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data:data, encoding:NSUTF8StringEncoding) as String?
return output
}
}
struct GitUtility {
func tagBranchWithTagName(tagName: String) -> String? {
return executeGitCommandWithArguments("tag " + tagName.stringByTrimmingWhitespaceAndNewline())
}
func createBranchNamed(branchName: String) {
executeGitCommandWithArguments("branch " + branchName)
}
func deleteBranchNamed(branchName: String) {
executeGitCommandWithArguments("branch -D " + branchName)
}
func switchToBranchNamed(branchName: String) {
executeGitCommandWithArguments("checkout " + branchName)
}
func currentGitBranch() -> String? {
return executeGitCommandWithArguments("rev-parse --abbrev-ref HEAD")?.stringByTrimmingWhitespaceAndNewline()
}
// MARK: private
private func executeGitCommandWithArguments(arguments: String) -> String? {
let taskExecutor = SystemTaskExecutor()
return taskExecutor.executeSystemCommandWithLaunchPath(Constants.gitPath, arguments:arguments)
}
}
struct VersionStringTransformer {
func nextBranchName(branchName: String) -> String {
return nextMajorMinorInternalVersion(branchName, separator: "_")
}
func nextBuildVersionNumber(version: String) -> String {
return nextMajorMinorInternalVersion(version, separator: ".")
}
// MARK: private
private func nextMajorMinorInternalVersion(version: String, separator: Character) -> String {
assert(version.characters.count > 0)
var nextVersionString = version
var versionComponents = version.stringByTrimmingWhitespaceAndNewline().characters.split{$0 == separator}.map(String.init)
if let lastVersionComponent = versionComponents.last {
let lastNumber = Int(lastVersionComponent)
if let safeLastNumber = lastNumber {
let nextVersionNumber = Int(safeLastNumber + 1)
let lastIndex = (versionComponents.count - 1)
versionComponents[lastIndex] = String(nextVersionNumber)
}
nextVersionString = versionComponents.joinWithSeparator(String(separator))
}
return nextVersionString
}
}
func tagNameFromBranchName(branchName: String) -> String {
let safeBranchName = branchName.stringByTrimmingWhitespaceAndNewline()
return String(safeBranchName.characters.dropFirst())
}
func executeArgvtoolWithArguments(arguments: String) -> String? {
return SystemTaskExecutor().executeSystemCommandWithLaunchPath(Constants.agvtoolPath, arguments: arguments)
}
func bumpBuildVersionNumber() {
if let currentBuildVersionNumber = executeArgvtoolWithArguments("what-version -terse") {
let nextBuildVersionNumber = VersionStringTransformer().nextBuildVersionNumber(currentBuildVersionNumber)
executeArgvtoolWithArguments("new-version -all " + nextBuildVersionNumber)
}
}
func main() {
let gitUtility = GitUtility()
let branch = gitUtility.currentGitBranch()
if let currentBranch = branch {
gitUtility.tagBranchWithTagName(tagNameFromBranchName(currentBranch))
let newBranchName = VersionStringTransformer().nextBranchName(currentBranch)
gitUtility.createBranchNamed(newBranchName)
gitUtility.switchToBranchNamed(newBranchName)
let oldBranchName = currentBranch
gitUtility.deleteBranchNamed(oldBranchName)
bumpBuildVersionNumber()
print("\nCurrently the script only places a tag in the repo")
print("Things on the list to implement:")
print("\t- abort execution if there are local changes in the repo (you don't want to release if there are some local changes!)")
print("\t- automatically make a commit updating version number in the info.plist file")
print("\t- print more verbose information about what's happening behind the scenes")
}
}
main();