Skip to content

Added support for remote repositories (with and without authentication) #101

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Mar 20, 2014
Merged
Show file tree
Hide file tree
Changes from 10 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
36 changes: 30 additions & 6 deletions GitVersion/ArgumentParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ public static Arguments ParseArguments(List<string> commandLineArguments)
if (commandLineArguments.Count == 0)
{
return new Arguments
{
TargetPath = Environment.CurrentDirectory
};
{
TargetPath = Environment.CurrentDirectory
};
}

var firstArgument = commandLineArguments.First();
Expand All @@ -33,9 +33,9 @@ public static Arguments ParseArguments(List<string> commandLineArguments)
if (commandLineArguments.Count == 1)
{
return new Arguments
{
TargetPath = firstArgument
};
{
TargetPath = firstArgument
};
}

List<string> namedArguments;
Expand Down Expand Up @@ -64,6 +64,30 @@ public static Arguments ParseArguments(List<string> commandLineArguments)
continue;
}

if (IsSwitch("url", name))
{
arguments.TargetUrl = value;
continue;
}

if (IsSwitch("b", name))
{
arguments.TargetBranch = value;
continue;
}

if (IsSwitch("u", name))
{
arguments.Username = value;
continue;
}

if (IsSwitch("p", name))
{
arguments.Password = value;
continue;
}

