Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ public DisabledGitVersionFile(GitContext context)

protected new DisabledGitContext Context => (DisabledGitContext)base.Context;

protected override VersionOptions? GetVersionCore(out string? actualDirectory)
protected override VersionOptions? GetVersionCore(VersionFileRequirements requirements, out VersionFileLocations locations)
{
actualDirectory = null;
locations = default;
return null;
}
}
2 changes: 1 addition & 1 deletion src/NerdBank.GitVersioning/LibGit2/LibGit2GitExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -594,7 +594,7 @@ internal GitWalkTracker(LibGit2Context context)
{
try
{
options = ((LibGit2VersionFile)this.context.VersionFile).GetVersion(commit, this.context.RepoRelativeProjectDirectory, this.blobVersionCache, out string? actualDirectory);
options = ((LibGit2VersionFile)this.context.VersionFile).GetVersion(commit, this.context.RepoRelativeProjectDirectory, this.blobVersionCache, VersionFileRequirements.Default, out _);
}
catch (Exception ex)
{
Expand Down
40 changes: 27 additions & 13 deletions src/NerdBank.GitVersioning/LibGit2/LibGit2VersionFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,14 @@ internal LibGit2VersionFile(LibGit2Context context)
/// <param name="commit">The commit to read from.</param>
/// <param name="repoRelativeProjectDirectory">The directory to consider when searching for the version.txt file.</param>
/// <param name="blobVersionCache">An optional blob cache for storing the raw parse results of a version.txt or version.json file (before any inherit merge operations are applied).</param>
/// <param name="actualDirectory">Receives the full path to the directory in which the version file was found.</param>
/// <param name="requirements"><inheritdoc cref="GetVersionCore(VersionFileRequirements, out VersionFileLocations)" path="/param[@name='requirements']" /></param>
/// <param name="locations"><inheritdoc cref="GetVersionCore(VersionFileRequirements, out VersionFileLocations)" path="/param[@name='locations']" /></param>
/// <returns>The version information read from the file.</returns>
internal VersionOptions? GetVersion(Commit commit, string repoRelativeProjectDirectory, Dictionary<ObjectId, VersionOptions?>? blobVersionCache, out string? actualDirectory)
internal VersionOptions? GetVersion(Commit commit, string repoRelativeProjectDirectory, Dictionary<ObjectId, VersionOptions?>? blobVersionCache, VersionFileRequirements requirements, out VersionFileLocations locations)
{
repoRelativeProjectDirectory = TrimTrailingPathSeparator(repoRelativeProjectDirectory);
locations = default;

string? searchDirectory = repoRelativeProjectDirectory ?? string.Empty;
while (searchDirectory is object)
{
Expand All @@ -58,8 +62,8 @@ internal LibGit2VersionFile(LibGit2Context context)
if (result is object)
{
IBelongToARepository commitAsRepoMember = commit;
actualDirectory = Path.Combine(commitAsRepoMember.Repository.Info.WorkingDirectory, searchDirectory);
return result;
this.ApplyLocations(result, Path.Combine(commitAsRepoMember.Repository.Info.WorkingDirectory, searchDirectory), ref locations);
return VersionOptionsSatisfyRequirements(result, requirements) ? result : null;
}
}

Expand Down Expand Up @@ -95,12 +99,19 @@ internal LibGit2VersionFile(LibGit2Context context)
}
}

if (result?.Inherit ?? false)
this.ApplyLocations(result, Path.Combine(this.Context.WorkingTreePath, searchDirectory), ref locations);
if (VersionOptionsSatisfyRequirements(result, requirements))
{
return result;
}

if (result?.Inherit is true)
{
if (parentDirectory is object)
{
result = this.GetVersion(commit, parentDirectory, blobVersionCache, out actualDirectory);
if (result is object)
result = this.GetVersion(commit, parentDirectory, blobVersionCache, requirements, out VersionFileLocations parentLocations);
this.MergeLocations(ref locations, parentLocations);
if (!requirements.HasFlag(VersionFileRequirements.NonMergedResult) && result is not null)
{
if (versionJsonContent is null)
{
Expand All @@ -115,27 +126,30 @@ internal LibGit2VersionFile(LibGit2Context context)
}

JsonConvert.PopulateObject(versionJsonContent, result, VersionOptions.GetJsonSettings(repoRelativeBaseDirectory: searchDirectory));
return result;
result.Inherit = false;
}
}
else
{
throw new InvalidOperationException($"\"{candidatePath}\" inherits from a parent directory version.json file but none exists.");
}

throw new InvalidOperationException($"\"{candidatePath}\" inherits from a parent directory version.json file but none exists.");
return VersionOptionsSatisfyRequirements(result, requirements) ? result : null;
}
else if (result is object)
{
IBelongToARepository commitAsRepoMember = commit;
actualDirectory = Path.Combine(commitAsRepoMember.Repository.Info.WorkingDirectory, searchDirectory);
return result;
return VersionOptionsSatisfyRequirements(result, requirements) ? result : null;
}
}

searchDirectory = parentDirectory;
}

actualDirectory = null;
locations = default;
return null;
}

