Beispiel #1
0
        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));
            }
        }
Beispiel #3
0
        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;
        }
Beispiel #5
0
 public async ValueTask <Stream> OpenRead()
 {
     return(await StagedFile.OpenRead());
 }
Beispiel #6
0
 public Stream OpenRead()
 {
     return StagedFile.OpenRead();
 }