Skip to content

Commit 6ea8b4c

Browse files
committed
moved libgit2sharp specific queries to LibGitExtensions class
1 parent 808f50e commit 6ea8b4c

File tree

6 files changed

+120
-69
lines changed

6 files changed

+120
-69
lines changed

src/GitVersionCore/Extensions/LibGitExtensions.cs

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Linq;
55
using System.Text;
66
using GitVersion.Helpers;
7+
using GitVersion.VersionCalculation;
78
using LibGit2Sharp;
89

910
namespace GitVersion.Extensions
@@ -98,6 +99,113 @@ public static Branch FindBranch(this IRepository repository, string branchName)
9899
return repository.Branches.FirstOrDefault(x => x.NameWithoutRemote() == branchName);
99100
}
100101

102+
public static Commit GetBaseVersionSource(this IRepository repository, Commit currentBranchTip)
103+
{
104+
var baseVersionSource = repository.Commits.QueryBy(new CommitFilter
105+
{
106+
IncludeReachableFrom = currentBranchTip
107+
}).First(c => !c.Parents.Any());
108+
return baseVersionSource;
109+
}
110+
111+
public static List<Commit> GetCommitsReacheableFromHead(this IRepository repository, Commit headCommit)
112+
{
113+
var filter = new CommitFilter
114+
{
115+
IncludeReachableFrom = headCommit,
116+
SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Reverse
117+
};
118+
119+
var commitCache = repository.Commits.QueryBy(filter).ToList();
120+
return commitCache;
121+
}
122+
123+
public static Commit GetForwardMerge(this IRepository repository, Commit commitToFindCommonBase, Commit findMergeBase)
124+
{
125+
var forwardMerge = repository.Commits
126+
.QueryBy(new CommitFilter
127+
{
128+
IncludeReachableFrom = commitToFindCommonBase,
129+
ExcludeReachableFrom = findMergeBase
130+
})
131+
.FirstOrDefault(c => c.Parents.Contains(findMergeBase));
132+
return forwardMerge;
133+
}
134+
135+
public static IEnumerable<Commit> GetCommitsReacheableFrom(this IRepository repository, Commit commit, Branch branch)
136+
{
137+
var commits = repository.Commits.QueryBy(new CommitFilter
138+
{
139+
IncludeReachableFrom = branch
140+
}).Where(c => c.Sha == commit.Sha);
141+
return commits;
142+
}
143+
144+
public static ICommitLog GetCommitLog(this IRepository repository, Commit baseVersionSource, Commit currentCommit)
145+
{
146+
var filter = new CommitFilter
147+
{
148+
IncludeReachableFrom = currentCommit,
149+
ExcludeReachableFrom = baseVersionSource,
150+
SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time
151+
};
152+
153+
var commitLog = repository.Commits.QueryBy(filter);
154+
return commitLog;
155+
}
156+
157+
public static List<Commit> GetMainlineCommitLog(this IRepository repository, BaseVersion baseVersion, Commit mainlineTip)
158+
{
159+
var mainlineCommitLog = repository.Commits.QueryBy(new CommitFilter
160+
{
161+
IncludeReachableFrom = mainlineTip,
162+
ExcludeReachableFrom = baseVersion.BaseVersionSource,
163+
SortBy = CommitSortStrategies.Reverse,
164+
FirstParentOnly = true
165+
})
166+
.ToList();
167+
return mainlineCommitLog;
168+
}
169+
170+
public static List<Commit> GetMainlineCommitLog(this IRepository repository, Commit baseVersionSource, Branch mainline)
171+
{
172+
var mainlineCommitLog = repository.Commits
173+
.QueryBy(new CommitFilter
174+
{
175+
IncludeReachableFrom = mainline.Tip,
176+
ExcludeReachableFrom = baseVersionSource,
177+
SortBy = CommitSortStrategies.Reverse,
178+
FirstParentOnly = true
179+
})
180+
.ToList();
181+
return mainlineCommitLog;
182+
}
183+
184+
public static bool GetMatchingCommitBranch(this IRepository repository, Commit baseVersionSource, Branch branch, Commit firstMatchingCommit)
185+
{
186+
var filter = new CommitFilter
187+
{
188+
IncludeReachableFrom = branch,
189+
ExcludeReachableFrom = baseVersionSource,
190+
FirstParentOnly = true,
191+
};
192+
var query = repository.Commits.QueryBy(filter);
193+
194+
return query.Contains(firstMatchingCommit);
195+
}
196+
public static List<Commit> GetMergeBaseCommits(this IRepository repository, Commit mergeCommit, Commit mergedHead, Commit findMergeBase)
197+
{
198+
var filter = new CommitFilter
199+
{
200+
IncludeReachableFrom = mergedHead,
201+
ExcludeReachableFrom = findMergeBase
202+
};
203+
var query = repository.Commits.QueryBy(filter);
204+
205+
var commits = mergeCommit == null ? query.ToList() : new[] { mergeCommit }.Union(query).ToList();
206+
return commits;
207+
}
208+
101209
public static void DumpGraph(this IRepository repository, Action<string> writer = null, int? maxCommits = null)
102210
{
103211
DumpGraph(repository.Info.Path, writer, maxCommits);

src/GitVersionCore/GitRepoMetadataProvider.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,7 @@ public IEnumerable<Branch> GetBranchesContainingCommit(Commit commit, IList<Bran
101101
{
102102
log.Info($"Searching for commits reachable from '{branch.FriendlyName}'.");
103103

104-
var commits = Repository.Commits.QueryBy(new CommitFilter
105-
{
106-
IncludeReachableFrom = branch
107-
}).Where(c => c.Sha == commit.Sha);
104+
var commits = Repository.GetCommitsReacheableFrom(commit, branch);
108105

109106
if (!commits.Any())
110107
{
@@ -118,6 +115,7 @@ public IEnumerable<Branch> GetBranchesContainingCommit(Commit commit, IList<Bran
118115
}
119116
}
120117

118+
121119
/// <summary>
122120
/// Find the merge base of the two branches, i.e. the best common ancestor of the two branches' tips.
123121
/// </summary>
@@ -150,13 +148,7 @@ public Commit FindMergeBase(Branch branch, Branch otherBranch)
150148
do
151149
{
152150
// Now make sure that the merge base is not a forward merge
153-
forwardMerge = Repository.Commits
154-
.QueryBy(new CommitFilter
155-
{
156-
IncludeReachableFrom = commitToFindCommonBase,
157-
ExcludeReachableFrom = findMergeBase
158-
})
159-
.FirstOrDefault(c => c.Parents.Contains(findMergeBase));
151+
forwardMerge = Repository.GetForwardMerge(commitToFindCommonBase, findMergeBase);
160152

161153
if (forwardMerge != null)
162154
{

src/GitVersionCore/VersionCalculation/BaseVersionCalculators/FallbackVersionStrategy.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.Collections.Generic;
2-
using System.Linq;
32
using GitVersion.Exceptions;
3+
using GitVersion.Extensions;
44
using LibGit2Sharp;
55

66
namespace GitVersion.VersionCalculation
@@ -19,10 +19,8 @@ public virtual IEnumerable<BaseVersion> GetVersions(GitVersionContext context)
1919

2020
try
2121
{
22-
baseVersionSource = context.Repository.Commits.QueryBy(new CommitFilter
23-
{
24-
IncludeReachableFrom = currentBranchTip
25-
}).First(c => !c.Parents.Any());
22+
var contextRepository = context.Repository;
23+
baseVersionSource = contextRepository.GetBaseVersionSource(currentBranchTip);
2624
}
2725
catch (NotFoundException exception)
2826
{

src/GitVersionCore/VersionCalculation/IncrementStrategyFinder.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,7 @@ private static IEnumerable<Commit> GetIntermediateCommits(IRepository repo, GitO
112112

113113
if (commitCache == null || commitCache.LastOrDefault() != headCommit)
114114
{
115-
var filter = new CommitFilter
116-
{
117-
IncludeReachableFrom = headCommit,
118-
SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Reverse
119-
};
120-
121-
commitCache = repo.Commits.QueryBy(filter).ToList();
115+
commitCache = repo.GetCommitsReacheableFromHead(headCommit);
122116
intermediateCommitCache = commitCache;
123117
}
124118

src/GitVersionCore/VersionCalculation/MainlineVersionCalculator.cs

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,7 @@ public SemanticVersion FindMainlineModeVersion(BaseVersion baseVersion, GitVersi
4848
log.Info($"Current branch ({context.CurrentBranch.FriendlyName}) was branch from {mergeBase}");
4949
}
5050

51-
var mainlineCommitLog = context.Repository.Commits.QueryBy(new CommitFilter
52-
{
53-
IncludeReachableFrom = mainlineTip,
54-
ExcludeReachableFrom = baseVersion.BaseVersionSource,
55-
SortBy = CommitSortStrategies.Reverse,
56-
FirstParentOnly = true
57-
})
58-
.ToList();
51+
var mainlineCommitLog = context.Repository.GetMainlineCommitLog(baseVersion, mainlineTip);
5952
var directCommits = new List<Commit>(mainlineCommitLog.Count);
6053

6154
// Scans commit log in reverse, aggregating merge commits
@@ -143,19 +136,7 @@ private Branch GetMainline(GitVersionContext context, Commit baseVersionSource)
143136
}
144137

145138
// prefer a branch on which the merge base was a direct commit, if there is such a branch
146-
var firstMatchingCommitBranch = possibleMainlineBranches
147-
.FirstOrDefault(b =>
148-
{
149-
var filter = new CommitFilter
150-
{
151-
IncludeReachableFrom = b,
152-
ExcludeReachableFrom = baseVersionSource,
153-
FirstParentOnly = true,
154-
};
155-
var query = context.Repository.Commits.QueryBy(filter);
156-
157-
return query.Contains(firstMatchingCommit);
158-
});
139+
var firstMatchingCommitBranch = possibleMainlineBranches.FirstOrDefault(b => context.Repository.GetMatchingCommitBranch(baseVersionSource, b, firstMatchingCommit));
159140
if (firstMatchingCommitBranch != null)
160141
{
161142
var message = string.Format(
@@ -208,15 +189,7 @@ private Commit GetEffectiveMainlineTip(IEnumerable<Commit> mainlineCommitLog, Co
208189
private Commit FindMergeBaseBeforeForwardMerge(GitVersionContext context, Commit baseVersionSource, Branch mainline, out Commit mainlineTip)
209190
{
210191
var mergeBase = context.Repository.ObjectDatabase.FindMergeBase(context.CurrentCommit, mainline.Tip);
211-
var mainlineCommitLog = context.Repository.Commits
212-
.QueryBy(new CommitFilter
213-
{
214-
IncludeReachableFrom = mainline.Tip,
215-
ExcludeReachableFrom = baseVersionSource,
216-
SortBy = CommitSortStrategies.Reverse,
217-
FirstParentOnly = true
218-
})
219-
.ToList();
192+
var mainlineCommitLog = context.Repository.GetMainlineCommitLog(baseVersionSource, mainline);
220193

221194
// find the mainline commit effective for versioning the current branch
222195
mainlineTip = GetEffectiveMainlineTip(mainlineCommitLog, mergeBase, mainline.Tip);
@@ -254,14 +227,7 @@ private SemanticVersion IncrementForEachCommit(GitVersionContext context, List<C
254227
private static VersionField FindMessageIncrement(
255228
GitVersionContext context, Commit mergeCommit, Commit mergedHead, Commit findMergeBase, List<Commit> commitLog)
256229
{
257-
var filter = new CommitFilter
258-
{
259-
IncludeReachableFrom = mergedHead,
260-
ExcludeReachableFrom = findMergeBase
261-
};
262-
var commits = mergeCommit == null ?
263-
context.Repository.Commits.QueryBy(filter).ToList() :
264-
new[] { mergeCommit }.Union(context.Repository.Commits.QueryBy(filter)).ToList();
230+
var commits = context.Repository.GetMergeBaseCommits(mergeCommit, mergedHead, findMergeBase);
265231
commitLog.RemoveAll(c => commits.Any(c1 => c1.Sha == c.Sha));
266232
return IncrementStrategyFinder.GetIncrementForCommits(context, commits)
267233
?? TryFindIncrementFromMergeMessage(mergeCommit, context);

src/GitVersionCore/VersionCalculation/MetaDataCalculator.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,7 @@ public MetaDataCalculator(ILog log)
1717

1818
public SemanticVersionBuildMetaData Create(Commit baseVersionSource, GitVersionContext context)
1919
{
20-
var qf = new CommitFilter
21-
{
22-
IncludeReachableFrom = context.CurrentCommit,
23-
ExcludeReachableFrom = baseVersionSource,
24-
SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time
25-
};
26-
27-
var commitLog = context.Repository.Commits.QueryBy(qf);
20+
var commitLog = context.Repository.GetCommitLog(baseVersionSource, context.CurrentCommit);
2821
var commitsSinceTag = commitLog.Count();
2922
log.Info($"{commitsSinceTag} commits found between {baseVersionSource.Sha} and {context.CurrentCommit.Sha}");
3023

0 commit comments

Comments
 (0)