Skip to content

Commit 894ed19

Browse files
committed
Tag target isn't always a GitObject
1 parent adf9c29 commit 894ed19

File tree

4 files changed

+41
-23
lines changed

4 files changed

+41
-23
lines changed

LibGit2Sharp.Tests/FilterBranchFixture.cs

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public void RefRewritingRollsBackOnFailure()
285285
CommitHeaderRewriter =
286286
c => CommitRewriteInfo.From(c, message: ""),
287287
TagNameRewriter =
288-
(n, isA, t) =>
288+
(n, a, t) =>
289289
{
290290
var newRef1 =
291291
repo.Refs.FromGlob(backupNamespace + "*").FirstOrDefault();
@@ -376,7 +376,8 @@ public void CanNotOverWriteAnExistingReference()
376376
() =>
377377
repo.Refs.RewriteHistory(new RewriteHistoryOptions
378378
{
379-
TagNameRewriter = (n, b, t) => "test",
379+
TagNameRewriter =
380+
(n, a, t) => "test",
380381
}, commits)
381382
);
382383

@@ -497,13 +498,12 @@ public void CanProvideNewNamesForTags()
497498
{
498499
CommitHeaderRewriter =
499500
c => CommitRewriteInfo.From(c, message: ""),
500-
TagNameRewriter =
501-
(oldName, isAnnotated, o) => oldName + "_new",
501+
TagNameRewriter = TagNameRewriter,
502502
}, repo.Commits.QueryBy(new CommitFilter { Since = repo.Refs["refs/heads/test"] }));
503503

504-
Assert.NotEqual(lwTarget, repo.Tags["lw_new"].Target);
505-
Assert.NotEqual(e908Target, repo.Tags["e90810b_new"].Target);
506-
Assert.NotEqual(testTarget, repo.Tags["test_new"].Target);
504+
Assert.NotEqual(lwTarget, repo.Tags["lw_new_e90810b"].Target);
505+
Assert.NotEqual(e908Target, repo.Tags["e90810b_new_7b43849"].Target);
506+
Assert.NotEqual(testTarget, repo.Tags["test_new_b25fa35"].Target);
507507
}
508508

509509
[Fact(Skip = "Rewriting of symbolic references is not supported yet")]
@@ -519,8 +519,7 @@ public void CanRewriteSymbolicRefsPointingToTags()
519519
{
520520
CommitHeaderRewriter =
521521
c => CommitRewriteInfo.From(c, author: Constants.Signature),
522-
TagNameRewriter =
523-
(oldName, isAnnotated, o) => oldName + "_new",
522+
TagNameRewriter = TagNameRewriter,
524523
}, repo.Lookup<Commit>("e90810b8df"));
525524

526525
// Ensure the initial tags don't exist anymore...
@@ -532,11 +531,12 @@ public void CanRewriteSymbolicRefsPointingToTags()
532531
Assert.Equal(tagRefName, repo.Refs["refs/original/tags/another_tracker"].TargetIdentifier);
533532

534533
// Ensure the renamed symref tags points to the renamed target
535-
Assert.Equal(tagRefName + "_new", repo.Refs["refs/tags/one_tracker_new"].TargetIdentifier);
536-
Assert.Equal(tagRefName + "_new", repo.Refs["refs/tags/another_tracker_new"].TargetIdentifier);
534+
const string renamedTarget = "refs/tags/test_new_b25fa35";
535+
Assert.Equal(renamedTarget, repo.Refs["refs/tags/one_tracker_new_test"].TargetIdentifier);
536+
Assert.Equal(renamedTarget, repo.Refs["refs/tags/another_tracker_new_test"].TargetIdentifier);
537537

538538
// Ensure that the non tag symref points to a renamed target...
539-
Assert.Equal("refs/tags/another_tracker_new", repo.Refs["refs/attic/dusty_tracker"].TargetIdentifier);
539+
Assert.Equal("refs/tags/another_tracker_new_test", repo.Refs["refs/attic/dusty_tracker"].TargetIdentifier);
540540

541541
// ...and has been backed up as well.
542542
Assert.Equal("refs/tags/another_tracker", repo.Refs["refs/original/attic/dusty_tracker"].TargetIdentifier);
@@ -556,26 +556,26 @@ public void HandlesNameRewritingOfChainedTags()
556556
repo.Refs.RewriteHistory(new RewriteHistoryOptions
557557
{
558558
BackupRefsNamespace = "refs/original/",
559-
CommitHeaderRewriter = c => CommitRewriteInfo.From(c, message: "Rewrote"),
560-
TagNameRewriter = (oldName, isAnnoted, newTarget) =>
561-
isAnnoted ? oldName + "_ann" : oldName + "_lw",
559+
CommitHeaderRewriter =
560+
c => CommitRewriteInfo.From(c, message: "Rewrote"),
561+
TagNameRewriter = TagNameRewriter,
562562
}, repo.Lookup<Commit>("6dcf9bf"));
563563

