From 664202ef81a48513fc499b5cffdd67e849b149af Mon Sep 17 00:00:00 2001 From: Gordon Burgett Date: Wed, 10 Apr 2013 12:14:41 -0500 Subject: [PATCH] added "subtree split", which splits and also advances TFS refs as necessary Signed-off-by: Gordon Burgett --- GitTfs/Commands/Subtree.cs | 46 ++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/GitTfs/Commands/Subtree.cs b/GitTfs/Commands/Subtree.cs index 6f535276..7c2e9667 100644 --- a/GitTfs/Commands/Subtree.cs +++ b/GitTfs/Commands/Subtree.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; @@ -71,9 +71,11 @@ namespace Sep.Git.Tfs.Commands case "pull": return DoPull(args.ElementAtOrDefault(1)); + case "split": + return DoSplit(); default: - _stdout.WriteLine("Expected one of [add, pull, merge, split]"); + _stdout.WriteLine("Expected one of [add, pull, split]"); return GitTfsExitCodes.InvalidArguments; break; } @@ -173,11 +175,7 @@ namespace Sep.Git.Tfs.Commands public int DoPull(string remoteId) { - if (!Directory.Exists(Prefix)) - { - _stdout.WriteLine("You must first add the subtree using 'git tfs subtree add -p= [tfs-server] [tfs-repository]'"); - return GitTfsExitCodes.InvalidArguments; - } + ValidatePrefix(); remoteId = remoteId ?? string.Format(GitTfsConstants.RemoteSubtreeFormat, _globals.RemoteId ?? GitTfsConstants.DefaultRepositoryId, Prefix); IGitTfsRemote remote = _globals.Repository.ReadTfsRemote(remoteId); @@ -194,6 +192,40 @@ namespace Sep.Git.Tfs.Commands return result; } + public int DoSplit() + { + ValidatePrefix(); + + var p = Prefix.Replace(" ", "\\ "); + List args = new List() { "subtree", "split", "--prefix=" + p, "-b", p }; + command(args); + args = new List() { "checkout", p }; + command(args); + + //update subtree refs if needed + var owners = _globals.Repository.GetLastParentTfsCommits("HEAD").Where(x => !x.Remote.IsSubtree && x.Remote.TfsRepositoryPath == null).ToList(); + foreach (var subtree in _globals.Repository.ReadAllTfsRemotes().Where(x => x.IsSubtree && string.Equals(x.Prefix, Prefix))) + { + var updateTo = owners.FirstOrDefault(x => string.Equals(x.Remote.Id, subtree.OwningRemoteId)); + if (updateTo != null && updateTo.ChangesetId > subtree.MaxChangesetId) + { + subtree.UpdateRef(updateTo.GitCommit, updateTo.ChangesetId); + } + } + + return GitTfsExitCodes.OK; + } + + private void ValidatePrefix() + { + if (!Directory.Exists(Prefix)) + { + throw new GitTfsException(string.Format("Directory {0} does not exist", Prefix)) + .WithRecommendation("Add the subtree using 'git tfs subtree add -p= [tfs-server] [tfs-repository]'"); + } + } + + private void command(List args) { _stdout.WriteLine("git " + string.Join(" ", args));