private static IEnumerable <string> EnumerateFilesWithFilters(string path, IList <string> patterns,
                                                                      Gitignore gitignore, FileFilter filter)
        {
            DirectoryInfo di = new DirectoryInfo(path);

            // the root of the drive has the hidden attribute set, so don't stop on this hidden directory
            if (di.Attributes.HasFlag(FileAttributes.Hidden) && (di.Root != di))
            {
                yield break;
            }

            int startDepth = 0;

            if (filter.MaxSubfolderDepth > 0)
            {
                startDepth = GetDepth(di);
            }

            IEnumerable <string> directories = new string[] { path };

            if (filter.IncludeSubfolders)
            {
                directories = directories.Concat(EnumerateDirectoriesImpl(path, filter, startDepth, gitignore));
            }

            foreach (var directory in directories)
            {
                IEnumerable <string> matches = EnumerateFilesImpl(directory, patterns, filter, gitignore);

                foreach (var file in matches)
                {
                    yield return(file);
                }
            }
        }
        public static IEnumerable <string> EnumerateFiles(string path, IList <string> patterns,
                                                          Gitignore gitignore, FileFilter filter)
        {
            if (string.IsNullOrWhiteSpace(path) || !Directory.Exists(path))
            {
                return(Enumerable.Empty <string>());
            }

            if (patterns == null)
            {
                throw new ArgumentNullException(nameof(patterns));
            }
            if (filter == null)
            {
                throw new ArgumentNullException(nameof(filter));
            }

            bool simpleSearch = filter.IncludeHidden && filter.MaxSubfolderDepth == -1 &&
                                (gitignore == null || gitignore.IsEmpty) &&
                                string.IsNullOrWhiteSpace(filter.NamePatternToExclude);

            if (simpleSearch)
            {
                return(EnumerateAllFiles(path, patterns, filter.IncludeArchive, filter.IncludeSubfolders, filter.FollowSymlinks));
            }
            else
            {
                return(EnumerateFilesWithFilters(path, patterns, gitignore, filter));
            }
        }
Exemple #3
0
        public static Gitignore GetGitignore(IList <string> paths)
        {
            if (paths == null)
            {
                throw new ArgumentNullException(nameof(paths));
            }

            Gitignore results = new Gitignore();

            foreach (var path in paths)
            {
                results.Merge(GetGitignore(path));
            }

            return(results);
        }
Exemple #4
0
        public void Merge(Gitignore other)
        {
            if (other == null)
            {
                throw new ArgumentNullException(nameof(other));
            }

            foreach (var item in other.Directories)
            {
                if (!directories.Contains(item))
                {
                    directories.Add(item);
                }
            }

            foreach (var item in other.Files)
            {
                if (!files.Contains(item))
                {
                    files.Add(item);
                }
            }
        }
        private static IEnumerable <string> EnumerateFilesImpl(string path, IList <string> patterns,
                                                               FileFilter filter, Gitignore gitignore)
        {
            DirectoryEnumerationFilters fileFilters = new DirectoryEnumerationFilters
            {
                ErrorFilter = (errorCode, errorMessage, pathProcessed) =>
                {
                    logger.Error($"Find file error {errorCode}: {errorMessage} on {pathProcessed}");
                    return(true);
                }
            };


            bool includeAllFiles = (patterns.Count == 0 ||
                                    (patterns.Count == 1 && (patterns[0] == "*.*" || patterns[0] == "*"))) &&
                                   (gitignore == null || gitignore.Files.Count == 0);

            if (includeAllFiles)
            {
                fileFilters.InclusionFilter = fsei =>
                {
                    if (!filter.IncludeHidden && fsei.IsHidden)
                    {
                        return(false);
                    }

                    return(true);
                };
            }
            else
            {
                fileFilters.InclusionFilter = fsei =>
                {
                    if (!filter.IncludeHidden && fsei.IsHidden)
                    {
                        return(false);
                    }

                    if (gitignore != null && gitignore.Files.Contains(fsei.FullPath))
                    {
                        return(false);
                    }

                    foreach (string pattern in patterns)
                    {
                        if (WildcardMatch(fsei.FileName, pattern, true))
                        {
                            return(true);
                        }
                    }

                    if (filter.IncludeArchive)
                    {
                        foreach (string pattern in ArchiveDirectory.Patterns)
                        {
                            if (WildcardMatch(fsei.FileName, pattern, true))
                            {
                                return(true);
                            }
                        }
                    }
                    return(false);
                };
            }

            var fileOptions = baseFileOptions;

            if (filter.FollowSymlinks)
            {
                fileOptions &= ~DirectoryEnumerationOptions.SkipReparsePoints;
            }

            return(Directory.EnumerateFiles(path, fileOptions, fileFilters, PathFormat.FullPath));
        }
        private static IEnumerable <string> EnumerateDirectoriesImpl(string path,
                                                                     FileFilter filter, int startDepth, Gitignore gitignore)
        {
            var dirOptions = baseDirOptions;

            if (filter.IncludeSubfolders)
            {
                dirOptions |= DirectoryEnumerationOptions.Recursive;
            }
            if (filter.FollowSymlinks)
            {
                dirOptions &= ~DirectoryEnumerationOptions.SkipReparsePoints;
            }

            DirectoryEnumerationFilters dirFilters = new DirectoryEnumerationFilters
            {
                ErrorFilter = (errorCode, errorMessage, pathProcessed) =>
                {
                    logger.Error($"Find file error {errorCode}: {errorMessage} on {pathProcessed}");
                    return(true);
                },

                RecursionFilter = fsei =>
                {
                    if (gitignore != null && gitignore.Directories.Contains(fsei.FullPath))
                    {
                        return(false);
                    }

                    if (!filter.IncludeHidden && fsei.IsHidden)
                    {
                        return(false);
                    }

                    if (filter.MaxSubfolderDepth >= 0)
                    {
                        int depth = GetDepth(new DirectoryInfo(fsei.FullPath));
                        if (depth - startDepth > filter.MaxSubfolderDepth)
                        {
                            return(false);
                        }
                    }

                    if (filter.UseGitIgnore && fsei.FileName == ".git")
                    {
                        return(false);
                    }

                    return(true);
                },

                InclusionFilter = fsei =>
                {
                    if (gitignore != null && gitignore.Directories.Contains(fsei.FullPath))
                    {
                        return(false);
                    }

                    if (!filter.IncludeHidden && fsei.IsHidden)
                    {
                        return(false);
                    }

                    if (filter.MaxSubfolderDepth >= 0)
                    {
                        int depth = GetDepth(new DirectoryInfo(fsei.FullPath));
                        if (depth - startDepth > filter.MaxSubfolderDepth)
                        {
                            return(false);
                        }
                    }

                    if (filter.UseGitIgnore && fsei.FileName == ".git")
                    {
                        return(false);
                    }

                    return(true);
                },
            };

            return(Directory.EnumerateDirectories(path, dirOptions, dirFilters, PathFormat.FullPath));
        }