Index: E:/Source/OpenSource/ccnet-svn-trunk/project/core/sourcecontrol/FileSourceControl.cs =================================================================== --- E:/Source/OpenSource/ccnet-svn-trunk/project/core/sourcecontrol/FileSourceControl.cs (revision 3607) +++ E:/Source/OpenSource/ccnet-svn-trunk/project/core/sourcecontrol/FileSourceControl.cs (working copy) @@ -28,6 +28,12 @@ [ReflectorProperty("autoGetSource", Required = false)] public bool AutoGetSource = false; + [ReflectorProperty("workingDirectory", Required = false)] + public string WorkingDirectory = string.Empty; + + [ReflectorProperty("removeDeletedFiles", Required = false)] + public bool RemoveDeletedFiles = false; + public Modification[] GetModifications(IIntegrationResult from, IIntegrationResult to) { DirectoryInfo root = new DirectoryInfo(from.BaseFromWorkingDirectory(RepositoryRoot)); @@ -84,7 +90,16 @@ public void GetSource(IIntegrationResult result) { if (AutoGetSource) - fileSystem.Copy(RepositoryRoot, result.WorkingDirectory); + { + string destinationDirectory = result.BaseFromWorkingDirectory(WorkingDirectory); + + if (RemoveDeletedFiles && fileSystem.DirectoryExists(destinationDirectory)) + { + fileSystem.DeleteDirectory(destinationDirectory, true); + } + + fileSystem.Copy(RepositoryRoot, destinationDirectory); + } } public void Initialize(IProject project) Index: E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/SourceControl/FileSourceControlTest.cs =================================================================== --- E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/SourceControl/FileSourceControlTest.cs (revision 3607) +++ E:/Source/OpenSource/ccnet-svn-trunk/project/UnitTests/Core/SourceControl/FileSourceControlTest.cs (working copy) @@ -119,6 +119,34 @@ } [Test] + public void ShouldAllowWorkingDirectorySubDirectoryToBeSpecifiedForGetSource() + { + IntegrationResult result = (IntegrationResult)Integration("foo", "myWorkingDirectory", "myArtifactDirectory"); + sc.AutoGetSource = true; + sc.WorkingDirectory = "WorkingDirectory"; + + fileSystemMock.Expect("Copy", tempRoot.ToString(), "myWorkingDirectory\\WorkingDirectory"); + + sc.GetSource(result); + + fileSystemMock.Verify(); + } + + [Test] + public void ShouldAllowWorkingDirectoryToBeSpecifiedForGetSource() + { + IntegrationResult result = (IntegrationResult)Integration("foo", "myWorkingDirectory", "myArtifactDirectory"); + sc.AutoGetSource = true; + sc.WorkingDirectory = "Z:\\WorkingDirectory"; + + fileSystemMock.Expect("Copy", tempRoot.ToString(), "Z:\\WorkingDirectory"); + + sc.GetSource(result); + + fileSystemMock.Verify(); + } + + [Test] public void ShouldNotCopySourceIfAutoGetSourceNotBeenSetToTrue() { IIntegrationResult result = Integration("foo", "myWorkingDirectory", "myArtifactDirectory"); @@ -129,6 +157,37 @@ fileSystemMock.Verify(); } + [Test] + public void ShouldRemoveWorkingDirectoryBeforeCopyIfRequestedForGetSource() + { + IntegrationResult result = (IntegrationResult)Integration("foo", "myWorkingDirectory", "myArtifactDirectory"); + sc.AutoGetSource = true; + sc.RemoveDeletedFiles = true; + + fileSystemMock.ExpectAndReturn("DirectoryExists", true, "myWorkingDirectory"); + fileSystemMock.Expect("DeleteDirectory", "myWorkingDirectory", true); + fileSystemMock.Expect("Copy", tempRoot.ToString(), "myWorkingDirectory"); + + sc.GetSource(result); + + fileSystemMock.Verify(); + } + + [Test] + public void ShouldNotRemoveMissingWorkingDirectoryBeforeCopyIfRequestedForGetSource() + { + IntegrationResult result = (IntegrationResult)Integration("foo", "myWorkingDirectory", "myArtifactDirectory"); + sc.AutoGetSource = true; + sc.RemoveDeletedFiles = true; + + fileSystemMock.ExpectAndReturn("DirectoryExists", false, "myWorkingDirectory"); + fileSystemMock.Expect("Copy", tempRoot.ToString(), "myWorkingDirectory"); + + sc.GetSource(result); + + fileSystemMock.Verify(); + } + private IntegrationResult IntegrationResult(DateTime date) { return IntegrationResultMother.CreateSuccessful(date);