564564
// Verify the rewritten tag-annotation chain
565-
var newTagA = repo.Tags["lightweightA_lw"];
565+
var newTagA = repo.Tags["lightweightA_new_d53d92e"];
566566
Assert.NotNull(newTagA);
567567
Assert.NotEqual(newTagA, tagA);
568568
Assert.True(newTagA.IsAnnotated);
569569

570570
var newAnnotationB = newTagA.Annotation;
571571
Assert.NotNull(newAnnotationB);
572572
Assert.NotEqual(newAnnotationB, annotationB);
573-
Assert.Equal("annotationB_ann", newAnnotationB.Name);
573+
Assert.Equal("annotationB_ann_237c1b0", newAnnotationB.Name);
574574

575575
var newAnnotationC = newAnnotationB.Target as TagAnnotation;
576576
Assert.NotNull(newAnnotationC);
577577
Assert.NotEqual(newAnnotationC, annotationC);
578-
Assert.Equal("annotationC_ann", newAnnotationC.Name);
578+
Assert.Equal("annotationC_ann_6dcf9bf", newAnnotationC.Name);
579579

580580
var newCommit = newAnnotationC.Target as Commit;
581581
Assert.NotNull(newCommit);
@@ -590,5 +590,17 @@ public void HandlesNameRewritingOfChainedTags()
590590
Assert.NotNull(backedUpTag);
591591
Assert.Equal(annotationB, backedUpTag.ResolveToDirectReference().Target);
592592
}
593+
594+
private static string TagNameRewriter(string name, bool isAnnotated, string target)
595+
{
596+
const string tagPrefix = "refs/tags/";
597+
var t = target == null
598+
? ""
599+
: target.StartsWith(tagPrefix)
600+
? target.Substring(tagPrefix.Length)
601+
: target.Substring(0, 7);
602+
603+
return name + (isAnnotated ? "_ann_" : "_new_") + t;
604+
}
593605
}
594606
}

LibGit2Sharp/Core/HistoryRewriter.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ private void RewriteReference(DirectReference oldRef)
9999
if (oldRef.IsTag() && options.TagNameRewriter != null)
100100
{
101101
newRefName = Reference.TagPrefix +
102-
options.TagNameRewriter(oldRef.CanonicalName.Substring(Reference.TagPrefix.Length), false, oldRef.Target);
102+
options.TagNameRewriter(oldRef.CanonicalName.Substring(Reference.TagPrefix.Length),
103+
false, oldRef.TargetIdentifier);
103104
}
104105

105106
var newTarget = RewriteTarget(oldRef.Target);
@@ -238,7 +239,7 @@ private GitObject RewriteTarget(GitObject oldTarget)
238239

239240
if (options.TagNameRewriter != null)
240241
{
241-
newName = options.TagNameRewriter(annotation.Name, true, annotation.Target);
242+
newName = options.TagNameRewriter(annotation.Name, true, annotation.Target.Sha);
242243
}
243244

244245
var newAnnotation = repo.ObjectDatabase.CreateTagAnnotation(newName, newTarget, annotation.Tagger,

LibGit2Sharp/ReferenceCollection.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,9 @@ public virtual void RewriteHistory(
360360
? default(Func<Commit, IEnumerable<Commit>>)
361361
: (c => commitParentsRewriter(c.Parents)),
362362
CommitTreeRewriter = commitTreeRewriter,
363-
TagNameRewriter = tagNameRewriter,
363+
TagNameRewriter = tagNameRewriter == null
364+
? default(Func<string, bool, string, string>)
365+
: (n, a, t) => tagNameRewriter(n, a, repo.Lookup(t)),
364366
}, commitsToRewrite);
365367
}
366368

LibGit2Sharp/RewriteHistoryOptions.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@ public RewriteHistoryOptions()
3838
public Func<Commit, TreeDefinition> CommitTreeRewriter { get; set; }
3939

4040
/// <summary>
41-
/// Rewriter for tag names. This is called with (OldTag.Name, OldTag.IsAnnotated, OldTarget).
41+
/// Rewriter for tag names. This is called with
42+
/// (OldTag.Name, OldTag.IsAnnotated, OldTarget.Identifier).
43+
/// OldTarget.Identifier is either the SHA of a direct reference,
44+
/// or the canonical name of a symbolic reference.
4245
/// </summary>
43-
public Func<String, bool, GitObject, string> TagNameRewriter { get; set; }
46+
public Func<string, bool, string, string> TagNameRewriter { get; set; }
4447

4548
/// <summary>
4649
/// Empty commits should be removed while rewriting.

0 commit comments

Comments
 (0)