Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cache merge base #1106

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
41 changes: 26 additions & 15 deletions src/GitVersionCore/GitRepoMetadataProvider.cs
Expand Up @@ -27,24 +27,29 @@ public IEnumerable<SemanticVersion> GetVersionTagsOnBranch(Branch branch, IRepos
{
if (semanticVersionTagsOnBranchCache.ContainsKey(branch))
{
Logger.WriteDebug(string.Format("Cache hit for version tags on branch '{0}", branch.CanonicalName));
return semanticVersionTagsOnBranchCache[branch];
}
var tags = repository.Tags.Select(t => t).ToList();

var versionTags = repository.Commits.QueryBy(new CommitFilter
using (Logger.IndentLog(string.Format("Getting version tags from branch '{0}'.", branch.CanonicalName)))
{
IncludeReachableFrom = branch.Tip
})
.SelectMany(c => tags.Where(t => c.Sha == t.Target.Sha).SelectMany(t =>
{
SemanticVersion semver;
if (SemanticVersion.TryParse(t.FriendlyName, tagPrefixRegex, out semver))
return new[] { semver };
return new SemanticVersion[0];
})).ToList();

semanticVersionTagsOnBranchCache.Add(branch, versionTags);
return versionTags;
var tags = repository.Tags.Select(t => t).ToList();

var versionTags = repository.Commits.QueryBy(new CommitFilter
{
IncludeReachableFrom = branch.Tip
})
.SelectMany(c => tags.Where(t => c.Sha == t.Target.Sha).SelectMany(t =>
{
SemanticVersion semver;
if (SemanticVersion.TryParse(t.FriendlyName, tagPrefixRegex, out semver))
return new[] { semver };
return new SemanticVersion[0];
})).ToList();

semanticVersionTagsOnBranchCache.Add(branch, versionTags);
return versionTags;
}
}

// TODO Should we cache this?
Expand All @@ -54,7 +59,7 @@ public IEnumerable<Branch> GetBranchesContainingCommit([NotNull] Commit commit,
{
throw new ArgumentNullException("commit");
}

Logger.WriteDebug("Heh");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test logging?

using (Logger.IndentLog(string.Format("Getting branches containing the commit '{0}'.", commit.Id)))
{
var directBranchHasBeenFound = false;
Expand Down Expand Up @@ -108,6 +113,9 @@ public Commit FindMergeBase(Branch branch, Branch otherBranch, IRepository repos

if (mergeBaseCache.ContainsKey(key))
{
Logger.WriteDebug(string.Format(
"Cache hit for merge base between '{0}' and '{1}'.",
branch.FriendlyName, otherBranch.FriendlyName));
return mergeBaseCache[key].MergeBase;
}

Expand Down Expand Up @@ -183,6 +191,9 @@ List<BranchCommit> GetMergeCommitsForBranch(Branch branch)
{
if (mergeBaseCommitsCache.ContainsKey(branch))
{
Logger.WriteDebug(string.Format(
"Cache hit for getting merge commits for branch {0}.",
branch.CanonicalName));
return mergeBaseCommitsCache[branch];
}

Expand Down
10 changes: 9 additions & 1 deletion src/GitVersionCore/GitVersionCacheKeyFactory.cs
Expand Up @@ -123,7 +123,15 @@ static List<string> CalculateDirectoryContents(string root)

private static string GetRepositorySnapshotHash(GitPreparer gitPreparer)
{
var repositorySnapshot = gitPreparer.WithRepository(repo => string.Join(":", repo.Head.CanonicalName, repo.Head.Tip.Sha));
var repositorySnapshot = gitPreparer.WithRepository(repo => {
var head = repo.Head;
if (head.Tip == null)
{
return head.CanonicalName;
}
var hash = string.Join(":", head.CanonicalName, head.Tip.Sha);
return hash;
});
return GetHash(repositorySnapshot);
}

Expand Down
5 changes: 4 additions & 1 deletion src/GitVersionCore/GitVersionFinder.cs
Expand Up @@ -8,7 +8,10 @@ public class GitVersionFinder
{
public SemanticVersion FindVersion(GitVersionContext context)
{
Logger.WriteInfo(string.Format("Running against branch: {0} ({1})", context.CurrentBranch.FriendlyName, context.CurrentCommit.Sha));
Logger.WriteInfo(string.Format(
"Running against branch: {0} ({1})",
context.CurrentBranch.FriendlyName,
context.CurrentCommit == null ? "-" : context.CurrentCommit.Sha));
EnsureMainTopologyConstraints(context);

var filePath = Path.Combine(context.Repository.GetRepositoryDirectory(), "NextVersion.txt");
Expand Down
1 change: 1 addition & 0 deletions src/GitVersionTask.Tests/GitVersionTaskDirectoryTests.cs
Expand Up @@ -61,6 +61,7 @@ public void Finds_GitDirectory_In_Parent()
}
catch (Exception ex)
{
// TODO I think this test is wrong.. It throws a different exception
// `RepositoryNotFoundException` means that it couldn't find the .git directory,
// any other exception means that the .git was found but there was some other issue that this test doesn't care about.
Assert.IsNotAssignableFrom<RepositoryNotFoundException>(ex);
Expand Down