if ((IsSwitch("v", name)) && VersionParts.Contains(value.ToLower()))
{
arguments.VersionPart = value.ToLower();
Expand Down
17 changes: 16 additions & 1 deletion GitVersion/Arguments.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,23 @@
namespace GitVersion
{
class Arguments
using System;

public class Arguments
{
public Arguments()
{
Username = Environment.GetEnvironmentVariable("GITVERSION_REMOTE_USERNAME");
Password = Environment.GetEnvironmentVariable("GITVERSION_REMOTE_PASSWORD");
}

public string TargetPath;

public string TargetUrl;
public string TargetBranch;

public string Username;
public string Password;

public bool IsHelp;
public string LogFilePath;
public string VersionPart;
Expand Down
33 changes: 33 additions & 0 deletions GitVersion/BuildServers/BuildServerBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
namespace GitVersion
{
using System;

public abstract class BuildServerBase : IBuildServer
{
public abstract bool CanApplyToCurrentContext();
public abstract void PerformPreProcessingSteps(string gitDirectory);
public abstract string GenerateSetVersionMessage(string versionToUseForBuildNumber);
public abstract string[] GenerateSetParameterMessage(string name, string value);

public virtual void WriteIntegration(VersionAndBranch versionAndBranch, Action<string> writer)
{
if (versionAndBranch == null)
{
return;
}

if (writer == null)
{
return;
}

writer(string.Format("Executing GenerateSetVersionMessage for '{0}'.", GetType().Name));
writer(GenerateSetVersionMessage(versionAndBranch.GenerateSemVer()));
writer(string.Format("Executing GenerateBuildLogOutput for '{0}'.", GetType().Name));
foreach (var buildParameter in BuildOutputFormatter.GenerateBuildLogOutput(versionAndBranch, this))
{
writer(buildParameter);
}
}
}
}
40 changes: 28 additions & 12 deletions GitVersion/BuildServers/BuildServerList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,50 @@

public static class BuildServerList
{
public static List<IBuildServer> BuildServers = new List<IBuildServer>
{
new ContinuaCi(),
new TeamCity()
};
static List<IBuildServer> BuildServers;

public static Func<IEnumerable<IBuildServer>> Selector = () => DefaultSelector();
public static Func<Arguments, IEnumerable<IBuildServer>> Selector = arguments => DefaultSelector(arguments);

public static void ResetSelector()
{
Selector = DefaultSelector;
}

public static IEnumerable<IBuildServer> GetApplicableBuildServers()
public static IEnumerable<IBuildServer> GetApplicableBuildServers(Arguments arguments)
{
return Selector();
return Selector(arguments);
}

static IEnumerable<IBuildServer> DefaultSelector()
static IEnumerable<IBuildServer> DefaultSelector(Arguments arguments)
{
if (BuildServers == null)
{
BuildServers = new List<IBuildServer>
{
new ContinuaCi(arguments),
new TeamCity(arguments)
};
}

var buildServices = new List<IBuildServer>();

foreach (var buildServer in BuildServers)
{
if (buildServer.CanApplyToCurrentContext())
try
{
if (buildServer.CanApplyToCurrentContext())
{
Logger.WriteInfo(string.Format("Applicable build agent found: '{0}'.", buildServer.GetType().Name));
buildServices.Add(buildServer);
}
}
catch (Exception ex)
{
Logger.WriteInfo(string.Format("Applicable build agent found: '{0}'.", buildServer.GetType().Name));
yield return buildServer;
Logger.WriteWarning(string.Format("Failed to check build server '{0}': {1}", buildServer.GetType().Name, ex.Message));
}
}

return buildServices;
}
}
}
45 changes: 34 additions & 11 deletions GitVersion/BuildServers/ContinuaCi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,61 @@
{
using Microsoft.Win32;

public class ContinuaCi : IBuildServer
public class ContinuaCi : BuildServerBase
{
public bool CanApplyToCurrentContext()
readonly Arguments _arguments;

public ContinuaCi(Arguments arguments)
{
_arguments = arguments;
}

public override bool CanApplyToCurrentContext()
{
using (var registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\VSoft Technologies\\Continua CI Agent"))
const string KeyName = @"Software\VSoft Technologies\Continua CI Agent";

if (RegistryKeyExists(KeyName, RegistryView.Registry32))
{
return true;
}

if (RegistryKeyExists(KeyName, RegistryView.Registry64))
{
return registryKey != null;
return true;
}

return false;
}

public void PerformPreProcessingSteps(string gitDirectory)
public override void PerformPreProcessingSteps(string gitDirectory)
{
if (string.IsNullOrEmpty(gitDirectory))
{
throw new ErrorException("Failed to find .git directory on agent");
}

GitHelper.NormalizeGitDirectory(gitDirectory);
GitHelper.NormalizeGitDirectory(gitDirectory, _arguments);
}

public string[] GenerateSetParameterMessage(string name, string value)
public override string[] GenerateSetParameterMessage(string name, string value)
{
return new []
return new[]
{
string.Format("@@continua[setVariable name='GitVersion.{0}' value='{1}']", name, value)
string.Format("@@continua[setVariable name='GitVersion_{0}' value='{1}']", name, value)
};
}

public string GenerateSetVersionMessage(string versionToUseForBuildNumber)
public override string GenerateSetVersionMessage(string versionToUseForBuildNumber)
{
return string.Format("@@continua[setBuildVersion value='{0}']", versionToUseForBuildNumber);
}
}

private static bool RegistryKeyExists(string keyName, RegistryView registryView)
{
var localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView);
localKey = localKey.OpenSubKey(keyName);

return localKey != null;
}
}
}
16 changes: 8 additions & 8 deletions GitVersion/BuildServers/GitHelper.cs
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
namespace GitVersion
{
using System;
using System.Linq;
using LibGit2Sharp;

public static class GitHelper
{
public static void NormalizeGitDirectory(string gitDirectory)
public static void NormalizeGitDirectory(string gitDirectory, Arguments arguments)
{
using (var repo = new Repository(gitDirectory))
{
Expand All @@ -15,7 +14,7 @@ public static void NormalizeGitDirectory(string gitDirectory)
Logger.WriteInfo(string.Format("Fetching from remote '{0}' using the following refspecs: {1}.",
remote.Name, string.Join(", ", remote.FetchRefSpecs.Select(r => r.Specification))));

var fetchOptions = BuildFetchOptions();
var fetchOptions = BuildFetchOptions(arguments.Username, arguments.Password);
repo.Network.Fetch(remote, fetchOptions);

CreateMissingLocalBranchesFromRemoteTrackingOnes(repo, remote.Name);
Expand All @@ -32,16 +31,17 @@ public static void NormalizeGitDirectory(string gitDirectory)
}
}

static FetchOptions BuildFetchOptions()
static FetchOptions BuildFetchOptions(string username, string password)
{
var username = Environment.GetEnvironmentVariable("GITVERSION_REMOTE_USERNAME");
var password = Environment.GetEnvironmentVariable("GITVERSION_REMOTE_PASSWORD");

var fetchOptions = new FetchOptions();

if (!string.IsNullOrEmpty(username))
{
fetchOptions.Credentials = new Credentials { Username = username, Password = password };
fetchOptions.Credentials = new Credentials
{
Username = username,
Password = password
};
}

return fetchOptions;
Expand Down
5 changes: 5 additions & 0 deletions GitVersion/BuildServers/IBuildServer.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
namespace GitVersion
{
using System;

public interface IBuildServer
{
bool CanApplyToCurrentContext();
void PerformPreProcessingSteps(string gitDirectory);
string GenerateSetVersionMessage(string versionToUseForBuildNumber);
string[] GenerateSetParameterMessage(string name, string value);

void WriteIntegration(VersionAndBranch versionAndBranch, Action<string> writer);
}

}
20 changes: 14 additions & 6 deletions GitVersion/BuildServers/TeamCity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,32 @@
{
using System;

public class TeamCity : IBuildServer
public class TeamCity : BuildServerBase
{
public bool CanApplyToCurrentContext()
readonly Arguments _arguments;

public TeamCity(Arguments arguments)
{
_arguments = arguments;
}


public override bool CanApplyToCurrentContext()
{
return !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TEAMCITY_VERSION"));
}

public void PerformPreProcessingSteps(string gitDirectory)
public override void PerformPreProcessingSteps(string gitDirectory)
{
if (string.IsNullOrEmpty(gitDirectory))
{
throw new ErrorException("Failed to find .git directory on agent. Please make sure agent checkout mode is enabled for you VCS roots - http://confluence.jetbrains.com/display/TCD8/VCS+Checkout+Mode");
}

GitHelper.NormalizeGitDirectory(gitDirectory);
GitHelper.NormalizeGitDirectory(gitDirectory, _arguments);
}

public string[] GenerateSetParameterMessage(string name, string value)
public override string[] GenerateSetParameterMessage(string name, string value)
{
return new[]
{
Expand All @@ -29,7 +37,7 @@ public string[] GenerateSetParameterMessage(string name, string value)
};
}

public string GenerateSetVersionMessage(string versionToUseForBuildNumber)
public override string GenerateSetVersionMessage(string versionToUseForBuildNumber)
{
return string.Format("##teamcity[buildNumber '{0}']", EscapeValue(versionToUseForBuildNumber));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,7 @@ int NumberOfCommitsInBranchNotKnownFromBaseBranch(
BranchType branchType,
string baseBranchName)
{
var baseTip = repo.Branches[baseBranchName].Tip;

var baseTip = repo.FindBranch(baseBranchName).Tip;
if (branch.Tip == baseTip)
{
// The branch bears no additional commit
Expand Down
Loading