From 8fa42f4a827b5fc4718c19c96557a9a37bb03a40 Mon Sep 17 00:00:00 2001 From: Philippe Miossec Date: Sun, 9 Mar 2014 11:42:57 +0100 Subject: [PATCH] bootstrap automatically the remote we are working on if needed --- GitTfs/Commands/Bootstrap.cs | 66 ++++++++++++++++++++---------------- GitTfs/GitTfs.cs | 18 ++++++---- 2 files changed, 49 insertions(+), 35 deletions(-) diff --git a/GitTfs/Commands/Bootstrap.cs b/GitTfs/Commands/Bootstrap.cs index a4e1df24..8cb0b6ec 100644 --- a/GitTfs/Commands/Bootstrap.cs +++ b/GitTfs/Commands/Bootstrap.cs @@ -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); diff --git a/GitTfs/GitTfs.cs b/GitTfs/GitTfs.cs index 70f6196d..f8c1bef1 100644 --- a/GitTfs/GitTfs.cs +++ b/GitTfs/GitTfs.cs @@ -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 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);