Skip to content

Commit 3191611

Browse files
committed
GitVersion VSO build task all working
1 parent 9f58c6d commit 3191611

17 files changed

+93
-35
lines changed

src/GitVersionCore.Tests/BuildServers/BuildServerBaseTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,10 @@ public override string[] GenerateSetParameterMessage(string name, string value)
4444
{
4545
return new string[0];
4646
}
47+
48+
public override string GetCurrentBranch()
49+
{
50+
throw new NotImplementedException();
51+
}
4752
}
4853
}

src/GitVersionCore.Tests/Fixtures/RemoteRepositoryFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public RemoteRepositoryFixture(Config configuration)
2525
/// </summary>
2626
public void InitialiseRepo()
2727
{
28-
new GitPreparer(null, null, new Authentication(), null, false, LocalRepositoryPath).Initialise(true);
28+
new GitPreparer(null, null, new Authentication(), null, false, LocalRepositoryPath).Initialise(true, null);
2929
}
3030

3131
static IRepository CreateNewRepository(string path)

src/GitVersionCore.Tests/GitVersionCore.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<ErrorReport>prompt</ErrorReport>
2525
<WarningLevel>4</WarningLevel>
2626
<Prefer32Bit>false</Prefer32Bit>
27+
<LangVersion>5</LangVersion>
2728
</PropertyGroup>
2829
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
2930
<DebugType>full</DebugType>

src/GitVersionCore/BuildServers/AppVeyor.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,10 @@ public override string[] GenerateSetParameterMessage(string name, string value)
5959
string.Format("Adding Environment Variable. name='GitVersion_{0}' value='{1}']", name, value)
6060
};
6161
}
62+
63+
public override string GetCurrentBranch()
64+
{
65+
return null;
66+
}
6267
}
6368
}

src/GitVersionCore/BuildServers/BuildServerBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public abstract class BuildServerBase : IBuildServer
77
public abstract bool CanApplyToCurrentContext();
88
public abstract string GenerateSetVersionMessage(string versionToUseForBuildNumber);
99
public abstract string[] GenerateSetParameterMessage(string name, string value);
10+
public abstract string GetCurrentBranch();
1011

1112
public virtual void WriteIntegration(Action<string> writer, VersionVariables variables)
1213
{

src/GitVersionCore/BuildServers/ContinuaCi.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public override string[] GenerateSetParameterMessage(string name, string value)
2929
};
3030
}
3131

