Skip to content

Commit d710cdb

Browse files
committed
Spike of new CLI - gitversion calculate
GitTools#2262
1 parent c6d8764 commit d710cdb

20 files changed

+169
-209
lines changed

src/GitVersion.sln

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ VisualStudioVersion = 16.0.28714.193
44
MinimumVisualStudioVersion = 10.0.40219.1
55
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionExe", "GitVersionExe\GitVersionExe.csproj", "{C3578A7B-09A6-4444-9383-0DEAFA4958BD}"
66
EndProject
7-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionTask.Tests", "GitVersionTask.Tests\GitVersionTask.Tests.csproj", "{5A86453B-96FB-4B6E-A283-225BB9F753D3}"
8-
EndProject
97
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionCore.Tests", "GitVersionCore.Tests\GitVersionCore.Tests.csproj", "{BF905F84-382C-440D-92F5-C61108626D8D}"
108
EndProject
119
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3EFFC5D6-88D0-49D9-BB53-E1B7EB49DD45}"
@@ -29,10 +27,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionCore", "GitVersio
2927
EndProject
3028
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionExe.Tests", "GitVersionExe.Tests\GitVersionExe.Tests.csproj", "{75C2BE85-1DAF-4E34-8305-B17AFAA982A6}"
3129
EndProject
32-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionTask", "GitVersionTask\GitVersionTask.csproj", "{F7AC0E71-3E9A-4F6D-B986-E004825A48E1}"
33-
EndProject
34-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GitVersionTask.MsBuild", "GitVersionTask.MsBuild\GitVersionTask.MsBuild.csproj", "{0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}"
35-
EndProject
3630
Global
3731
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3832
Debug|Any CPU = Debug|Any CPU
@@ -43,10 +37,6 @@ Global
4337
{C3578A7B-09A6-4444-9383-0DEAFA4958BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
4438
{C3578A7B-09A6-4444-9383-0DEAFA4958BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
4539
{C3578A7B-09A6-4444-9383-0DEAFA4958BD}.Release|Any CPU.Build.0 = Release|Any CPU
46-
{5A86453B-96FB-4B6E-A283-225BB9F753D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
47-
{5A86453B-96FB-4B6E-A283-225BB9F753D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
48-
{5A86453B-96FB-4B6E-A283-225BB9F753D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
49-
{5A86453B-96FB-4B6E-A283-225BB9F753D3}.Release|Any CPU.Build.0 = Release|Any CPU
5040
{BF905F84-382C-440D-92F5-C61108626D8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
5141
{BF905F84-382C-440D-92F5-C61108626D8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
5242
{BF905F84-382C-440D-92F5-C61108626D8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -59,14 +49,6 @@ Global
5949
{75C2BE85-1DAF-4E34-8305-B17AFAA982A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
6050
{75C2BE85-1DAF-4E34-8305-B17AFAA982A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
6151
{75C2BE85-1DAF-4E34-8305-B17AFAA982A6}.Release|Any CPU.Build.0 = Release|Any CPU
62-
{F7AC0E71-3E9A-4F6D-B986-E004825A48E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
63-
{F7AC0E71-3E9A-4F6D-B986-E004825A48E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
64-
{F7AC0E71-3E9A-4F6D-B986-E004825A48E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
65-
{F7AC0E71-3E9A-4F6D-B986-E004825A48E1}.Release|Any CPU.Build.0 = Release|Any CPU
66-
{0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
67-
{0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
68-
{0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
69-
{0F1AEC4E-E81D-4F84-B2E8-3415A1A4DBF4}.Release|Any CPU.Build.0 = Release|Any CPU
7052
EndGlobalSection
7153
GlobalSection(SolutionProperties) = preSolution
7254
HideSolutionNode = FALSE

src/GitVersionCore.Tests/Core/GitVersionExecutorTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ public void GetProjectRootDirectoryWorkingDirectoryWithWorktree()
418418

419419
sp = GetServiceProvider(gitVersionOptions);
420420

421-
gitVersionOptions.ProjectRootDirectory.TrimEnd('/', '\\').ShouldBe(worktreePath);
421+
gitVersionOptions.GitRepositoryWorkingDirectory.TrimEnd('/', '\\').ShouldBe(worktreePath);
422422
}
423423
finally
424424
{
@@ -441,7 +441,7 @@ public void GetProjectRootDirectoryNoWorktree()
441441
sp = GetServiceProvider(gitVersionOptions);
442442

443443
var expectedPath = fixture.RepositoryPath.TrimEnd('/', '\\');
444-
gitVersionOptions.ProjectRootDirectory.TrimEnd('/', '\\').ShouldBe(expectedPath);
444+
gitVersionOptions.GitRepositoryWorkingDirectory.TrimEnd('/', '\\').ShouldBe(expectedPath);
445445
}
446446

447447
[Test]

src/GitVersionCore/Configuration/ConfigFileLocator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ protected ConfigFileLocator(IFileSystem fileSystem)
2222
public string SelectConfigFilePath(GitVersionOptions gitVersionOptions)
2323
{
2424
var workingDirectory = gitVersionOptions.WorkingDirectory;
25-
var projectRootDirectory = gitVersionOptions.ProjectRootDirectory;
25+
var projectRootDirectory = gitVersionOptions.GitRepositoryWorkingDirectory;
2626

2727
return GetConfigFilePath(HasConfigFileAt(workingDirectory) ? workingDirectory : projectRootDirectory);
2828
}
@@ -50,7 +50,7 @@ public void Verify(GitVersionOptions gitVersionOptions)
5050
}
5151

5252
var workingDirectory = gitVersionOptions.WorkingDirectory;
53-
var projectRootDirectory = gitVersionOptions.ProjectRootDirectory;
53+
var projectRootDirectory = gitVersionOptions.GitRepositoryWorkingDirectory;
5454

5555
Verify(workingDirectory, projectRootDirectory);
5656
}

src/GitVersionCore/Configuration/ConfigProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public Config Provide(bool applyDefaults = true, Config overrideConfig = null)
2828
{
2929
var gitVersionOptions = options.Value;
3030
var workingDirectory = gitVersionOptions.WorkingDirectory;
31-
var projectRootDirectory = gitVersionOptions.ProjectRootDirectory;
31+
var projectRootDirectory = gitVersionOptions.GitRepositoryWorkingDirectory;
3232

3333
var rootDirectory = configFileLocator.HasConfigFileAt(workingDirectory) ? workingDirectory : projectRootDirectory;
3434
return Provide(rootDirectory, applyDefaults, overrideConfig);

src/GitVersionCore/Core/GitPreparer.cs

Lines changed: 8 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,9 @@ public void Prepare()
3535
var currentBranch = ResolveCurrentBranch();
3636

3737
var dotGitDirectory = gitVersionOptions.DotGitDirectory;
38-
var projectRoot = gitVersionOptions.ProjectRootDirectory;
3938

40-
log.Info($"Project root is: {projectRoot}");
4139
log.Info($"DotGit directory is: {dotGitDirectory}");
42-
if (string.IsNullOrEmpty(dotGitDirectory) || string.IsNullOrEmpty(projectRoot))
40+
if (string.IsNullOrEmpty(dotGitDirectory))
4341
{
4442
throw new Exception($"Failed to prepare or find the .git directory in path '{gitVersionOptions.WorkingDirectory}'.");
4543
}
@@ -50,22 +48,17 @@ public void Prepare()
5048
private void PrepareInternal(bool normalizeGitDirectory, string currentBranch, bool shouldCleanUpRemotes = false)
5149
{
5250
var gitVersionOptions = options.Value;
53-
if (!string.IsNullOrWhiteSpace(gitVersionOptions.RepositoryInfo.TargetUrl))
54-
{
55-
CreateDynamicRepository(currentBranch);
56-
}
57-
else
51+
52+
if (normalizeGitDirectory)
5853
{
59-
if (normalizeGitDirectory)
54+
if (shouldCleanUpRemotes)
6055
{
61-
if (shouldCleanUpRemotes)
62-
{
63-
CleanupDuplicateOrigin();
64-
}
65-
66-
NormalizeGitDirectory(currentBranch, gitVersionOptions.DotGitDirectory, false);
56+
CleanupDuplicateOrigin();
6757
}
58+
59+
NormalizeGitDirectory(currentBranch, gitVersionOptions.DotGitDirectory, false);
6860
}
61+
6962
}
7063

7164
private string ResolveCurrentBranch()
@@ -108,32 +101,6 @@ private void CleanupDuplicateOrigin()
108101
}
109102
}
110103

111-
private void CreateDynamicRepository(string targetBranch)
112-
{
113-
var gitVersionOptions = options.Value;
114-
if (string.IsNullOrWhiteSpace(targetBranch))
115-
{
116-
throw new Exception("Dynamic Git repositories must have a target branch (/b)");
117-
}
118-
119-
var repositoryInfo = gitVersionOptions.RepositoryInfo;
120-
var gitDirectory = gitVersionOptions.DynamicGitRepositoryPath;
121-
122-
using (log.IndentLog($"Creating dynamic repository at '{gitDirectory}'"))
123-
{
124-
var authentication = gitVersionOptions.Authentication;
125-
if (!Directory.Exists(gitDirectory))
126-
{
127-
CloneRepository(repositoryInfo.TargetUrl, gitDirectory, authentication);
128-
}
129-
else
130-
{
131-
log.Info("Git repository already exists");
132-
}
133-
NormalizeGitDirectory(targetBranch, gitDirectory, true);
134-
}
135-
}
136-
137104
private void NormalizeGitDirectory(string targetBranch, string gitDirectory, bool isDynamicRepository)
138105
{
139106
using (log.IndentLog($"Normalizing git directory for branch '{targetBranch}'"))
@@ -143,58 +110,6 @@ private void NormalizeGitDirectory(string targetBranch, string gitDirectory, boo
143110
}
144111
}
145112

146-
private void CloneRepository(string repositoryUrl, string gitDirectory, AuthenticationInfo auth)
147-
{
148-
Credentials credentials = null;
149-
150-
if (auth != null)
151-
{
152-
if (!string.IsNullOrWhiteSpace(auth.Username))
153-
{
154-
log.Info($"Setting up credentials using name '{auth.Username}'");
155-
156-
credentials = new UsernamePasswordCredentials
157-
{
158-
Username = auth.Username,
159-
Password = auth.Password ?? string.Empty
160-
};
161-
}
162-
}
163-
164-
try
165-
{
166-
using (log.IndentLog($"Cloning repository from url '{repositoryUrl}'"))
167-
{
168-
var cloneOptions = new CloneOptions
169-
{
170-
Checkout = false,
171-
CredentialsProvider = (url, usernameFromUrl, types) => credentials
172-
};
173-
174-
var returnedPath = Repository.Clone(repositoryUrl, gitDirectory, cloneOptions);
175-
log.Info($"Returned path after repository clone: {returnedPath}");
176-
}
177-
}
178-
catch (LibGit2SharpException ex)
179-
{
180-
var message = ex.Message;
181-
if (message.Contains("401"))
182-
{
183-
throw new Exception("Unauthorized: Incorrect username/password");
184-
}
185-
if (message.Contains("403"))
186-
{
187-
throw new Exception("Forbidden: Possibly Incorrect username/password");
188-
}
189-
if (message.Contains("404"))
190-
{
191-
throw new Exception("Not found: The repository was not found");
192-
}
193-
194-
throw new Exception("There was an unknown problem with the Git repository you provided", ex);
195-
}
196-
}
197-
198113
/// <summary>
199114
/// Normalization of a git directory turns all remote branches into local branches, turns pull request refs into a real branch and a few other things. This is designed to be run *only on the build server* which checks out repositories in different ways.
200115
/// It is not recommended to run normalization against a local repository

src/GitVersionCore/Core/GitVersionTool.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,14 @@ public void UpdateAssemblyInfo(VersionVariables variables)
9393
{
9494
var gitVersionOptions = options.Value;
9595

96-
if (gitVersionOptions.AssemblyInfo.ShouldUpdate)
97-
{
98-
using (assemblyInfoFileUpdater)
99-
{
100-
assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(gitVersionOptions.WorkingDirectory, gitVersionOptions.AssemblyInfo.EnsureAssemblyInfo, gitVersionOptions.AssemblyInfo.Files.ToArray()));
101-
}
102-
}
96+
throw new NotImplementedException();
97+
//if (gitVersionOptions.AssemblyInfo.ShouldUpdate)
98+
//{
99+
// using (assemblyInfoFileUpdater)
100+
// {
101+
// assemblyInfoFileUpdater.Execute(variables, new AssemblyInfoContext(gitVersionOptions.WorkingDirectory, gitVersionOptions.AssemblyInfo.EnsureAssemblyInfo, gitVersionOptions.AssemblyInfo.Files.ToArray()));
102+
// }
103+
//}
103104
}
104105

105106
public void UpdateWixVersionFile(VersionVariables variables)

src/GitVersionCore/Extensions/GitVersionOptionsExtensions.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ public static class GitVersionOptionsExtensions
99
{
1010
public static string GetDotGitDirectory(this GitVersionOptions gitVersionOptions)
1111
{
12-
var dotGitDirectory = !string.IsNullOrWhiteSpace(gitVersionOptions.DynamicGitRepositoryPath)
13-
? gitVersionOptions.DynamicGitRepositoryPath
14-
: Repository.Discover(gitVersionOptions.WorkingDirectory);
12+
var dotGitDirectory = Repository.Discover(gitVersionOptions.WorkingDirectory);
1513

1614
dotGitDirectory = dotGitDirectory?.TrimEnd('/', '\\');
1715
if (string.IsNullOrEmpty(dotGitDirectory))
@@ -22,20 +20,11 @@ public static string GetDotGitDirectory(this GitVersionOptions gitVersionOptions
2220
: dotGitDirectory;
2321
}
2422

25-
public static string GetProjectRootDirectory(this GitVersionOptions gitVersionOptions)
23+
public static string GetRepositoryWorkingDirectory(this GitVersionOptions gitVersionOptions)
2624
{
27-
if (!string.IsNullOrWhiteSpace(gitVersionOptions.DynamicGitRepositoryPath))
28-
{
29-
return gitVersionOptions.WorkingDirectory;
30-
}
31-
32-
var dotGitDirectory = Repository.Discover(gitVersionOptions.WorkingDirectory);
33-
34-
if (string.IsNullOrEmpty(dotGitDirectory))
35-
throw new DirectoryNotFoundException($"Can't find the .git directory in {dotGitDirectory}");
36-
37-
using var repository = new Repository(dotGitDirectory);
38-
return repository.Info.WorkingDirectory;
25+
//return gitVersionOptions.WorkingDirectory;
26+
using var repository = new Repository(gitVersionOptions.DotGitDirectory);
27+
return repository.Info.WorkingDirectory;
3928
}
4029

4130
public static string GetDynamicGitRepositoryPath(this GitVersionOptions gitVersionOptions)

src/GitVersionCore/Model/GitVersionOptions.cs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,23 @@ namespace GitVersion
99
public class GitVersionOptions
1010
{
1111
private Lazy<string> dotGitDirectory;
12-
private Lazy<string> projectRootDirectory;
13-
private Lazy<string> dynamicGitRepositoryPath;
12+
private Lazy<string> gitRepositoryWorkingDirectory;
1413

1514
public GitVersionOptions()
1615
{
16+
WorkingDirectory = System.Environment.CurrentDirectory;
1717
dotGitDirectory = new Lazy<string>(this.GetDotGitDirectory);
18-
projectRootDirectory = new Lazy<string>(this.GetProjectRootDirectory);
19-
dynamicGitRepositoryPath = new Lazy<string>(this.GetDynamicGitRepositoryPath);
18+
gitRepositoryWorkingDirectory = new Lazy<string>(this.GetRepositoryWorkingDirectory);
2019
}
2120

21+
public string[] Args { get; set; }
2222
public string WorkingDirectory { get; set; }
23-
2423
public string DotGitDirectory => dotGitDirectory.Value;
25-
public string ProjectRootDirectory => projectRootDirectory.Value;
26-
public string DynamicGitRepositoryPath => dynamicGitRepositoryPath.Value;
24+
public string GitRepositoryWorkingDirectory => gitRepositoryWorkingDirectory.Value;
25+
public bool LogToConsole { get; set; } = false;
26+
public string LogFilePath;
2727

28-
public AssemblyInfoData AssemblyInfo { get; } = new AssemblyInfoData();
28+
//public AssemblyInfoData AssemblyInfo { get; } = new AssemblyInfoData();
2929
public AuthenticationInfo Authentication { get; } = new AuthenticationInfo();
3030
public ConfigInfo ConfigInfo { get; } = new ConfigInfo();
3131
public RepositoryInfo RepositoryInfo { get; } = new RepositoryInfo();
@@ -37,19 +37,10 @@ public GitVersionOptions()
3737
public bool IsVersion;
3838
public bool IsHelp;
3939

40-
public string LogFilePath;
4140
public string ShowVariable;
4241
public string OutputFile;
4342
public ISet<OutputType> Output = new HashSet<OutputType>();
4443
public Verbosity Verbosity = Verbosity.Normal;
4544

46-
[Obsolete]
47-
public string Proj;
48-
[Obsolete]
49-
public string ProjArgs;
50-
[Obsolete]
51-
public string Exec;
52-
[Obsolete]
53-
public string ExecArgs;
5445
}
5546
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Microsoft.Extensions.Options;
2+
using System;
3+
using System.CommandLine;
4+
using System.CommandLine.Invocation;
5+
using System.Threading.Tasks;
6+
7+
namespace GitVersion
8+
{
9+
public class CalculateCommand : Command
10+
{
11+
private readonly IGitVersionTool gitversionTool;
12+
private readonly Logging.IConsole console;
13+
14+
public CalculateCommand(IGitVersionTool gitversionTool, Logging.IConsole console) : base("calculate", "Calculates version information from your git repository")
15+
{
16+
this.gitversionTool = gitversionTool;
17+
this.console = console;
18+
this.AddOption(new Option<bool>(
19+
"--normalize",
20+
"Attempt to mutate your git repository so gitversion has enough information (local branches, commit history etc) to calculate."));
21+
this.Handler = CommandHandler.Create<bool?>(ExecuteAsync);
22+
}
23+
24+
private async Task ExecuteAsync(bool? normalize)
25+
{
26+
if (normalize ?? false)
27+
{
28+
await Normalize();
29+
}
30+
31+
var variables = this.gitversionTool.CalculateVersionVariables();
32+
console.WriteLine(variables.ToString());
33+
}
34+
35+
private Task Normalize()
36+
{
37+
throw new NotImplementedException();
38+
}
39+
}
40+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using Microsoft.Extensions.Options;
2+
using System.CommandLine;
3+
4+
namespace GitVersion
5+
{
6+
public class GitVersionRootCommand : RootCommand
7+
{
8+
public GitVersionRootCommand(CalculateCommand calculateCommand, IOptions<GitVersionOptions> globalOptions) : base("Versioning for your git repository, solved!")
9+
{
10+
// this.AddGlobalOption()
11+
//this.AddGlobalOption(new Option("--target-path") { Argument = new Argument<LoggingMethod>() });
12+
//this.AddGlobalOption(new Option("--logging-method") { Argument = new Argument<LoggingMethod>() });
13+
GlobalOptions = globalOptions.Value;
14+
this.AddCommand(calculateCommand);
15+
}
16+
17+
public GitVersionOptions GlobalOptions { get; }
18+
}
19+
}

0 commit comments

Comments
 (0)