Skip to content

Commit a66d8ff

Browse files
jamillnulltoken
authored andcommitted
Checkout is not allowed in a bare repository
1 parent c05fc29 commit a66d8ff

File tree

3 files changed

+45
-23
lines changed

3 files changed

+45
-23
lines changed

LibGit2Sharp.Tests/BranchFixture.cs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -421,17 +421,17 @@ public void CanWalkCommitsFromBranch()
421421
}
422422

423423
[Theory]
424-
[InlineData("test")]
425-
[InlineData("refs/heads/test")]
426-
public void CanCheckoutAnExistingBranch(string name)
424+
[InlineData("i-do-numbers")]
425+
[InlineData("diff-test-cases")]
426+
public void CanCheckoutAnExistingBranch(string branchName)
427427
{
428-
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo();
428+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo(StandardTestRepoWorkingDirPath);
429429
using (var repo = new Repository(path.RepositoryPath))
430430
{
431431
Branch master = repo.Branches["master"];
432432
Assert.True(master.IsCurrentRepositoryHead);
433433

434-
Branch branch = repo.Branches[name];
434+
Branch branch = repo.Branches[branchName];
435435
Assert.NotNull(branch);
436436

437437
Branch test = repo.Checkout(branch);
@@ -446,17 +446,17 @@ public void CanCheckoutAnExistingBranch(string name)
446446
}
447447

448448
[Theory]
449-
[InlineData("test")]
450-
[InlineData("refs/heads/test")]
451-
public void CanCheckoutAnExistingBranchByName(string name)
449+
[InlineData("i-do-numbers")]
450+
[InlineData("diff-test-cases")]
451+
public void CanCheckoutAnExistingBranchByName(string branchName)
452452
{
453-
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo();
453+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo(StandardTestRepoWorkingDirPath);
454454
using (var repo = new Repository(path.RepositoryPath))
455455
{
456456
Branch master = repo.Branches["master"];
457457
Assert.True(master.IsCurrentRepositoryHead);
458458

459-
Branch test = repo.Checkout(name);
459+
Branch test = repo.Checkout(branchName);
460460
Assert.False(repo.Info.IsHeadDetached);
461461

462462
Assert.False(test.IsRemote);
@@ -472,33 +472,43 @@ public void CanCheckoutAnExistingBranchByName(string name)
472472
[InlineData("refs/tags/lw")]
473473
public void CanCheckoutAnArbitraryCommit(string commitPointer)
474474
{
475-
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo();
475+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo(StandardTestRepoWorkingDirPath);
476476
using (var repo = new Repository(path.RepositoryPath))
477477
{
478478
Branch master = repo.Branches["master"];
479479
Assert.True(master.IsCurrentRepositoryHead);
480480

481481
Branch detachedHead = repo.Checkout(commitPointer);
482482

483+
Assert.Equal(repo.Head, detachedHead);
484+
Assert.Equal(repo.Lookup(commitPointer).Sha, detachedHead.Tip.Sha);
485+
Assert.True(repo.Head.IsCurrentRepositoryHead);
483486
Assert.True(repo.Info.IsHeadDetached);
484487

488+
Assert.True(detachedHead.IsCurrentRepositoryHead);
485489
Assert.False(detachedHead.IsRemote);
486490
Assert.Equal(detachedHead.Name, detachedHead.CanonicalName);
487-
Assert.Equal("(no branch)", detachedHead.CanonicalName);
488-
Assert.Equal(repo.Lookup(commitPointer).Sha, detachedHead.Tip.Sha);
489491

490-
Assert.Equal(repo.Head, detachedHead);
492+
Assert.Equal("(no branch)", detachedHead.CanonicalName);
491493

492494
Assert.False(master.IsCurrentRepositoryHead);
493-
Assert.True(detachedHead.IsCurrentRepositoryHead);
494-
Assert.True(repo.Head.IsCurrentRepositoryHead);
495495
}
496496
}
497497

498498
[Fact]
499-
public void CheckingOutANonExistingBranchThrows()
499+
public void CheckingOutInABareRepoThrows()
500500
{
501501
using (var repo = new Repository(BareTestRepoPath))
502+
{
503+
Assert.Throws<InvalidOperationException>(() => repo.Checkout(repo.Branches["refs/heads/test"]));
504+
Assert.Throws<InvalidOperationException>(() => repo.Checkout("refs/heads/test"));
505+
}
506+
}
507+
508+
[Fact]
509+
public void CheckingOutANonExistingBranchThrows()
510+
{
511+
using (var repo = new Repository(StandardTestRepoWorkingDirPath))
502512
{
503513
Assert.Throws<LibGit2SharpException>(() => repo.Checkout("i-do-not-exist"));
504514
}
@@ -507,7 +517,7 @@ public void CheckingOutANonExistingBranchThrows()
507517
[Fact]
508518
public void CheckingOutABranchWithBadParamsThrows()
509519
{
510-
using (var repo = new Repository(BareTestRepoPath))
520+
using (var repo = new Repository(StandardTestRepoWorkingDirPath))
511521
{
512522
Assert.Throws<ArgumentException>(() => repo.Checkout(string.Empty));
513523
Assert.Throws<ArgumentNullException>(() => repo.Checkout(default(Branch)));

LibGit2Sharp.Tests/CommitFixture.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,16 @@ public void CanCountCommits()
2525
[Fact]
2626
public void CanCorrectlyCountCommitsWhenSwitchingToAnotherBranch()
2727
{
28-
using (var repo = new Repository(BareTestRepoPath))
28+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo(StandardTestRepoWorkingDirPath);
29+
using (var repo = new Repository(path.RepositoryPath))
2930
{
3031
repo.Checkout("test");
3132
Assert.Equal(2, repo.Commits.Count());
3233
Assert.Equal("e90810b8df3e80c413d903f631643c716887138d", repo.Commits.First().Id.Sha);
3334

3435
repo.Checkout("master");
35-
Assert.Equal(7, repo.Commits.Count());
36-
Assert.Equal("4c062a6361ae6959e06292c1fa5e2822d9c96345", repo.Commits.First().Id.Sha);
36+
Assert.Equal(9, repo.Commits.Count());
37+
Assert.Equal("32eab9cb1f450b5fe7ab663462b77d7f4b703344", repo.Commits.First().Id.Sha);
3738
}
3839
}
3940

@@ -221,7 +222,7 @@ public void CanEnumerateFromHead()
221222
[Fact]
222223
public void CanEnumerateFromDetachedHead()
223224
{
224-
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo();
225+
TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo(StandardTestRepoWorkingDirPath);
225226
using (var repoClone = new Repository(path.RepositoryPath))
226227
{
227228
string headSha = repoClone.Head.Tip.Sha;
@@ -231,7 +232,8 @@ public void CanEnumerateFromDetachedHead()
231232
repo => new Filter { Since = repo.Head },
232233
new[]
233234
{
234-
"4c062a6", "be3563a", "c47800c", "9fd738e",
235+
"32eab9c", "592d3c8", "4c062a6",
236+
"be3563a", "c47800c", "9fd738e",
235237
"4a202b3", "5b5b025", "8496071",
236238
});
237239
}

LibGit2Sharp/Repository.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,11 @@ public static string Discover(string startingPath)
404404
/// <returns>The new HEAD.</returns>
405405
public Branch Checkout(string commitOrBranchSpec)
406406
{
407+
if (Info.IsBare)
408+
{
409+
throw new InvalidOperationException("Checkout is not allowed in a bare repository.");
410+
}
411+
407412
// TODO: This does not yet checkout (write) the working directory
408413

409414
var branch = Branches[commitOrBranchSpec];
@@ -427,6 +432,11 @@ public Branch Checkout(Branch branch)
427432
{
428433
Ensure.ArgumentNotNull(branch, "branch");
429434

435+
if (Info.IsBare)
436+
{
437+
throw new InvalidOperationException("Checkout is not allowed in a bare repository.");
438+
}
439+
430440
Refs.UpdateTarget("HEAD", branch.CanonicalName);
431441
return branch;
432442
}

0 commit comments

Comments
 (0)