diff options
author | nulltoken <emeric.fermas@gmail.com> | 2015-04-15 21:11:06 +0300 |
---|---|---|
committer | nulltoken <emeric.fermas@gmail.com> | 2015-04-15 21:11:06 +0300 |
commit | 40de6945028bb112eda279608a764e5afb3a45fb (patch) | |
tree | f596281d6c49ce82580f244204f79dbfe1e5aa6d | |
parent | 420bc9123a9354cd7c2b3aba34e9c037277bedd3 (diff) | |
parent | 11da2fa1b9e79bb87a19e3945fab721ab72c203a (diff) |
Merge pull request #863 from libgit2/therzok/statusUnmodified
Introduce StatusOptions.IncludeUnaltered
-rw-r--r-- | LibGit2Sharp.Tests/StatusFixture.cs | 60 | ||||
-rw-r--r-- | LibGit2Sharp/RepositoryStatus.cs | 36 | ||||
-rw-r--r-- | LibGit2Sharp/StatusOptions.cs | 8 |
3 files changed, 88 insertions, 16 deletions
diff --git a/LibGit2Sharp.Tests/StatusFixture.cs b/LibGit2Sharp.Tests/StatusFixture.cs index e8f9d731..476dab8b 100644 --- a/LibGit2Sharp.Tests/StatusFixture.cs +++ b/LibGit2Sharp.Tests/StatusFixture.cs @@ -103,20 +103,22 @@ namespace LibGit2Sharp.Tests } } - [Fact] - public void CanRetrieveTheStatusOfTheWholeWorkingDirectory() + [Theory] + [InlineData(false, 0)] + [InlineData(true, 5)] + public void CanRetrieveTheStatusOfTheWholeWorkingDirectory(bool includeUnaltered, int unalteredCount) { string path = SandboxStandardTestRepo(); using (var repo = new Repository(path)) { const string file = "modified_staged_file.txt"; - RepositoryStatus status = repo.RetrieveStatus(); + RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = includeUnaltered }); Assert.Equal(FileStatus.Staged, status[file].State); Assert.NotNull(status); - Assert.Equal(6, status.Count()); + Assert.Equal(6 + unalteredCount, status.Count()); Assert.True(status.IsDirty); Assert.Equal("new_untracked_file.txt", status.Untracked.Select(s => s.FilePath).Single()); @@ -131,11 +133,11 @@ namespace LibGit2Sharp.Tests Assert.Equal(FileStatus.Staged | FileStatus.Modified, repo.RetrieveStatus(file)); - RepositoryStatus status2 = repo.RetrieveStatus(); + RepositoryStatus status2 = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = includeUnaltered }); Assert.Equal(FileStatus.Staged | FileStatus.Modified, status2[file].State); Assert.NotNull(status2); - Assert.Equal(6, status2.Count()); + Assert.Equal(6 + unalteredCount, status2.Count()); Assert.True(status2.IsDirty); Assert.Equal("new_untracked_file.txt", status2.Untracked.Select(s => s.FilePath).Single()); @@ -242,14 +244,16 @@ namespace LibGit2Sharp.Tests } } - [Fact] - public void CanRetrieveTheStatusOfANewRepository() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void CanRetrieveTheStatusOfANewRepository(bool includeUnaltered) { string repoPath = InitNewRepository(); using (var repo = new Repository(repoPath)) { - RepositoryStatus status = repo.RetrieveStatus(); + RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = includeUnaltered }); Assert.NotNull(status); Assert.Equal(0, status.Count()); Assert.False(status.IsDirty); @@ -592,5 +596,43 @@ namespace LibGit2Sharp.Tests Assert.Equal("hello.txt", status.Modified.Single().FilePath); } } + + [Fact] + public void CanIncludeStatusOfUnalteredFiles() + { + var path = SandboxStandardTestRepo(); + string[] unalteredPaths = { + "1.txt", + "1" + Path.DirectorySeparatorChar + "branch_file.txt", + "branch_file.txt", + "new.txt", + "README", + }; + + using (var repo = new Repository(path)) + { + RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = true }); + + Assert.Equal(unalteredPaths.Length, status.Unaltered.Count()); + Assert.Equal(unalteredPaths, status.Unaltered.OrderBy(s => s.FilePath).Select(s => s.FilePath).ToArray()); + } + } + + [Fact] + public void UnalteredFilesDontMarkIndexAsDirty() + { + var path = SandboxStandardTestRepo(); + + using (var repo = new Repository(path)) + { + repo.Reset(ResetMode.Hard); + repo.RemoveUntrackedFiles(); + + RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = true }); + + Assert.Equal(false, status.IsDirty); + Assert.Equal(9, status.Count()); + } + } } } diff --git a/LibGit2Sharp/RepositoryStatus.cs b/LibGit2Sharp/RepositoryStatus.cs index 1eac10e1..d5e82ef4 100644 --- a/LibGit2Sharp/RepositoryStatus.cs +++ b/LibGit2Sharp/RepositoryStatus.cs @@ -26,6 +26,7 @@ namespace LibGit2Sharp private readonly List<StatusEntry> ignored = new List<StatusEntry>(); private readonly List<StatusEntry> renamedInIndex = new List<StatusEntry>(); private readonly List<StatusEntry> renamedInWorkDir = new List<StatusEntry>(); + private readonly List<StatusEntry> unaltered = new List<StatusEntry>(); private readonly bool isDirty; private readonly IDictionary<FileStatus, Action<RepositoryStatus, StatusEntry>> dispatcher = Build(); @@ -42,7 +43,7 @@ namespace LibGit2Sharp { FileStatus.Removed, (rs, s) => rs.removed.Add(s) }, { FileStatus.RenamedInIndex, (rs, s) => rs.renamedInIndex.Add(s) }, { FileStatus.Ignored, (rs, s) => rs.ignored.Add(s) }, - { FileStatus.RenamedInWorkDir, (rs, s) => rs.renamedInWorkDir.Add(s) } + { FileStatus.RenamedInWorkDir, (rs, s) => rs.renamedInWorkDir.Add(s) }, }; } @@ -81,7 +82,7 @@ namespace LibGit2Sharp AddStatusEntryForDelta(entry.Status, deltaHeadToIndex, deltaIndexToWorkDir); } - isDirty = statusEntries.Any(entry => entry.State != FileStatus.Ignored); + isDirty = statusEntries.Any(entry => entry.State != FileStatus.Ignored && entry.State != FileStatus.Unaltered); } } @@ -134,6 +135,12 @@ namespace LibGit2Sharp GitStatusOptionFlags.DisablePathspecMatch; } + if (options.IncludeUnaltered) + { + coreOptions.Flags |= + GitStatusOptionFlags.IncludeUnmodified; + } + return coreOptions; } @@ -164,14 +171,21 @@ namespace LibGit2Sharp StatusEntry statusEntry = new StatusEntry(filePath, gitStatus, headToIndexRenameDetails, indexToWorkDirRenameDetails); - foreach (KeyValuePair<FileStatus, Action<RepositoryStatus, StatusEntry>> kvp in dispatcher) + if (gitStatus == FileStatus.Unaltered) { - if (!gitStatus.HasFlag(kvp.Key)) + unaltered.Add(statusEntry); + } + else + { + foreach (KeyValuePair<FileStatus, Action<RepositoryStatus, StatusEntry>> kvp in dispatcher) { - continue; - } + if (!gitStatus.HasFlag(kvp.Key)) + { + continue; + } - kvp.Value(this, statusEntry); + kvp.Value(this, statusEntry); + } } statusEntries.Add(statusEntry); @@ -290,6 +304,14 @@ namespace LibGit2Sharp } /// <summary> + /// List of files that were unmodified in the working directory. + /// </summary> + public virtual IEnumerable<StatusEntry> Unaltered + { + get { return unaltered; } + } + + /// <summary> /// True if the index or the working directory has been altered since the last commit. False otherwise. /// </summary> public virtual bool IsDirty diff --git a/LibGit2Sharp/StatusOptions.cs b/LibGit2Sharp/StatusOptions.cs index a7e51760..f389303a 100644 --- a/LibGit2Sharp/StatusOptions.cs +++ b/LibGit2Sharp/StatusOptions.cs @@ -76,5 +76,13 @@ /// as explicit paths, and NOT as pathspecs containing globs. /// </summary> public bool DisablePathSpecMatch { get; set; } + + /// <summary> + /// Include unaltered files when scanning for status + /// </summary> + /// <remarks> + /// Unaltered meaning the file is identical in the working directory, the index and HEAD. + /// </remarks> + public bool IncludeUnaltered { get; set; } } } |