From 461ddeb9a0a7130e9781ebf83954bbd28286834c Mon Sep 17 00:00:00 2001 From: Paul Miller Date: Sat, 18 Jun 2016 14:26:56 -0700 Subject: [PATCH] make including ignored files optional (still default to true) so users can opt out for perf reasons. Add unittests for that status option. --- LibGit2Sharp.Tests/StatusFixture.cs | 23 +++++++++++++++++++++++ LibGit2Sharp/RepositoryStatus.cs | 6 +++++- LibGit2Sharp/StatusOptions.cs | 10 ++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/LibGit2Sharp.Tests/StatusFixture.cs b/LibGit2Sharp.Tests/StatusFixture.cs index 018e88e4f..1fb0f889a 100644 --- a/LibGit2Sharp.Tests/StatusFixture.cs +++ b/LibGit2Sharp.Tests/StatusFixture.cs @@ -318,6 +318,29 @@ public void RetrievingTheStatusOfAnEmptyRepositoryHonorsTheGitIgnoreDirectives() } } + [Fact] + public void RetrievingTheStatusWithoutIncludeIgnoredIgnoresButDoesntInclude() + { + string repoPath = InitNewRepository(); + + using (var repo = new Repository(repoPath)) + { + const string relativePath = "look-ma.txt"; + Touch(repo.Info.WorkingDirectory, relativePath, "I'm going to be ignored!"); + var opt = new StatusOptions { IncludeIgnored = false }; + Assert.False(opt.IncludeIgnored); + RepositoryStatus status = repo.RetrieveStatus(opt); + Assert.Equal(new[] { relativePath }, status.Untracked.Select(s => s.FilePath)); + + Touch(repo.Info.WorkingDirectory, ".gitignore", "*.txt" + Environment.NewLine); + + RepositoryStatus newStatus = repo.RetrieveStatus(opt); + Assert.Equal(".gitignore", newStatus.Untracked.Select(s => s.FilePath).Single()); + + Assert.False(newStatus.Ignored.Any()); + } + } + [Fact] public void RetrievingTheStatusOfTheRepositoryHonorsTheGitIgnoreDirectives() { diff --git a/LibGit2Sharp/RepositoryStatus.cs b/LibGit2Sharp/RepositoryStatus.cs index a70212844..609a63b51 100644 --- a/LibGit2Sharp/RepositoryStatus.cs +++ b/LibGit2Sharp/RepositoryStatus.cs @@ -79,11 +79,15 @@ private static GitStatusOptions CreateStatusOptions(StatusOptions options) Version = 1, Show = (GitStatusShow)options.Show, Flags = - GitStatusOptionFlags.IncludeIgnored | GitStatusOptionFlags.IncludeUntracked | GitStatusOptionFlags.RecurseUntrackedDirs, }; + if (options.IncludeIgnored) + { + coreOptions.Flags |= GitStatusOptionFlags.IncludeIgnored; + } + if (options.DetectRenamesInIndex) { coreOptions.Flags |= diff --git a/LibGit2Sharp/StatusOptions.cs b/LibGit2Sharp/StatusOptions.cs index f389303af..bde54c168 100644 --- a/LibGit2Sharp/StatusOptions.cs +++ b/LibGit2Sharp/StatusOptions.cs @@ -35,6 +35,7 @@ public sealed class StatusOptions public StatusOptions() { DetectRenamesInIndex = true; + IncludeIgnored = true; } /// @@ -84,5 +85,14 @@ public StatusOptions() /// Unaltered meaning the file is identical in the working directory, the index and HEAD. /// public bool IncludeUnaltered { get; set; } + + /// + /// Include ignored files when scanning for status + /// + /// + /// ignored meaning present in .gitignore. Defaults to true for back compat but may improve perf to not include if you have thousands of ignored files. + /// + public bool IncludeIgnored { get; set; } + } }