From 07807d4845601e25b0c3ab0f2c0cd0e91f5b72e5 Mon Sep 17 00:00:00 2001 From: Philippe Miossec Date: Wed, 18 Sep 2013 10:04:47 +0200 Subject: [PATCH 1/3] Detect a rename changeset (where all the datas are deleted) and prevent it and Add Unit Test in ChangeSieveTests to support branch deletion --- GitTfs/Util/ChangeSieve.cs | 5 +++++ GitTfsTest/Core/ChangeSieveTests.cs | 31 ++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/GitTfs/Util/ChangeSieve.cs b/GitTfs/Util/ChangeSieve.cs index 81ae260b..0ccadc4d 100644 --- a/GitTfs/Util/ChangeSieve.cs +++ b/GitTfs/Util/ChangeSieve.cs @@ -84,6 +84,11 @@ namespace Sep.Git.Tfs.Util }; foreach (var change in NamedChanges) { + if (change.Change.Item.ItemType == TfsItemType.Folder + && change.GitPath == string.Empty + && change.Change.ChangeType.IncludesOneOf(TfsChangeType.Delete)) + return new List(); + // We only need the file changes because git only cares about files and if you make // changes to a folder in TFS, the changeset includes changes for all the descendant files anyway. if (change.Change.Item.ItemType != TfsItemType.File) diff --git a/GitTfsTest/Core/ChangeSieveTests.cs b/GitTfsTest/Core/ChangeSieveTests.cs index 0d81f1e2..67df87bb 100644 --- a/GitTfsTest/Core/ChangeSieveTests.cs +++ b/GitTfsTest/Core/ChangeSieveTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Sep.Git.Tfs.Core; @@ -138,6 +138,11 @@ namespace Sep.Git.Tfs.Test.Core return new FakeChange(TfsChangeType.Branch | TfsChangeType.Edit, TfsItemType.File, serverItem); } + public static IChange DeleteDir(string serverItem) + { + return new FakeChange(TfsChangeType.Delete, TfsItemType.Folder, serverItem); + } + const int ChangesetId = 10; TfsChangeType _tfsChangeType; @@ -524,5 +529,29 @@ namespace Sep.Git.Tfs.Test.Core ApplicableChange.Update("file8.txt")); } } + + public class WithDeleteMainFolderBranchAndSubItems : Base + { + public class Fixture : BaseFixture + { + public Fixture() + { + Changeset.Changes = new IChange[] { + FakeChange.Delete("$/Project/file1.txt"), + FakeChange.Delete("$/Project/file2.txt"), + FakeChange.Delete("$/Project/file3.txt"), + FakeChange.DeleteDir("$/Project/"), + FakeChange.Delete("$/Project/file4.txt"), + FakeChange.Delete("$/Project/file5.txt"), + }; + } + } + + [Fact] + public void WhenMainBranchFolderIsDeleted_ThenKeepFileInGitCommitByDoingNothing() + { + Assert.Equal(0, Subject.GetChangesToApply().Count()); + } + } } } From bdfe29ae3f22a070fde7bc74cce3860ce5c2b4dd Mon Sep 17 00:00:00 2001 From: Matt Burke Date: Tue, 25 Feb 2014 06:54:41 -0500 Subject: [PATCH 2/3] Ensure that other deleted directories don't affect this project. --- GitTfsTest/Core/ChangeSieveTests.cs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/GitTfsTest/Core/ChangeSieveTests.cs b/GitTfsTest/Core/ChangeSieveTests.cs index 67df87bb..19d5f79d 100644 --- a/GitTfsTest/Core/ChangeSieveTests.cs +++ b/GitTfsTest/Core/ChangeSieveTests.cs @@ -529,7 +529,6 @@ namespace Sep.Git.Tfs.Test.Core ApplicableChange.Update("file8.txt")); } } - public class WithDeleteMainFolderBranchAndSubItems : Base { public class Fixture : BaseFixture @@ -553,5 +552,29 @@ namespace Sep.Git.Tfs.Test.Core Assert.Equal(0, Subject.GetChangesToApply().Count()); } } + + public class WithDeleteOtherFolder : Base + { + public class Fixture : BaseFixture + { + public Fixture() + { + Changeset.Changes = new IChange[] { + FakeChange.Edit("$/Project/file1.txt"), + FakeChange.DeleteDir("$/Projec"), + FakeChange.Delete("$/Projec/file.txt"), + FakeChange.DeleteDir("$/Project2"), + FakeChange.Delete("$/Project2/file.txt"), + }; + } + } + + [Fact] + public void IncludesChangesInThisProject() + { + AssertChanges(Subject.GetChangesToApply(), + ApplicableChange.Update("file1.txt")); + } + } } } From 99907eb3fd235896a6ebc0c0e65816002660f603 Mon Sep 17 00:00:00 2001 From: Matt Burke Date: Tue, 25 Feb 2014 07:04:54 -0500 Subject: [PATCH 3/3] Also don't fetch anything if it's just going to be deleted and ignored. --- GitTfs/Util/ChangeSieve.cs | 30 +++++++++++++++++++++++------ GitTfsTest/Core/ChangeSieveTests.cs | 13 +++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/GitTfs/Util/ChangeSieve.cs b/GitTfs/Util/ChangeSieve.cs index 0ccadc4d..d857f5f3 100644 --- a/GitTfs/Util/ChangeSieve.cs +++ b/GitTfs/Util/ChangeSieve.cs @@ -60,13 +60,16 @@ namespace Sep.Git.Tfs.Util c.Change.Item.ItemType == TfsItemType.Folder && c.GitPath == string.Empty && c.Change.ChangeType.IncludesOneOf(TfsChangeType.Delete, TfsChangeType.Rename)); - } + } return _renameBranchCommmit.Value; } } public IEnumerable GetChangesToFetch() { + if (DeletesProject) + return Enumerable.Empty(); + if (RenameBranchCommmit) return new List(); @@ -75,6 +78,9 @@ namespace Sep.Git.Tfs.Util public IEnumerable GetChangesToApply() { + if (DeletesProject) + return Enumerable.Empty(); + if (RenameBranchCommmit) return new List(); @@ -84,11 +90,6 @@ namespace Sep.Git.Tfs.Util }; foreach (var change in NamedChanges) { - if (change.Change.Item.ItemType == TfsItemType.Folder - && change.GitPath == string.Empty - && change.Change.ChangeType.IncludesOneOf(TfsChangeType.Delete)) - return new List(); - // We only need the file changes because git only cares about files and if you make // changes to a folder in TFS, the changeset includes changes for all the descendant files anyway. if (change.Change.Item.ItemType != TfsItemType.File) @@ -119,6 +120,23 @@ namespace Sep.Git.Tfs.Util return compartments.Deleted.Concat(compartments.Updated); } + bool? _deletesProject; + private bool DeletesProject + { + get + { + if (!_deletesProject.HasValue) + { + _deletesProject = + NamedChanges.Any(change => + change.Change.Item.ItemType == TfsItemType.Folder + && change.GitPath == string.Empty + && change.Change.ChangeType.IncludesOneOf(TfsChangeType.Delete)); + } + return _deletesProject.Value; + } + } + class NamedChange { public GitObject Info { get; set; } diff --git a/GitTfsTest/Core/ChangeSieveTests.cs b/GitTfsTest/Core/ChangeSieveTests.cs index 19d5f79d..6b544de9 100644 --- a/GitTfsTest/Core/ChangeSieveTests.cs +++ b/GitTfsTest/Core/ChangeSieveTests.cs @@ -551,6 +551,13 @@ namespace Sep.Git.Tfs.Test.Core { Assert.Equal(0, Subject.GetChangesToApply().Count()); } + + [Fact] + public void DoNotFetch() + { + // Because we're not going to apply changes, don't waste time fetching any. + Assert.Equal(0, Subject.GetChangesToFetch().Count()); + } } public class WithDeleteOtherFolder : Base @@ -575,6 +582,12 @@ namespace Sep.Git.Tfs.Test.Core AssertChanges(Subject.GetChangesToApply(), ApplicableChange.Update("file1.txt")); } + + [Fact] + public void FetchesChangesInThisProject() + { + Assert.Equal(new string[] { "$/Project/file1.txt" }, Subject.GetChangesToFetch().Select(c => c.Item.ServerItem)); + } } } }