Skip to content

Commit 226667a

Browse files
committed
Merge branch 'feature/gitreader-primitive' into devel
2 parents ff01e15 + 5dcef7f commit 226667a

File tree

6 files changed

+90
-54
lines changed

6 files changed

+90
-54
lines changed

RelaxVersioner.Core.Tests/AnalyzerTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
////////////////////////////////////////////////////////////////////////////////////////
99

1010
using GitReader;
11-
using GitReader.Structures;
11+
using GitReader.Primitive;
1212
using NUnit.Framework;
1313
using System.IO;
1414
using System.Threading.Tasks;
@@ -30,7 +30,7 @@ public sealed class AnalyzerTests
3030
[TestCase("MultiRoot2", "0.10.22")]
3131
public async Task LookupVersionLabel(string repositoryName, string expectedString)
3232
{
33-
using var repository = await Repository.Factory.OpenStructureAsync(
33+
using var repository = await Repository.Factory.OpenPrimitiveAsync(
3434
Path.Combine(TestsSetUp.BasePath, repositoryName));
3535

3636
var actual = await Analyzer.LookupVersionLabelAsync(repository, false, default);

RelaxVersioner.Core.Tests/Analyzer_WorkingDirectory.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
////////////////////////////////////////////////////////////////////////////////////////
99

1010
using GitReader;
11-
using GitReader.Structures;
11+
using GitReader.Primitive;
1212
using NUnit.Framework;
1313
using System;
1414
using System.IO;
@@ -42,54 +42,54 @@ public async Task LookupVersionLabelWithWorkingDirectoryChanges()
4242

4343
// Test 1: Clean working directory - should return tagged version
4444
Hash root;
45-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
45+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
4646
{
47-
root = repository.Head!.Head;
47+
root = (await repository.GetCurrentHeadReferenceAsync())!.Value;
4848

4949
var version = await Analyzer.LookupVersionLabelAsync(repository, true, default);
5050
Assert.That(version.ToString(), Is.EqualTo("1.2.3"));
5151
}
5252

5353
// Test 2: Modified file (unstaged) - should increment version
5454
File.WriteAllText(testFile, "modified content");
55-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
55+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
5656
{
5757
var version = await Analyzer.LookupVersionLabelAsync(repository, true, default);
5858
Assert.That(version.ToString(), Is.EqualTo("1.2.4"));
5959
}
6060

6161
// Test 3: Staged file - should increment version
6262
await TestUtilities.RunGitCommand(tempPath, "add test.txt");
63-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
63+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
6464
{
6565
var version = await Analyzer.LookupVersionLabelAsync(repository, true, default);
6666
Assert.That(version.ToString(), Is.EqualTo("1.2.4"));
6767
}
6868

6969
// Test 4: Commit staged file and test untracked file
7070
await TestUtilities.RunGitCommand(tempPath, "commit -m \"Test\"");
71-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
71+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
7272
{
7373
var version = await Analyzer.LookupVersionLabelAsync(repository, true, default);
7474
Assert.That(version.ToString(), Is.EqualTo("1.2.4"));
7575
}
7676
var untrackedFile = Path.Combine(tempPath, "untracked.txt");
7777
File.WriteAllText(untrackedFile, "untracked content");
78-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
78+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
7979
{
8080
var version = await Analyzer.LookupVersionLabelAsync(repository, true, default);
8181
Assert.That(version.ToString(), Is.EqualTo("1.2.5"));
8282
}
8383

8484
// Test 5: Reset
8585
await TestUtilities.RunGitCommand(tempPath, $"reset --hard {root}");
86-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
86+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
8787
{
8888
var version = await Analyzer.LookupVersionLabelAsync(repository, true, default);
8989
Assert.That(version.ToString(), Is.EqualTo("1.2.4"));
9090
}
9191
await TestUtilities.RunGitCommand(tempPath, $"clean -xfd"); // Remove `untracked.txt`
92-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
92+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
9393
{
9494
var version = await Analyzer.LookupVersionLabelAsync(repository, true, default);
9595
Assert.That(version.ToString(), Is.EqualTo("1.2.3"));
@@ -127,7 +127,7 @@ public async Task LookupVersionLabelWithInitialRepository()
127127
await TestUtilities.RunGitCommand(tempPath, "config user.name \"Test User\"");
128128

129129
// Test 1: Initial repository with no commits and no files - should return default version
130-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
130+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
131131
{
132132
var version = await Analyzer.LookupVersionLabelAsync(repository, false, default);
133133
Assert.That(version.ToString(), Is.EqualTo("0.0.1"));
@@ -136,15 +136,15 @@ public async Task LookupVersionLabelWithInitialRepository()
136136
// Test 2: Initial repository with untracked file - should still return default version
137137
var testFile = Path.Combine(tempPath, "test.txt");
138138
File.WriteAllText(testFile, "content");
139-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
139+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
140140
{
141141
var version = await Analyzer.LookupVersionLabelAsync(repository, false, default);
142142
Assert.That(version.ToString(), Is.EqualTo("0.0.1"));
143143
}
144144

145145
// Test 3: Initial repository with staged file (but no commits) - should still return default version
146146
await TestUtilities.RunGitCommand(tempPath, "add test.txt");
147-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
147+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
148148
{
149149
var version = await Analyzer.LookupVersionLabelAsync(repository, false, default);
150150
Assert.That(version.ToString(), Is.EqualTo("0.0.1"));
@@ -153,7 +153,7 @@ public async Task LookupVersionLabelWithInitialRepository()
153153
// Test 4: Initial repository with unstaged changes after staging - should still return default version
154154
// First modify the staged file to create unstaged changes
155155
File.WriteAllText(testFile, "modified content");
156-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
156+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
157157
{
158158
var version = await Analyzer.LookupVersionLabelAsync(repository, false, default);
159159
Assert.That(version.ToString(), Is.EqualTo("0.0.1"));
@@ -163,7 +163,7 @@ public async Task LookupVersionLabelWithInitialRepository()
163163
var testFile2 = Path.Combine(tempPath, "test2.txt");
164164
File.WriteAllText(testFile2, "second file content");
165165
await TestUtilities.RunGitCommand(tempPath, "add test2.txt");
166-
using (var repository = await Repository.Factory.OpenStructureAsync(tempPath))
166+
using (var repository = await Repository.Factory.OpenPrimitiveAsync(tempPath))
167167
{
168168
var version = await Analyzer.LookupVersionLabelAsync(repository, false, default);
169169
Assert.That(version.ToString(), Is.EqualTo("0.0.1"));

RelaxVersioner.Core/Analyzer.cs

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@
1212
using System.Threading;
1313
using System.Threading.Tasks;
1414
using GitReader.IO;
15-
using GitReader.Structures;
15+
using GitReader.Primitive;
1616

1717
namespace RelaxVersioner;
1818

1919
internal static class Analyzer
2020
{
2121
private readonly struct ScheduledCommit
2222
{
23-
public readonly Commit Commit;
24-
public readonly Commit[] Parents;
23+
public readonly PrimitiveCommit Commit;
24+
public readonly PrimitiveCommit[] Parents;
2525

2626
public ScheduledCommit(
27-
Commit commit, Commit[] parents)
27+
PrimitiveCommit commit, PrimitiveCommit[] parents)
2828
{
2929
this.Commit = commit;
3030
this.Parents = parents;
3131
}
3232

3333
public void Deconstruct(
34-
out Commit commit, out Commit[] parents)
34+
out PrimitiveCommit commit, out PrimitiveCommit[] parents)
3535
{
3636
commit = this.Commit;
3737
parents = this.Parents;
@@ -70,7 +70,9 @@ private static Version IncrementLastVersionComponent(
7070
}
7171

7272
private static async Task<Version> LookupVersionLabelRecursiveAsync(
73-
Commit commit, Dictionary<Commit, Version> reached, CancellationToken ct)
73+
PrimitiveRepository repository,
74+
PrimitiveCommit commit,
75+
Dictionary<PrimitiveCommit, Version> reached, CancellationToken ct)
7476
{
7577
var scheduledStack = new Stack<ScheduledCommit>();
7678
var version = Version.Default;
@@ -89,7 +91,7 @@ private static async Task<Version> LookupVersionLabelRecursiveAsync(
8991
}
9092

9193
// Detected mostly larger version tag.
92-
var candidates = commit.Tags.
94+
var candidates = (await repository.GetRelatedTagsAsync(commit, ct)).
9395
Select(tag => Version.TryParse(tag.Name, out var v) ? v : null!).
9496
Where(v => v?.ComponentCount >= 2). // "1.2" or more.
9597
OrderByDescending(v => v).
@@ -101,7 +103,11 @@ private static async Task<Version> LookupVersionLabelRecursiveAsync(
101103
break;
102104
}
103105

104-
var parents = await commit.GetParentCommitsAsync(ct);
106+
var parents = (await LooseConcurrentScope.Default.WhenAll(
107+
commit.Parents.Select(parentCommitHash => repository.GetCommitAsync(parentCommitHash, ct)))).
108+
Where(parentCommitHash => parentCommitHash.HasValue).
109+
Select(parentCommitHash => parentCommitHash!.Value).
110+
ToArray();
105111
if (parents.Length == 0)
106112
{
107113
reached.Add(commit, version);
@@ -124,7 +130,7 @@ private static async Task<Version> LookupVersionLabelRecursiveAsync(
124130
{
125131
for (var index = 1; index < pcs.Length; index++)
126132
{
127-
var v = await LookupVersionLabelRecursiveAsync(pcs[index], reached, ct);
133+
var v = await LookupVersionLabelRecursiveAsync(repository, pcs[index], reached, ct);
128134
if (v.CompareTo(version) > 0)
129135
{
130136
version = v;
@@ -140,19 +146,20 @@ private static async Task<Version> LookupVersionLabelRecursiveAsync(
140146
}
141147

142148
private static async Task<Version> RunLookupVersionLabelAsync(
143-
Branch branch, CancellationToken ct)
149+
PrimitiveRepository repository,
150+
PrimitiveReference branch, CancellationToken ct)
144151
{
145-
var headCommit = await branch.GetHeadCommitAsync(ct);
146-
return await LookupVersionLabelRecursiveAsync(headCommit, new(), ct);
152+
var headCommit = await repository.GetCommitAsync(branch, ct);
153+
return await LookupVersionLabelRecursiveAsync(repository, headCommit!.Value, new(), ct);
147154
}
148155

149156
public static async Task<Version> LookupVersionLabelAsync(
150-
StructuredRepository repository,
157+
PrimitiveRepository repository,
151158
bool checkWorkingDirectoryStatus,
152159
CancellationToken ct)
153160
{
154161
// Check if repository has any commits (to handle initial state)
155-
if (repository.Head is not { } branch)
162+
if (await repository.GetCurrentHeadReferenceAsync(ct) is not { } branch)
156163
{
157164
return Version.Default; // Return default version (0.0.1) if no HEAD
158165
}
@@ -161,14 +168,19 @@ public static async Task<Version> LookupVersionLabelAsync(
161168
{
162169
var (baseVersion, workingDirectoryStatus) = await LooseConcurrentScope.Default.Join(
163170
// Get the base version from commit tags
164-
RunLookupVersionLabelAsync(branch, ct),
171+
RunLookupVersionLabelAsync(repository, branch, ct),
165172
// Check working directory status
166173
repository.GetWorkingDirectoryStatusAsync(ct));
167174

168175
// If there are modified files, increment the version
169176
if (workingDirectoryStatus.StagedFiles.Count > 0 ||
170-
workingDirectoryStatus.UnstagedFiles.Count > 0 ||
171-
workingDirectoryStatus.UntrackedFiles.Count > 0)
177+
workingDirectoryStatus.UnstagedFiles.Count > 0)
178+
{
179+
return IncrementLastVersionComponent(baseVersion);
180+
}
181+
182+
var untrackedFiles = await repository.GetUntrackedFilesAsync(workingDirectoryStatus, ct);
183+
if (untrackedFiles.Count > 0)
172184
{
173185
return IncrementLastVersionComponent(baseVersion);
174186
}
@@ -177,7 +189,7 @@ public static async Task<Version> LookupVersionLabelAsync(
177189
}
178190
else
179191
{
180-
return await RunLookupVersionLabelAsync(branch, ct);
192+
return await RunLookupVersionLabelAsync(repository, branch, ct);
181193
}
182194
}
183195
}

RelaxVersioner.Core/Processor.cs

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
////////////////////////////////////////////////////////////////////////////////////////
1+
////////////////////////////////////////////////////////////////////////////////////////
22
//
33
// RelaxVersioner - Git tag/branch based, full-automatic version generator.
44
// Copyright (c) Kouji Matsui (@kozy_kekyo, @[email protected])
@@ -17,7 +17,8 @@
1717
using System.Xml.Linq;
1818

1919
using GitReader;
20-
using GitReader.Structures;
20+
using GitReader.IO;
21+
using GitReader.Primitive;
2122

2223
using RelaxVersioner.Writers;
2324

@@ -66,13 +67,13 @@ private static async Task<Result> WriteVersionSourceFileAsync(
6667
Logger logger,
6768
WriteProviderBase writeProvider,
6869
ProcessorContext context,
69-
StructuredRepository? repository,
70-
Branch? targetBranch,
70+
PrimitiveRepository repository,
71+
PrimitiveReference? targetBranch,
7172
DateTimeOffset generated,
7273
CancellationToken ct)
7374
{
74-
var commit = targetBranch != null ?
75-
await targetBranch.GetHeadCommitAsync(ct) :
75+
var commit = targetBranch is { } tb ?
76+
await repository.GetCommitAsync(tb, ct) :
7677
null;
7778

7879
var commitId = commit?.Hash.ToString() ??
@@ -86,14 +87,22 @@ static string FormatSignature(Signature? sig) => sig is { } s ?
8687
var committer = FormatSignature(commit?.Committer);
8788
var commitDate = commit?.Committer.Date ?? generated;
8889

89-
var branches = commit?.Branches.
90-
Select(b => b.Name).
91-
ToArray() ?? Array.Empty<string>();
90+
var branches = commit is { } c1 ?
91+
(await repository.GetBranchHeadReferencesAsync(ct)).
92+
Where(b => b.Target.Equals(c1.Hash)).
93+
Select(b => b.Name).
94+
ToArray() :
95+
[];
9296
var branchesString = string.Join(",", branches);
9397

94-
var tags = commit?.Tags.
98+
var tags = commit is { } c2 ?
99+
(await LooseConcurrentScope.Default.WhenAll(
100+
(await repository.GetTagReferencesAsync(ct)).
101+
Select(t => repository.GetTagAsync(t, ct)))).
102+
Where(t => t.Hash.Equals(c2.Hash)).
95103
Select(b => b.Name).
96-
ToArray() ?? Array.Empty<string>();
104+
ToArray() :
105+
[];
97106
var tagsString = string.Join(",", tags);
98107

99108
var safeVersion = Utilities.GetSafeVersionFromDate(commitDate);
@@ -145,6 +154,21 @@ static string FormatSignature(Signature? sig) => sig is { } s ?
145154

146155
writeProvider.Write(context, keyValues, generated);
147156

157+
string subject;
158+
string body;
159+
160+
if (commit is { } c)
161+
{
162+
var index = c.Message.IndexOf("\n\n");
163+
subject = ((index >= 0) ? c.Message.Substring(0, index) : c.Message).Trim('\n').Replace('\n', ' ');
164+
body = (index >= 0) ? c.Message.Substring(index + 2) : string.Empty;
165+
}
166+
else
167+
{
168+
subject = null;
169+
body = null;
170+
}
171+
148172
return new Result(
149173
versionLabel,
150174
shortVersion,
@@ -157,8 +181,8 @@ static string FormatSignature(Signature? sig) => sig is { } s ?
157181
commitDate,
158182
author,
159183
committer,
160-
commit?.Subject,
161-
commit?.Body);
184+
subject,
185+
body);
162186
}
163187

164188
public async Task<Result> RunAsync(
@@ -175,7 +199,7 @@ public async Task<Result> RunAsync(
175199
writeProvider,
176200
context,
177201
repository,
178-
repository?.Head,
202+
await repository.GetCurrentHeadReferenceAsync(ct),
179203
DateTimeOffset.Now,
180204
ct);
181205
}

RelaxVersioner.Core/RelaxVersioner.Core.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15-
<PackageReference Include="GitReader" Version="1.14.0" />
15+
<PackageReference Include="GitReader" Version="1.15.0" />
1616
<PackageReference Include="NamingFormatter" Version="2.4.0" />
1717
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
1818
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="All" />
1919
<PackageReference Condition="'$(RV_BOOTSTRAP)' != 'True'"
20-
Include="RelaxVersioner" Version="3.13.0" PrivateAssets="all" />
20+
Include="RelaxVersioner" Version="3.15.0" PrivateAssets="all" />
2121
</ItemGroup>
2222

2323
<ItemGroup>

0 commit comments

Comments
 (0)