internal static List <StagedFile> ParseStagedFiles(string changedFiles) { var result = new List <StagedFile>(); var rows = changedFiles.Split("\n"); foreach (var row in rows) { var splittedRow = row.Split(null); if (splittedRow.Length != 2) { continue; } var type = splittedRow[0]; var path = splittedRow[1]; StagedFile file = new StagedFile(); file.Path = path; SetChangeType(type, file); result.Add(file); } return(result); }
private void FindDifferences(DirectoryInfo Directory, string Path, ConcurrentBag <string> Paths, ThreadPoolWorkQueue Queue) { // Recurse through subdirectories HashSet <string> RemainingSubDirectoryNames = new HashSet <string>(NameToSubDirectory.Keys); foreach (DirectoryInfo SubDirectory in Directory.EnumerateDirectories()) { WorkspaceDirectoryInfo StagedSubDirectory; if (NameToSubDirectory.TryGetValue(SubDirectory.Name, out StagedSubDirectory)) { RemainingSubDirectoryNames.Remove(SubDirectory.Name); Queue.Enqueue(() => StagedSubDirectory.FindDifferences(SubDirectory, String.Format("{0}{1}/", Path, SubDirectory.Name), Paths, Queue)); continue; } Paths.Add(String.Format("+{0}{1}/...", Path, SubDirectory.Name)); } foreach (string RemainingSubDirectoryName in RemainingSubDirectoryNames) { Paths.Add(String.Format("-{0}{1}/...", Path, RemainingSubDirectoryName)); } // Search through files HashSet <string> RemainingFileNames = new HashSet <string>(NameToFile.Keys); foreach (FileInfo File in Directory.EnumerateFiles()) { WorkspaceFileInfo StagedFile; if (!NameToFile.TryGetValue(File.Name, out StagedFile)) { Paths.Add(String.Format("+{0}{1}", Path, File.Name)); } else if (!StagedFile.MatchesAttributes(File)) { Paths.Add(String.Format("!{0}{1}", Path, File.Name)); RemainingFileNames.Remove(File.Name); } else { RemainingFileNames.Remove(File.Name); } } foreach (string RemainingFileName in RemainingFileNames) { Paths.Add(String.Format("-{0}{1}", Path, RemainingFileName)); } }
private static void SetChangeType(string type, StagedFile file) { switch (type) { case "A": file.ChangeType = ChangeType.Add; break; case "M": file.ChangeType = ChangeType.Modify; break; case "D": file.ChangeType = ChangeType.Delete; break; case "R": file.ChangeType = ChangeType.Rename; break; } }
private void Refresh(DirectoryInfo Info, ConcurrentBag <FileInfo> FilesToDelete, ConcurrentBag <DirectoryInfo> DirectoriesToDelete, ThreadPoolWorkQueue Queue) { // Recurse through subdirectories Dictionary <string, WorkspaceDirectoryInfo> NewNameToSubDirectory = new Dictionary <string, WorkspaceDirectoryInfo>(NameToSubDirectory.Count, NameToSubDirectory.Comparer); foreach (DirectoryInfo SubDirectoryInfo in Info.EnumerateDirectories()) { WorkspaceDirectoryInfo SubDirectory; if (NameToSubDirectory.TryGetValue(SubDirectoryInfo.Name, out SubDirectory)) { NewNameToSubDirectory.Add(SubDirectory.Name, SubDirectory); Queue.Enqueue(() => SubDirectory.Refresh(SubDirectoryInfo, FilesToDelete, DirectoriesToDelete, Queue)); } else { DirectoriesToDelete.Add(SubDirectoryInfo); } } NameToSubDirectory = NewNameToSubDirectory; // Figure out which files have changed. Dictionary <string, WorkspaceFileInfo> NewNameToFile = new Dictionary <string, WorkspaceFileInfo>(NameToFile.Count, NameToFile.Comparer); foreach (FileInfo File in Info.EnumerateFiles()) { WorkspaceFileInfo StagedFile; if (NameToFile.TryGetValue(File.Name, out StagedFile) && StagedFile.MatchesAttributes(File)) { NewNameToFile.Add(StagedFile.Name, StagedFile); } else { FilesToDelete.Add(File); } } NameToFile = NewNameToFile; }
public async ValueTask <Stream> OpenRead() { return(await StagedFile.OpenRead()); }
public Stream OpenRead() { return StagedFile.OpenRead(); }