diff --git a/GitTfs/Util/ChangeSieve.cs b/GitTfs/Util/ChangeSieve.cs index ba67f04e..6f615dc9 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(); @@ -114,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 c3309a7a..d7c29f5c 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; @@ -148,6 +148,11 @@ namespace Sep.Git.Tfs.Test.Core return new FakeChange(TfsChangeType.Merge | TfsChangeType.Branch, TfsItemType.File, serverItem); } + public static IChange DeleteDir(string serverItem) + { + return new FakeChange(TfsChangeType.Delete, TfsItemType.Folder, serverItem); + } + const int ChangesetId = 10; TfsChangeType _tfsChangeType; @@ -570,5 +575,65 @@ namespace Sep.Git.Tfs.Test.Core ApplicableChange.Update("file10.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()); + } + + [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 + { + 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")); + } + + [Fact] + public void FetchesChangesInThisProject() + { + Assert.Equal(new string[] { "$/Project/file1.txt" }, Subject.GetChangesToFetch().Select(c => c.Item.ServerItem)); + } + } } }