32+
public override string GetCurrentBranch() { return string.Empty; }
33+
3234
public override string GenerateSetVersionMessage(string versionToUseForBuildNumber)
3335
{
3436
return string.Format("@@continua[setBuildVersion value='{0}']", versionToUseForBuildNumber);

src/GitVersionCore/BuildServers/GitHelper.cs

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,28 @@ public static class GitHelper
1010
{
1111
const string MergeMessageRegexPattern = "refs/heads/(pr|pull(-requests)?/(?<issuenumber>[0-9]*)/(merge|head))";
1212

13-
public static void NormalizeGitDirectory(string gitDirectory, Authentication authentication, bool noFetch)
13+
public static void NormalizeGitDirectory(string gitDirectory, Authentication authentication, bool noFetch, string currentBranch)
1414
{
1515
using (var repo = new Repository(gitDirectory))
1616
{
1717
var remote = EnsureOnlyOneRemoteIsDefined(repo);
1818

1919
AddMissingRefSpecs(repo, remote);
2020

21-
Logger.WriteInfo(string.Format("Fetching from remote '{0}' using the following refspecs: {1}.",
22-
remote.Name, string.Join(", ", remote.FetchRefSpecs.Select(r => r.Specification))));
23-
24-
2521
//If noFetch is enabled, then GitVersion will assume that the git repository is normalized before execution, so that fetching from remotes is not required.
26-
if (!noFetch)
22+
if (noFetch)
2723
{
28-
Logger.WriteInfo("Skipping fetching");
24+
Logger.WriteInfo("Skipping fetching, if GitVersion does not calculate your version as expected you might need to allow fetching or use dynamic repositories");
25+
}
26+
else
27+
{
28+
Logger.WriteInfo(string.Format("Fetching from remote '{0}' using the following refspecs: {1}.",
29+
remote.Name, string.Join(", ", remote.FetchRefSpecs.Select(r => r.Specification))));
2930
var fetchOptions = BuildFetchOptions(authentication.Username, authentication.Password);
3031
repo.Network.Fetch(remote, fetchOptions);
3132
}
3233

34+
EnsureLocalBranchExistsForCurrentBranch(repo, currentBranch);
3335
CreateMissingLocalBranchesFromRemoteTrackingOnes(repo, remote.Name);
3436

3537
var headSha = repo.Refs.Head.TargetIdentifier;
@@ -41,13 +43,22 @@ public static void NormalizeGitDirectory(string gitDirectory, Authentication aut
4143
}
4244

4345
Logger.WriteInfo(string.Format("HEAD is detached and points at commit '{0}'.", headSha));
46+
Logger.WriteInfo(string.Format("Local Refs:\r\n" + string.Join(Environment.NewLine, repo.Refs.FromGlob("*").Select(r => r.CanonicalName))));
4447

4548
// In order to decide whether a fake branch is required or not, first check to see if any local branches have the same commit SHA of the head SHA.
4649
// If they do, go ahead and checkout that branch
4750
// If no, go ahead and check out a new branch, using the known commit SHA as the pointer
4851
var localBranchesWhereCommitShaIsHead = repo.Branches.Where(b => !b.IsRemote && b.Tip.Sha == headSha).ToList();
4952

50-
if (localBranchesWhereCommitShaIsHead.Count > 1)
53+
var matchingCurrentBranch = !string.IsNullOrEmpty(currentBranch)
54+
? localBranchesWhereCommitShaIsHead.SingleOrDefault(b => b.CanonicalName.Replace("/heads/", "/") == currentBranch.Replace("/heads/", "/"))
55+
: null;
56+
if (matchingCurrentBranch != null)
57+
{
58+
Logger.WriteInfo(string.Format("Checking out local branch '{0}'.", currentBranch));
59+
matchingCurrentBranch.Checkout();
60+
}
61+
else if (localBranchesWhereCommitShaIsHead.Count > 1)
5162
{
5263
var branchNames = localBranchesWhereCommitShaIsHead.Select(r => r.CanonicalName);
5364
var csvNames = string.Join(", ", branchNames);
@@ -88,6 +99,19 @@ public static void NormalizeGitDirectory(string gitDirectory, Authentication aut
8899
}
89100
}
90101

102+
static void EnsureLocalBranchExistsForCurrentBranch(Repository repo, string currentBranch)
103+
{
104+
if (string.IsNullOrEmpty(currentBranch)) return;
105+
var isBranch = currentBranch.Contains("refs/heads");
106+
var localCanonicalName = isBranch ? currentBranch : currentBranch.Replace("refs/", "refs/heads/");
107+
if (repo.Branches[localCanonicalName] != null) return;
108+
109+
Logger.WriteInfo(isBranch ?
110+
string.Format("Creating local branch {0}", localCanonicalName) :
111+
string.Format("Creating local branch {0} from ref {1}", localCanonicalName, currentBranch));
112+
repo.Refs.Add(localCanonicalName, repo.Head.Tip.Id);
113+
}
114+
91115
public static bool LooksLikeAValidPullRequestNumber(string issueNumber)
92116
{
93117
if (string.IsNullOrEmpty(issueNumber))
@@ -146,9 +170,13 @@ static void CreateFakeBranchPointingAtThePullRequestTip(Repository repo, Authent
146170
{
147171
var remote = repo.Network.Remotes.Single();
148172

149-
var remoteTips = string.IsNullOrEmpty(authentication.Username) ?
173+
Logger.WriteInfo("Fetching remote refs to see if there is a pull request ref");
174+
var remoteTips = (string.IsNullOrEmpty(authentication.Username) ?
150175
GetRemoteTipsForAnonymousUser(repo, remote) :
151-
GetRemoteTipsUsingUsernamePasswordCredentials(repo, remote, authentication.Username, authentication.Password);
176+
GetRemoteTipsUsingUsernamePasswordCredentials(repo, remote, authentication.Username, authentication.Password))
177+
.ToList();
178+
179+
Logger.WriteInfo(string.Format("Remote Refs:\r\n" + string.Join(Environment.NewLine, remoteTips.Select(r => r.CanonicalName))));
152180

153181
var headTipSha = repo.Head.Tip.Sha;
154182

src/GitVersionCore/BuildServers/IBuildServer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ public interface IBuildServer
99
string[] GenerateSetParameterMessage(string name, string value);
1010

1111
void WriteIntegration(Action<string> writer, VersionVariables variables);
12+
string GetCurrentBranch();
1213
}
13-
1414
}

src/GitVersionCore/BuildServers/Jenkins.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public override string GenerateSetVersionMessage(string versionToUseForBuildNumb
2626
return versionToUseForBuildNumber;
2727
}
2828

29+
public override string GetCurrentBranch() { return string.Empty; }
30+
2931
public override string[] GenerateSetParameterMessage(string name, string value)
3032
{
3133
return new[]

src/GitVersionCore/BuildServers/MyGet.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public override bool CanApplyToCurrentContext()
1313
&& buildRunner.Equals("MyGet", StringComparison.InvariantCultureIgnoreCase);
1414
}
1515

16+
public override string GetCurrentBranch() { return string.Empty; }
17+
1618
public override string[] GenerateSetParameterMessage(string name, string value)
1719
{
1820
var messages = new List<string>

src/GitVersionCore/BuildServers/TeamCity.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ public override bool CanApplyToCurrentContext()
99
return !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TEAMCITY_VERSION"));
1010
}
1111

12+
public override string GetCurrentBranch() { return string.Empty; }
13+
1214
public override string[] GenerateSetParameterMessage(string name, string value)
1315
{
1416
return new[]

src/GitVersionCore/BuildServers/VsoAgent.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ public override string[] GenerateSetParameterMessage(string name, string value)
1717
};
1818
}
1919

20+
public override string GetCurrentBranch()
21+
{
22+
return Environment.GetEnvironmentVariable("BUILD_SOURCEBRANCH");
23+
}
24+
2025
public override string GenerateSetVersionMessage(string versionToUseForBuildNumber)
2126
{
2227
// Note: the VSO agent does not yet support updating the build display number from a variable

src/GitVersionCore/ExecuteCore.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@ public static VersionVariables ExecuteGitVersion(IFileSystem fileSystem, string
1010
{
1111
// Normalise if we are running on build server
1212
var gitPreparer = new GitPreparer(targetUrl, dynamicRepositoryLocation, authentication, targetBranch, noFetch, workingDirectory);
13-
gitPreparer.Initialise(BuildServerList.GetApplicableBuildServers().Any());
13+
var applicableBuildServers = BuildServerList.GetApplicableBuildServers();
14+
var buildServer = applicableBuildServers.FirstOrDefault();
15+
var currentBranch = buildServer == null ? null : buildServer.GetCurrentBranch();
16+
if (!string.IsNullOrEmpty(currentBranch))
17+
{
18+
Logger.WriteInfo("Branch from build environment: " + currentBranch);
19+
}
20+
gitPreparer.Initialise(buildServer != null, currentBranch);
1421
var dotGitDirectory = gitPreparer.GetDotGitDirectory();
1522
var projectRoot = gitPreparer.GetProjectRootDirectory();
1623
Logger.WriteInfo(string.Format("Project root is: " + projectRoot));

src/GitVersionCore/Extensions/ExtensionMethods.git.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ public static string GetCanonicalBranchName(this string branchName)
66
{
77
if (branchName.IsPullRequest())
88
{
9-
branchName = branchName.Replace("pull-requests", "pull");
10-
branchName = branchName.Replace("pr", "pull");
9+
branchName = branchName.Replace("pull-requests/", "pull/");
10+
branchName = branchName.Replace("pr/", "pull/");
1111

1212
return string.Format("refs/{0}/head", branchName);
1313
}

src/GitVersionCore/GitPreparer.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,23 @@ public bool IsDynamicGitRepository
3131

3232
public string DynamicGitRepositoryPath { get; private set; }
3333

34-
public void Initialise(bool normaliseGitDirectory)
34+
public void Initialise(bool normaliseGitDirectory, string currentBranch)
3535
{
3636
if (string.IsNullOrWhiteSpace(targetUrl))
3737
{
3838
if (normaliseGitDirectory)
3939
{
40-
GitHelper.NormalizeGitDirectory(GetDotGitDirectory(), authentication, noFetch);
40+
GitHelper.NormalizeGitDirectory(GetDotGitDirectory(), authentication, noFetch, currentBranch);
4141
}
4242
return;
4343
}
4444

45-
var targetPath = CalculateTemporaryRepositoryPath(targetUrl, dynamicRepositoryLocation);
45+
var tempRepositoryPath = CalculateTemporaryRepositoryPath(targetUrl, dynamicRepositoryLocation);
4646

47-
DynamicGitRepositoryPath = CreateDynamicRepository(targetPath, authentication, targetUrl, targetBranch, noFetch);
47+
DynamicGitRepositoryPath = CreateDynamicRepository(tempRepositoryPath, authentication, targetUrl, targetBranch, noFetch);
4848
if (normaliseGitDirectory)
4949
{
50-
GitHelper.NormalizeGitDirectory(GetDotGitDirectory(), authentication, noFetch);
50+
GitHelper.NormalizeGitDirectory(GetDotGitDirectory(), authentication, noFetch, currentBranch);
5151
}
5252
}
5353

@@ -116,7 +116,7 @@ static string CreateDynamicRepository(string targetPath, Authentication authenti
116116
if (Directory.Exists(targetPath))
117117
{
118118
Logger.WriteInfo("Git repository already exists");
119-
GitHelper.NormalizeGitDirectory(gitDirectory, authentication, noFetch);
119+
GitHelper.NormalizeGitDirectory(gitDirectory, authentication, noFetch, null);
120120
Logger.WriteInfo(string.Format("Updating branch '{0}'", targetBranch));
121121
using (var repo = new Repository(targetPath))
122122
{
@@ -153,7 +153,7 @@ static string CreateDynamicRepository(string targetPath, Authentication authenti
153153
CloneRepository(repositoryUrl, gitDirectory, credentials);
154154

155155
// Normalize (download branches) before using the branch
156-
GitHelper.NormalizeGitDirectory(gitDirectory, authentication, noFetch);
156+
GitHelper.NormalizeGitDirectory(gitDirectory, authentication, noFetch, null);
157157

158158
using (var repository = new Repository(gitDirectory))
159159
{

src/GitVersionExe.Tests/GitPreparerTests.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void WorksCorrectlyWithRemoteRepository(string branchName, string expecte
5454
}
5555

5656
var gitPreparer = new GitPreparer(arguments.TargetUrl, arguments.DynamicRepositoryLocation, arguments.Authentication, arguments.TargetBranch, arguments.NoFetch, arguments.TargetPath);
57-
gitPreparer.Initialise(false);
57+
gitPreparer.Initialise(false, null);
5858
dynamicRepositoryPath = gitPreparer.GetDotGitDirectory();
5959

6060
gitPreparer.IsDynamicGitRepository.ShouldBe(true);
@@ -99,11 +99,11 @@ public void UpdatesExistingDynamicRepository()
9999
};
100100

101101
var gitPreparer = new GitPreparer(arguments.TargetUrl, arguments.DynamicRepositoryLocation, arguments.Authentication, arguments.TargetBranch, arguments.NoFetch, arguments.TargetPath);
102-
gitPreparer.Initialise(false);
102+
gitPreparer.Initialise(false, null);
103103
dynamicRepositoryPath = gitPreparer.GetDotGitDirectory();
104104

105105
var newCommit = mainRepositoryFixture.Repository.MakeACommit();
106-
gitPreparer.Initialise(false);
106+
gitPreparer.Initialise(false, null);
107107

108108
using (var repository = new Repository(dynamicRepositoryPath))
109109
{
@@ -146,7 +146,7 @@ public void PicksAnotherDirectoryNameWhenDynamicRepoFolderTaken()
146146
};
147147

148148
var gitPreparer = new GitPreparer(arguments.TargetUrl, arguments.DynamicRepositoryLocation, arguments.Authentication, arguments.TargetBranch, arguments.NoFetch, arguments.TargetPath);
149-
gitPreparer.Initialise(false);
149+
gitPreparer.Initialise(false, null);
150150

151151
gitPreparer.IsDynamicGitRepository.ShouldBe(true);
152152
gitPreparer.DynamicGitRepositoryPath.ShouldBe(expectedDynamicRepoLocation + "_1\\.git");
@@ -229,11 +229,11 @@ public void UsingDynamicRepositoryWithFeatureBranchWorks()
229229
};
230230

231231
var gitPreparer = new GitPreparer(arguments.TargetUrl, arguments.DynamicRepositoryLocation, arguments.Authentication, arguments.TargetBranch, arguments.NoFetch, arguments.TargetPath);
232-
gitPreparer.Initialise(true);
232+
gitPreparer.Initialise(true, null);
233233

234234
mainRepositoryFixture.Repository.CreateBranch("feature1").Checkout();
235235

236-
Assert.DoesNotThrow(() => gitPreparer.Initialise(true));
236+
Assert.DoesNotThrow(() => gitPreparer.Initialise(true, null));
237237
}
238238
}
239239
finally
@@ -264,9 +264,9 @@ public void UsingDynamicRepositoryWithoutTargetBranchFails()
264264
};
265265

266266
var gitPreparer = new GitPreparer(arguments.TargetUrl, arguments.DynamicRepositoryLocation, arguments.Authentication, arguments.TargetBranch, arguments.NoFetch, arguments.TargetPath);
267-
gitPreparer.Initialise(true);
267+
gitPreparer.Initialise(true, null);
268268

269-
Assert.Throws<Exception>(() => gitPreparer.Initialise(true));
269+
Assert.Throws<Exception>(() => gitPreparer.Initialise(true, null));
270270
}
271271
}
272272
finally
@@ -293,7 +293,7 @@ public void TestErrorThrownForInvalidRepository()
293293

294294
var gitPreparer = new GitPreparer(arguments.TargetUrl, arguments.DynamicRepositoryLocation, arguments.Authentication, arguments.TargetBranch, arguments.NoFetch, arguments.TargetPath);
295295

296-
Assert.Throws<Exception>(() => gitPreparer.Initialise(true));
296+
Assert.Throws<Exception>(() => gitPreparer.Initialise(true, null));
297297
}
298298
finally
299299
{

src/GitVersionExe/GitVersionExe.csproj

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
]]></Code>
133133
</Task>
134134
</UsingTask>
135-
<Target Name="AfterBuild" DependsOnTargets="Clean">
135+
<Target Name="AfterBuild" DependsOnTargets="Clean" Condition="$(nCrunch)==''">
136136
<!-- NugetExeBuild -->
137137
<MakeDir Directories="$(BuildDir)NuGetExeBuild" />
138138
<Copy SourceFiles="$(OutputPath)\GitVersion.pdb" DestinationFolder="$(BuildDir)NuGetExeBuild\tools" />
@@ -147,15 +147,13 @@
147147
<Copy SourceFiles="$(OutputPath)\GitVersion.exe" DestinationFolder="$(BuildDir)NuGetCommandLineBuild\tools" />
148148
<Copy SourceFiles="$(ProjectDir)NugetAssets\GitVersion.CommandLine.nuspec" DestinationFolder="$(BuildDir)NuGetCommandLineBuild" />
149149
<PepitaPackage.CreatePackageTask NuGetBuildDirectory="$(BuildDir)NuGetCommandLineBuild" MetadataAssembly="$(OutputPath)GitVersion.exe" Version="$(GitVersion_NuGetVersion)" />
150-
151-
<!-- VsoBuildTask -->
150+
<!-- VsoBuildTask -->
152151
<MakeDir Directories="$(BuildDir)GitVersionVsoTaskBuild" />
153152
<Copy SourceFiles="$(OutputPath)\GitVersion.pdb" DestinationFolder="$(BuildDir)GitVersionVsoTaskBuild" />
154153
<Copy SourceFiles="$(OutputPath)\GitVersion.exe" DestinationFolder="$(BuildDir)GitVersionVsoTaskBuild" />
155154
<Copy SourceFiles="$(ProjectDir)..\GitVersionVsoTask\icon.png" DestinationFolder="$(BuildDir)GitVersionVsoTaskBuild" />
156155
<Copy SourceFiles="$(ProjectDir)..\GitVersionVsoTask\task.json" DestinationFolder="$(BuildDir)GitVersionVsoTaskBuild" />
157156
<Exec Command="$(BuildDir)\Update-GitVersionVsoTaskVersion.ps1 $(BuildDir)GitVersionVsoTaskBuild\task.json $(GitVersion_Major) $(GitVersion_Minor) $(GitVersion_Patch)" ContinueOnError="True" WorkingDirectory="$(BuildDir)" Condition="'$(GitVersion_SemVer)' != ''" />
158-
159157
<!-- Gem -->
160158
<Copy SourceFiles="$(OutputPath)\GitVersion.pdb" DestinationFolder="$(BuildDir)GemBuild\bin" />
161159
<Copy SourceFiles="$(OutputPath)\GitVersion.exe" DestinationFolder="$(BuildDir)GemBuild\bin" />

0 commit comments

Comments
 (0)