bootstrap automatically the remote we are working on if needed

This commit is contained in:
Philippe Miossec
2014-03-09 11:42:57 +01:00
parent 69eb7f2405
commit 8fa42f4a82
2 changed files with 49 additions and 35 deletions
+37 -29
View File
@@ -44,47 +44,55 @@ namespace Sep.Git.Tfs.Commands
commit.AuthorAndEmail.Item1, commit.AuthorAndEmail.Item2,
commit.When.ToString("ddd MMM d HH:mm:ss zzz"),
commit.Message.Replace("\n","\n ").TrimEnd(' '));
if (parent.Remote.IsDerived)
{
var remoteId = GetRemoteId(parent);
var remote = _globals.Repository.CreateTfsRemote(new RemoteInfo
{
Id = remoteId,
Url = parent.Remote.TfsUrl,
Repository = parent.Remote.TfsRepositoryPath,
RemoteOptions = _remoteOptions,
}, string.Empty);
remote.UpdateTfsHead(parent.GitCommit, parent.ChangesetId);
_stdout.WriteLine("-> new remote '" + remote.Id + "'");
}
else
{
if (parent.Remote.MaxChangesetId < parent.ChangesetId)
{
long oldChangeset = parent.Remote.MaxChangesetId;
_globals.Repository.MoveTfsRefForwardIfNeeded(parent.Remote);
_stdout.WriteLine("-> existing remote {0} (updated from changeset {1})", parent.Remote.Id, oldChangeset);
}
else
{
_stdout.WriteLine("-> existing remote {0} (up to date)", parent.Remote.Id);
}
}
CreateRemote(parent);
_stdout.WriteLine();
}
return GitTfsExitCodes.OK;
}
private string GetRemoteId(TfsChangesetInfo parent)
public IGitTfsRemote CreateRemote(TfsChangesetInfo changeset)
{
IGitTfsRemote remote;
if (changeset.Remote.IsDerived)
{
var remoteId = GetRemoteId(changeset);
remote = _globals.Repository.CreateTfsRemote(new RemoteInfo
{
Id = remoteId,
Url = changeset.Remote.TfsUrl,
Repository = changeset.Remote.TfsRepositoryPath,
RemoteOptions = _remoteOptions,
}, string.Empty);
remote.UpdateTfsHead(changeset.GitCommit, changeset.ChangesetId);
_stdout.WriteLine("-> new remote '" + remote.Id + "'");
}
else
{
remote = changeset.Remote;
if (changeset.Remote.MaxChangesetId < changeset.ChangesetId)
{
long oldChangeset = changeset.Remote.MaxChangesetId;
_globals.Repository.MoveTfsRefForwardIfNeeded(changeset.Remote);
_stdout.WriteLine("-> existing remote {0} (updated from changeset {1})", changeset.Remote.Id, oldChangeset);
}
else
{
_stdout.WriteLine("-> existing remote {0} (up to date)", changeset.Remote.Id);
}
}
return remote;
}
private string GetRemoteId(TfsChangesetInfo changeset)
{
if (IsAvailable(GitTfsConstants.DefaultRepositoryId))
{
_stdout.WriteLine("info: '" + parent.Remote.TfsRepositoryPath + "' will be bootstraped as your main remote...");
_stdout.WriteLine("info: '" + changeset.Remote.TfsRepositoryPath + "' will be bootstraped as your main remote...");
return GitTfsConstants.DefaultRepositoryId;
}
//Remove '$/'!
var expectedRemoteId = parent.Remote.TfsRepositoryPath.Substring(2).Trim('/');
var expectedRemoteId = changeset.Remote.TfsRepositoryPath.Substring(2).Trim('/');
var indexOfSlash = expectedRemoteId.IndexOf('/');
if (indexOfSlash != 0)
expectedRemoteId = expectedRemoteId.Substring(indexOfSlash + 1);
+12 -6
View File
@@ -22,8 +22,10 @@ namespace Sep.Git.Tfs
private readonly GitTfsCommandRunner _runner;
private readonly Globals _globals;
private TextWriter _stdout;
private Bootstrap _bootstrap;
public GitTfs(ITfsHelper tfsHelper, GitTfsCommandFactory commandFactory, IHelpHelper help, IContainer container, IGitTfsVersionProvider gitTfsVersionProvider, GitTfsCommandRunner runner, Globals globals , TextWriter stdout)
public GitTfs(ITfsHelper tfsHelper, GitTfsCommandFactory commandFactory, IHelpHelper help, IContainer container,
IGitTfsVersionProvider gitTfsVersionProvider, GitTfsCommandRunner runner, Globals globals, TextWriter stdout, Bootstrap bootstrap)
{
this.tfsHelper = tfsHelper;
this.commandFactory = commandFactory;
@@ -33,6 +35,7 @@ namespace Sep.Git.Tfs
_runner = runner;
_globals = globals;
_stdout = stdout;
_bootstrap = bootstrap;
}
public int Run(IList<string> args)
@@ -56,8 +59,8 @@ namespace Sep.Git.Tfs
{
throw new Exception("error: you can't use -i and -I option in the same time!");
}
var remotes = _globals.Repository.GetLastParentTfsCommits("HEAD");
if (!remotes.Any())
var changesetsWithRemote = _globals.Repository.GetLastParentTfsCommits("HEAD");
if (!changesetsWithRemote.Any())
{
var allRemotes = _globals.Repository.ReadAllTfsRemotes();
if (!allRemotes.Any())
@@ -72,9 +75,12 @@ namespace Sep.Git.Tfs
throw new Exception("error: can't find a tfs remote to use\n No TFS parents found and more than one tfs remote defined in the repository!"
+ "\n Use '-i' option to define which one to use.");
}
var foundRemote = remotes.First().Remote;
if(foundRemote.IsDerived)
_stdout.WriteLine("Need to bootstrap: " + foundRemote.RemoteRef);
var foundRemote = changesetsWithRemote.First().Remote;
if (foundRemote.IsDerived)
{
_stdout.WriteLine("Bootstraping tfs remote...");
foundRemote = _bootstrap.CreateRemote(changesetsWithRemote.First());
}
_globals.UserSpecifiedRemoteId = foundRemote.Id;
_stdout.WriteLine("Working with tfs remote: " + _globals.RemoteId);