public void ModifiedPathsCorrectAfterHardLinking(FileSystemRunner fileSystem) { string[] expectedModifiedFilesContentsAfterHardlinks = { "A .gitattributes", "A LinkToReadme.md", "A LinkToFileOutsideSrc.txt", "A Readme.md", "A GVFS/GVFS/Program.cs", }; // Create a link from src\LinkToReadme.md to src\Readme.md string existingFileInRepoPath = this.Enlistment.GetVirtualPathTo("Readme.md"); string contents = existingFileInRepoPath.ShouldBeAFile(fileSystem).WithContents(); string hardLinkToFileInRepoPath = this.Enlistment.GetVirtualPathTo("LinkToReadme.md"); hardLinkToFileInRepoPath.ShouldNotExistOnDisk(fileSystem); fileSystem.CreateHardLink(hardLinkToFileInRepoPath, existingFileInRepoPath); hardLinkToFileInRepoPath.ShouldBeAFile(fileSystem).WithContents(contents); // Create a link from src\LinkToFileOutsideSrc.txt to FileOutsideRepo.txt string fileOutsideOfRepoPath = Path.Combine(this.Enlistment.EnlistmentRoot, "FileOutsideRepo.txt"); string fileOutsideOfRepoContents = "File outside of repo"; fileOutsideOfRepoPath.ShouldNotExistOnDisk(fileSystem); fileSystem.WriteAllText(fileOutsideOfRepoPath, fileOutsideOfRepoContents); string hardLinkToFileOutsideRepoPath = this.Enlistment.GetVirtualPathTo("LinkToFileOutsideSrc.txt"); hardLinkToFileOutsideRepoPath.ShouldNotExistOnDisk(fileSystem); fileSystem.CreateHardLink(hardLinkToFileOutsideRepoPath, fileOutsideOfRepoPath); hardLinkToFileOutsideRepoPath.ShouldBeAFile(fileSystem).WithContents(fileOutsideOfRepoContents); // Create a link from LinkOutsideSrcToInsideSrc.cs to src\GVFS\GVFS\Program.cs string secondFileInRepoPath = this.Enlistment.GetVirtualPathTo("GVFS", "GVFS", "Program.cs"); contents = secondFileInRepoPath.ShouldBeAFile(fileSystem).WithContents(); string hardLinkOutsideRepoToFileInRepoPath = Path.Combine(this.Enlistment.EnlistmentRoot, "LinkOutsideSrcToInsideSrc.cs"); hardLinkOutsideRepoToFileInRepoPath.ShouldNotExistOnDisk(fileSystem); fileSystem.CreateHardLink(hardLinkOutsideRepoToFileInRepoPath, secondFileInRepoPath); hardLinkOutsideRepoToFileInRepoPath.ShouldBeAFile(fileSystem).WithContents(contents); this.Enlistment.WaitForBackgroundOperations(); string modifiedPathsDatabase = Path.Combine(this.Enlistment.DotGVFSRoot, TestConstants.Databases.ModifiedPaths); modifiedPathsDatabase.ShouldBeAFile(fileSystem); using (StreamReader reader = new StreamReader(File.Open(modifiedPathsDatabase, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) { reader.ReadToEnd().Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).OrderBy(x => x) .ShouldMatchInOrder(expectedModifiedFilesContentsAfterHardlinks.OrderBy(x => x)); } }
public void ModifiedPathsCorrectAfterHardLinking(FileSystemRunner fileSystem) { const string ExpectedModifiedFilesContentsAfterHardlinks = @"A .gitattributes A LinkToReadme.md A LinkToFileOutsideSrc.txt "; // Create a link from src\LinkToReadme.md to src\Readme.md string existingFileInRepoPath = this.Enlistment.GetVirtualPathTo("Readme.md"); string contents = existingFileInRepoPath.ShouldBeAFile(fileSystem).WithContents(); string hardLinkToFileInRepoPath = this.Enlistment.GetVirtualPathTo("LinkToReadme.md"); hardLinkToFileInRepoPath.ShouldNotExistOnDisk(fileSystem); fileSystem.CreateHardLink(hardLinkToFileInRepoPath, existingFileInRepoPath); hardLinkToFileInRepoPath.ShouldBeAFile(fileSystem).WithContents(contents); // Create a link from src\LinkToFileOutsideSrc.txt to FileOutsideRepo.txt string fileOutsideOfRepoPath = Path.Combine(this.Enlistment.EnlistmentRoot, "FileOutsideRepo.txt"); string fileOutsideOfRepoContents = "File outside of repo"; fileOutsideOfRepoPath.ShouldNotExistOnDisk(fileSystem); fileSystem.WriteAllText(fileOutsideOfRepoPath, fileOutsideOfRepoContents); string hardLinkToFileOutsideRepoPath = this.Enlistment.GetVirtualPathTo("LinkToFileOutsideSrc.txt"); hardLinkToFileOutsideRepoPath.ShouldNotExistOnDisk(fileSystem); fileSystem.CreateHardLink(hardLinkToFileOutsideRepoPath, fileOutsideOfRepoPath); hardLinkToFileOutsideRepoPath.ShouldBeAFile(fileSystem).WithContents(fileOutsideOfRepoContents); // Create a link from LinkOutsideSrcToInsideSrc.cs to src\GVFS\GVFS\Program.cs string secondFileInRepoPath = this.Enlistment.GetVirtualPathTo("GVFS", "GVFS", "Program.cs"); contents = secondFileInRepoPath.ShouldBeAFile(fileSystem).WithContents(); string hardLinkOutsideRepoToFileInRepoPath = Path.Combine(this.Enlistment.EnlistmentRoot, "LinkOutsideSrcToInsideSrc.cs"); hardLinkOutsideRepoToFileInRepoPath.ShouldNotExistOnDisk(fileSystem); fileSystem.CreateHardLink(hardLinkOutsideRepoToFileInRepoPath, secondFileInRepoPath); hardLinkOutsideRepoToFileInRepoPath.ShouldBeAFile(fileSystem).WithContents(contents); string modifiedPathsDatabase = Path.Combine(this.Enlistment.DotGVFSRoot, TestConstants.Databases.ModifiedPaths); modifiedPathsDatabase.ShouldBeAFile(fileSystem); using (StreamReader reader = new StreamReader(File.Open(modifiedPathsDatabase, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) { reader.ReadToEnd().ShouldEqual(ExpectedModifiedFilesContentsAfterHardlinks); } }