/// <inheritdoc/>
protected override VersionOptions? GetVersionCore(out string? actualDirectory) => this.GetVersion(this.Context.Commit!, this.Context.RepoRelativeProjectDirectory, null, out actualDirectory);
protected override VersionOptions? GetVersionCore(VersionFileRequirements requirements, out VersionFileLocations locations) => this.GetVersion(this.Context.Commit!, this.Context.RepoRelativeProjectDirectory, null, requirements, out locations);
}
2 changes: 1 addition & 1 deletion src/NerdBank.GitVersioning/Managed/GitExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ internal GitWalkTracker(ManagedGitContext context)
{
try
{
options = ((ManagedVersionFile)this.context.VersionFile).GetVersion(commit, this.context.RepoRelativeProjectDirectory, this.blobVersionCache, out string? actualDirectory);
options = ((ManagedVersionFile)this.context.VersionFile).GetVersion(commit, this.context.RepoRelativeProjectDirectory, this.blobVersionCache, VersionFileRequirements.Default, out _);
}
catch (Exception ex)
{
Expand Down
30 changes: 18 additions & 12 deletions src/NerdBank.GitVersioning/Managed/ManagedVersionFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,22 @@ public ManagedVersionFile(GitContext context)

protected new ManagedGitContext Context => (ManagedGitContext)base.Context;

protected override bool VersionSearchRootToBranch => true;

/// <summary>
/// Reads the version.json file and returns the <see cref="VersionOptions"/> deserialized from it.
/// </summary>
/// <param name="commit">The commit to read from.</param>
/// <param name="repoRelativeProjectDirectory">The directory to consider when searching for the version.txt file.</param>
/// <param name="blobVersionCache">An optional blob cache for storing the raw parse results of a version.txt or version.json file (before any inherit merge operations are applied).</param>
/// <param name="actualDirectory">Receives the full path to the directory in which the version file was found.</param>
/// <param name="requirements"><inheritdoc cref="GetVersionCore(VersionFileRequirements, out VersionFileLocations)" path="/param[@name='requirements']" /></param>
/// <param name="locations"><inheritdoc cref="GetVersionCore(VersionFileRequirements, out VersionFileLocations)" path="/param[@name='locations']" /></param>
/// <returns>The version information read from the file.</returns>
internal VersionOptions? GetVersion(GitCommit commit, string repoRelativeProjectDirectory, Dictionary<GitObjectId, VersionOptions?>? blobVersionCache, out string? actualDirectory)
internal VersionOptions? GetVersion(GitCommit commit, string repoRelativeProjectDirectory, Dictionary<GitObjectId, VersionOptions?>? blobVersionCache, VersionFileRequirements requirements, out VersionFileLocations locations)
{
repoRelativeProjectDirectory = TrimTrailingPathSeparator(repoRelativeProjectDirectory);
locations = default;

var directories = new Stack<string>();

string? currentDirectory = repoRelativeProjectDirectory;
Expand All @@ -61,8 +67,6 @@ public ManagedVersionFile(GitContext context)
string? parentDirectory = null;

VersionOptions? finalResult = null;
actualDirectory = null;

while (tree != GitObjectId.Empty)
{
GitObjectId versionTxtBlob = this.Context.Repository.GetTreeEntry(tree, TxtFileNameBytes);
Expand All @@ -81,7 +85,7 @@ public ManagedVersionFile(GitContext context)
if (result is object)
{
finalResult = result;
actualDirectory = Path.Combine(this.Context.WorkingTreePath, searchDirectory);
this.ApplyLocations(result, Path.Combine(this.Context.WorkingTreePath, searchDirectory), ref locations);
}
}

Expand Down Expand Up @@ -116,12 +120,13 @@ public ManagedVersionFile(GitContext context)
}
}

if (result?.Inherit ?? false)
if (result?.Inherit is true)
{
if (parentDirectory is object)
{
result = this.GetVersion(commit, parentDirectory, blobVersionCache, out string? resultingDirectory);
if (result is object)
result = this.GetVersion(commit, parentDirectory, blobVersionCache, requirements, out VersionFileLocations parentLocations);
this.MergeLocations(ref locations, parentLocations);
if (!requirements.HasFlag(VersionFileRequirements.NonMergedResult) && result is not null)
{
if (versionJsonContent is null)
{
Expand All @@ -136,7 +141,7 @@ public ManagedVersionFile(GitContext context)
}

JsonConvert.PopulateObject(versionJsonContent, result, VersionOptions.GetJsonSettings(repoRelativeBaseDirectory: searchDirectory));
finalResult = result;
result.Inherit = false;
}
else
{
Expand All @@ -153,8 +158,8 @@ public ManagedVersionFile(GitContext context)

if (result is object)
{
actualDirectory = Path.Combine(this.Context.WorkingTreePath, searchDirectory);
finalResult = result;
this.ApplyLocations(result, Path.Combine(this.Context.WorkingTreePath, searchDirectory), ref locations);
}
}

Expand All @@ -174,9 +179,10 @@ public ManagedVersionFile(GitContext context)
}
}

return finalResult;
return VersionOptionsSatisfyRequirements(finalResult, requirements) ? finalResult : null;
}

/// <inheritdoc/>
protected override VersionOptions? GetVersionCore(out string? actualDirectory) => this.GetVersion(this.Context.Commit!.Value, this.Context.RepoRelativeProjectDirectory, null, out actualDirectory);
protected override VersionOptions? GetVersionCore(VersionFileRequirements requirements, out VersionFileLocations locations)
=> this.GetVersion(this.Context.Commit!.Value, this.Context.RepoRelativeProjectDirectory, null, requirements, out locations);
}
2 changes: 1 addition & 1 deletion src/NerdBank.GitVersioning/NoGit/NoGitVersionFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ public NoGitVersionFile(GitContext context)
}

/// <inheritdoc/>
protected override VersionOptions GetVersionCore(out string actualDirectory) => throw Assumes.NotReachable();
protected override VersionOptions GetVersionCore(VersionFileRequirements requirements, out VersionFileLocations locations) => throw Assumes.NotReachable();
}
Loading
Loading