Skip to content

Commit 31411e9

Browse files
authored
Merge pull request #1374 from jkingry/feature/tag-performance
Improve performance - Filter list of all tags first by those parsable to a semantic version
2 parents 95f8f0f + 4689d6d commit 31411e9

File tree

2 files changed

+29
-21
lines changed

2 files changed

+29
-21
lines changed

src/GitVersionCore/GitRepoMetadataProvider.cs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,17 @@ public IEnumerable<SemanticVersion> GetVersionTagsOnBranch(Branch branch, string
3434

3535
using (Logger.IndentLog(string.Format("Getting version tags from branch '{0}'.", branch.CanonicalName)))
3636
{
37-
var tags = this.Repository.Tags.Select(t => t).ToList();
38-
39-
var versionTags = this.Repository.Commits.QueryBy(new CommitFilter
40-
{
41-
IncludeReachableFrom = branch.Tip
42-
})
43-
.SelectMany(c => tags.Where(t => c.Sha == t.Target.Sha).SelectMany(t =>
37+
var tags = new List<Tuple<Tag, SemanticVersion>>();
38+
foreach(var t in this.Repository.Tags)
4439
{
4540
SemanticVersion semver;
4641
if (SemanticVersion.TryParse(t.FriendlyName, tagPrefixRegex, out semver))
47-
return new[] { semver };
48-
return new SemanticVersion[0];
49-
})).ToList();
42+
{
43+
tags.Add(Tuple.Create(t, semver));
44+
}
45+
}
46+
47+
var versionTags = branch.Commits.SelectMany(c => tags.Where(t => c.Sha == t.Item1.Target.Sha).Select(t => t.Item2)).ToList();
5048

5149
semanticVersionTagsOnBranchCache.Add(branch, versionTags);
5250
return versionTags;

src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,31 @@ public override IEnumerable<BaseVersion> GetVersions(GitVersionContext context)
1919

2020
public IEnumerable<BaseVersion> GetTaggedVersions(GitVersionContext context, Branch currentBranch, DateTimeOffset? olderThan)
2121
{
22-
var allTags = context.Repository.Tags
23-
.Where(tag => !olderThan.HasValue || ((Commit) tag.PeeledTarget()).When() <= olderThan.Value)
24-
.ToList();
22+
var allTags = new List<Tuple<Tag, SemanticVersion>>();
23+
foreach(var tag in context.Repository.Tags)
24+
{
25+
if (olderThan.HasValue && ((Commit)tag.PeeledTarget()).When() > olderThan.Value)
26+
continue;
27+
28+
SemanticVersion version;
29+
30+
if (!SemanticVersion.TryParse(tag.FriendlyName, context.Configuration.GitTagPrefix, out version))
31+
{
32+
continue;
33+
}
34+
35+
allTags.Add(Tuple.Create(tag, version));
36+
}
37+
2538
var tagsOnBranch = currentBranch
2639
.Commits
27-
.SelectMany(commit => { return allTags.Where(t => IsValidTag(t, commit)); })
40+
.SelectMany(commit => { return allTags.Where(t => IsValidTag(t.Item1, commit)); })
2841
.Select(t =>
2942
{
30-
SemanticVersion version;
31-
if (SemanticVersion.TryParse(t.FriendlyName, context.Configuration.GitTagPrefix, out version))
32-
{
33-
var commit = t.PeeledTarget() as Commit;
34-
if (commit != null)
35-
return new VersionTaggedCommit(commit, version, t.FriendlyName);
36-
}
43+
var commit = t.Item1.PeeledTarget() as Commit;
44+
if (commit != null)
45+
return new VersionTaggedCommit(commit, t.Item2, t.Item1.FriendlyName);
46+
3747
return null;
3848
})
3949
.Where(a => a != null)

0 commit comments

Comments
 (0)