From edb898c450d9ea2b902c11e0becbf1ee3f1f9605 Mon Sep 17 00:00:00 2001 From: Joseph Kingry Date: Fri, 16 Feb 2018 10:13:17 -0500 Subject: [PATCH] Filter list of all tags first by those parsable to a semantic version - reduces `Getting version tags from branch` time for our repository from a 100 seconds to 2.5 seconds --- src/GitVersionCore/GitRepoMetadataProvider.cs | 18 +++++------ .../TaggedCommitVersionStrategy.cs | 32 ++++++++++++------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/GitVersionCore/GitRepoMetadataProvider.cs b/src/GitVersionCore/GitRepoMetadataProvider.cs index fcf4441e89..b60829ab67 100644 --- a/src/GitVersionCore/GitRepoMetadataProvider.cs +++ b/src/GitVersionCore/GitRepoMetadataProvider.cs @@ -34,19 +34,17 @@ public IEnumerable GetVersionTagsOnBranch(Branch branch, string using (Logger.IndentLog(string.Format("Getting version tags from branch '{0}'.", branch.CanonicalName))) { - var tags = this.Repository.Tags.Select(t => t).ToList(); - - var versionTags = this.Repository.Commits.QueryBy(new CommitFilter - { - IncludeReachableFrom = branch.Tip - }) - .SelectMany(c => tags.Where(t => c.Sha == t.Target.Sha).SelectMany(t => + var tags = new List>(); + foreach(var t in this.Repository.Tags) { SemanticVersion semver; if (SemanticVersion.TryParse(t.FriendlyName, tagPrefixRegex, out semver)) - return new[] { semver }; - return new SemanticVersion[0]; - })).ToList(); + { + tags.Add(Tuple.Create(t, semver)); + } + } + + var versionTags = branch.Commits.SelectMany(c => tags.Where(t => c.Sha == t.Item1.Target.Sha).Select(t => t.Item2)).ToList(); semanticVersionTagsOnBranchCache.Add(branch, versionTags); return versionTags; diff --git a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs index 4955be0203..332862923e 100644 --- a/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs +++ b/src/GitVersionCore/VersionCalculation/BaseVersionCalculators/TaggedCommitVersionStrategy.cs @@ -19,21 +19,31 @@ public override IEnumerable GetVersions(GitVersionContext context) public IEnumerable GetTaggedVersions(GitVersionContext context, Branch currentBranch, DateTimeOffset? olderThan) { - var allTags = context.Repository.Tags - .Where(tag => !olderThan.HasValue || ((Commit) tag.PeeledTarget()).When() <= olderThan.Value) - .ToList(); + var allTags = new List>(); + foreach(var tag in context.Repository.Tags) + { + if (olderThan.HasValue && ((Commit)tag.PeeledTarget()).When() > olderThan.Value) + continue; + + SemanticVersion version; + + if (!SemanticVersion.TryParse(tag.FriendlyName, context.Configuration.GitTagPrefix, out version)) + { + continue; + } + + allTags.Add(Tuple.Create(tag, version)); + } + var tagsOnBranch = currentBranch .Commits - .SelectMany(commit => { return allTags.Where(t => IsValidTag(t, commit)); }) + .SelectMany(commit => { return allTags.Where(t => IsValidTag(t.Item1, commit)); }) .Select(t => { - SemanticVersion version; - if (SemanticVersion.TryParse(t.FriendlyName, context.Configuration.GitTagPrefix, out version)) - { - var commit = t.PeeledTarget() as Commit; - if (commit != null) - return new VersionTaggedCommit(commit, version, t.FriendlyName); - } + var commit = t.Item1.PeeledTarget() as Commit; + if (commit != null) + return new VersionTaggedCommit(commit, t.Item2, t.Item1.FriendlyName); + return null; }) .Where(a => a != null)