diff --git a/Sources/GitKit/Git.swift b/Sources/GitKit/Git.swift index 66fb3af..68cad62 100644 --- a/Sources/GitKit/Git.swift +++ b/Sources/GitKit/Git.swift @@ -20,7 +20,12 @@ public final class Git: Shell { case writeConfig(name: String, value: String) case readConfig(name: String) case clone(url: String) - case checkout(branch: String, create: Bool = false) + + /// - parameter branch the name of the branch to checkout + /// - parameter create whether to create a new branch or checkout an existing one + /// - parameter tracking when creating a new branch, the name of the remote branch it should track + case checkout(branch: String, create: Bool = false, tracking: String? = nil) + case log(numberOfCommits: Int? = nil, options: [String]? = nil, revisions: String? = nil) case push(remote: String? = nil, branch: String? = nil) case pull(remote: String? = nil, branch: String? = nil, rebase: Bool = false) @@ -69,12 +74,15 @@ public final class Git: Shell { } case .clone(let url): params = [Command.clone.rawValue, url] - case .checkout(let branch, let create): + case .checkout(let branch, let create, let tracking): params = [Command.checkout.rawValue] if create { params.append("-b") } params.append(branch) + if let tracking { + params.append(tracking) + } case .log(let numberOfCommits, let options, let revisions): params = [Command.log.rawValue] if let numberOfCommits = numberOfCommits { @@ -149,7 +157,7 @@ public final class Git: Shell { params = [Command.config.rawValue, "--add", name, value] case .readConfig(let name): params = [Command.config.rawValue, "--get", name] - case .revList(let branch, let count, let revisions): + case .revList(_, let count, let revisions): params = [Command.revList.rawValue] if count { params.append("--count") diff --git a/Tests/GitKitTests/GitKitTests.swift b/Tests/GitKitTests/GitKitTests.swift index 55622da..d268e30 100644 --- a/Tests/GitKitTests/GitKitTests.swift +++ b/Tests/GitKitTests/GitKitTests.swift @@ -25,6 +25,7 @@ final class GitKitTests: XCTestCase { ("testLog", testLog), ("testCommandWithArgs", testCommandWithArgs), ("testClone", testClone), + ("testCheckoutRemoteTracking", testCheckoutRemoteTracking), ("testRevParse", testRevParse), ] @@ -105,9 +106,26 @@ final class GitKitTests: XCTestCase { self.assert(type: "output", result: statusOutput, expected: expectation) } - func testRevParse() throws { + func testCheckoutRemoteTracking() throws { let path = self.currentPath() + try self.clean(path: path) + let git = Git(path: path) + try git.run(.clone(url: "https://github.com/binarybirds/shell-kit.git")) + + let repoPath = "\(path)/shell-kit" + let repoGit = Git(path: repoPath) + + try repoGit.run(.checkout(branch: "feature-branch", create: true, tracking: "origin/main")) + let branchOutput = try repoGit.run(.raw("branch -vv")) + try self.clean(path: path) + + XCTAssertTrue(branchOutput.contains("feature-branch"), "New branch should be created") + XCTAssertTrue(branchOutput.contains("origin/main"), "Branch should track origin/main") + } + + func testRevParse() throws { + let path = self.currentPath() try self.clean(path: path) let git = Git(path: path)