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
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2014-2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import Basics
import SourceControl
import SPMTestSupport
import XCTest
class InMemoryGitRepositoryTests: XCTestCase {
func testBasics() throws {
let fs = InMemoryFileSystem()
let repo = InMemoryGitRepository(path: .root, fs: fs)
try repo.createDirectory("/new-dir/subdir", recursive: true)
XCTAssertTrue(!repo.hasUncommittedChanges())
let filePath = AbsolutePath("/new-dir/subdir").appending("new-file.txt")
try repo.writeFileContents(filePath, bytes: "one")
XCTAssertEqual(try repo.readFileContents(filePath), "one")
XCTAssertTrue(repo.hasUncommittedChanges())
let firstCommit = try repo.commit()
XCTAssertTrue(!repo.hasUncommittedChanges())
XCTAssertEqual(try repo.readFileContents(filePath), "one")
XCTAssertEqual(try fs.readFileContents(filePath), "one")
try repo.writeFileContents(filePath, bytes: "two")
XCTAssertEqual(try repo.readFileContents(filePath), "two")
XCTAssertTrue(repo.hasUncommittedChanges())
let secondCommit = try repo.commit()
XCTAssertTrue(!repo.hasUncommittedChanges())
XCTAssertEqual(try repo.readFileContents(filePath), "two")
try repo.writeFileContents(filePath, bytes: "three")
XCTAssertTrue(repo.hasUncommittedChanges())
XCTAssertEqual(try repo.readFileContents(filePath), "three")
try repo.checkout(revision: firstCommit)
XCTAssertTrue(!repo.hasUncommittedChanges())
XCTAssertEqual(try repo.readFileContents(filePath), "one")
XCTAssertEqual(try fs.readFileContents(filePath), "one")
try repo.checkout(revision: secondCommit)
XCTAssertTrue(!repo.hasUncommittedChanges())
XCTAssertEqual(try repo.readFileContents(filePath), "two")
XCTAssert(try repo.getTags().isEmpty)
try repo.tag(name: "2.0.0")
XCTAssertEqual(try repo.getTags(), ["2.0.0"])
XCTAssertTrue(!repo.hasUncommittedChanges())
XCTAssertEqual(try repo.readFileContents(filePath), "two")
XCTAssertEqual(try fs.readFileContents(filePath), "two")
try repo.checkout(revision: firstCommit)
XCTAssertTrue(!repo.hasUncommittedChanges())
XCTAssertEqual(try repo.readFileContents(filePath), "one")
try repo.checkout(tag: "2.0.0")
XCTAssertTrue(!repo.hasUncommittedChanges())
XCTAssertEqual(try repo.readFileContents(filePath), "two")
}
func testProvider() throws {
let v1 = "1.0.0"
let v2 = "2.0.0"
let repo = InMemoryGitRepository(path: .root, fs: InMemoryFileSystem())
let specifier = RepositorySpecifier(path: "/Foo")
try repo.createDirectory("/new-dir/subdir", recursive: true)
let filePath = AbsolutePath("/new-dir/subdir").appending("new-file.txt")
try repo.writeFileContents(filePath, bytes: "one")
try repo.commit()
try repo.tag(name: v1)
try repo.writeFileContents(filePath, bytes: "two")
try repo.commit()
try repo.tag(name: v2)
let provider = InMemoryGitRepositoryProvider()
provider.add(specifier: specifier, repository: repo)
let fooRepoPath = AbsolutePath("/fooRepo")
try provider.fetch(repository: specifier, to: fooRepoPath)
let fooRepo = try provider.open(repository: specifier, at: fooRepoPath)
// Adding a new tag in original repo shouldn't show up in fetched repo.
try repo.tag(name: "random")
XCTAssertEqual(try fooRepo.getTags().sorted(), [v1, v2])
XCTAssert(fooRepo.exists(revision: try fooRepo.resolveRevision(tag: v1)))
let fooCheckoutPath = AbsolutePath("/fooCheckout")
XCTAssertFalse(try provider.workingCopyExists(at: fooCheckoutPath))
_ = try provider.createWorkingCopy(repository: specifier, sourcePath: fooRepoPath, at: fooCheckoutPath, editable: false)
XCTAssertTrue(try provider.workingCopyExists(at: fooCheckoutPath))
let fooCheckout = try provider.openWorkingCopy(at: fooCheckoutPath)
XCTAssertEqual(try fooCheckout.getTags().sorted(), [v1, v2])
XCTAssert(fooCheckout.exists(revision: try fooCheckout.getCurrentRevision()))
let checkoutRepo = try provider.openRepo(at: fooCheckoutPath)
try fooCheckout.checkout(tag: v1)
XCTAssertEqual(try checkoutRepo.readFileContents(filePath), "one")
try fooCheckout.checkout(tag: v2)
XCTAssertEqual(try checkoutRepo.readFileContents(filePath), "two")
}
}
|