Ejemplo n.º 1
0
 public TraversedDirectoryEntry(DirectoryData directoryData, IList <FileName> childFileNames)
 {
     _directoryData  = directoryData;
     _childFileNames = childFileNames;
 }
Ejemplo n.º 2
0
 public DirectorySnapshot(DirectoryData directoryData, ReadOnlyCollection <DirectorySnapshot> childDirectories, ReadOnlyCollection <FileName> childFiles)
 {
     _directoryData    = directoryData;
     _childDirectories = childDirectories;
     _childFiles       = childFiles;
 }
Ejemplo n.º 3
0
        private DirectorySnapshot ApplyDirectorySnapshotDelta(
            ProjectProcessingData data,
            DirectorySnapshot oldDirectory)
        {
            var oldDirectoryPath = oldDirectory.DirectoryName.RelativePath;

            // Create lists of created dirs and files. We havet to access the file system to know
            // if each path is a file or a directory.
            List <IFileInfoSnapshot> createDirs   = null;
            List <IFileInfoSnapshot> createdFiles = null;

            foreach (var path in data.PathChanges.GetCreatedEntries(oldDirectoryPath).ToForeachEnum())
            {
                var info = _fileSystem.GetFileInfoSnapshot(data.Project.RootPath.Combine(path));
                if (info.IsDirectory)
                {
                    if (createDirs == null)
                    {
                        createDirs = new List <IFileInfoSnapshot>();
                    }
                    createDirs.Add(info);
                }
                else if (info.IsFile)
                {
                    if (createdFiles == null)
                    {
                        createdFiles = new List <IFileInfoSnapshot>();
                    }
                    createdFiles.Add(info);
                }
            }

            // Recursively create new directory entires for previous (non deleted)
            // entries.
            var childDirectories = oldDirectory.ChildDirectories
                                   .Where(dir => !data.PathChanges.IsDeleted(dir.DirectoryName.RelativePath))
                                   .Select(dir => ApplyDirectorySnapshotDelta(data, dir))
                                   .ToList();

            // Add created directories
            if (createDirs != null)
            {
                foreach (var info in createDirs.ToForeachEnum())
                {
                    var name          = data.FileSystemNameFactory.CreateDirectoryName(oldDirectory.DirectoryName, info.Path.FileName);
                    var childSnapshot = CreateDirectorySnapshot(data, name, info.IsSymLink);

                    // Note: File system change notifications are not always 100%
                    // reliable. We may get a "create" event for directory we already know
                    // about.
                    var index = childDirectories.FindIndex(x =>
                                                           SystemPathComparer.Instance.StringComparer.Equals(x.DirectoryName.RelativePath.FileName, name.RelativePath.FileName));
                    if (index >= 0)
                    {
                        childDirectories.RemoveAt(index);
                    }
                    childDirectories.Add(childSnapshot);
                }

                // We need to re-sort the array since we added new entries
                childDirectories.Sort((x, y) =>
                                      SystemPathComparer.Instance.StringComparer.Compare(x.DirectoryName.RelativePath.FileName, y.DirectoryName.RelativePath.FileName));
            }

            // Match non deleted files
            // Sepcial case: if no file deleted or created, just re-use the list.
            IList <FileName> newFileList;

            if (data.PathChanges.GetDeletedEntries(oldDirectoryPath).Count == 0 && createdFiles == null)
            {
                newFileList = oldDirectory.ChildFiles;
            }
            else
            {
                // Copy the list of previous children, minus deleted files.
                var newFileListTemp = oldDirectory.ChildFiles
                                      .Where(x => !data.PathChanges.IsDeleted(x.RelativePath))
                                      .ToList();

                // Add created files
                if (createdFiles != null)
                {
                    foreach (var info in createdFiles.ToForeachEnum())
                    {
                        var name = data.FileSystemNameFactory.CreateFileName(oldDirectory.DirectoryName, info.Path.FileName);
                        newFileListTemp.Add(name);
                    }

                    // We need to re-sort the array since we added new entries
                    newFileListTemp.Sort((x, y) =>
                                         SystemPathComparer.Instance.StringComparer.Compare(x.RelativePath.FileName, y.RelativePath.FileName));

                    // Note: File system change notifications are not always 100%
                    // reliable. We may get a "create" event for files we already know
                    // about.
                    ArrayUtilities.RemoveDuplicates(newFileListTemp, (x, y) =>
                                                    SystemPathComparer.Instance.StringComparer.Equals(x.RelativePath.FileName, y.RelativePath.FileName));
                }
                newFileList = newFileListTemp;
            }

            var newData = new DirectoryData(oldDirectory.DirectoryName, oldDirectory.IsSymLink);

            return(new DirectorySnapshot(
                       newData,
                       childDirectories.ToReadOnlyCollection(),
                       newFileList.ToReadOnlyCollection()));
        }
Ejemplo n.º 4
0
 public DirectorySnapshot(DirectoryData directoryData, ReadOnlyCollection<DirectorySnapshot> childDirectories, ReadOnlyCollection<FileName> childFiles) {
   _directoryData = directoryData;
   _childDirectories = childDirectories;
   _childFiles = childFiles;
 }