Skip to content

Commit c930e2f

Browse files
committed
Introduce StatusOptions.IncludeUnaltered
1 parent 2e3b534 commit c930e2f

File tree

3 files changed

+57
-7
lines changed

3 files changed

+57
-7
lines changed

LibGit2Sharp.Tests/StatusFixture.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,5 +592,26 @@ public void RetrievingTheStatusHonorsAssumedUnchangedMarkedIndexEntries()
592592
Assert.Equal("hello.txt", status.Modified.Single().FilePath);
593593
}
594594
}
595+
596+
[Fact]
597+
public void CanIncludeStatusOfUnalteredFiles()
598+
{
599+
var path = SandboxStandardTestRepo();
600+
string[] unalteredPaths = {
601+
"1.txt",
602+
"1" + Path.DirectorySeparatorChar + "branch_file.txt",
603+
"branch_file.txt",
604+
"new.txt",
605+
"README",
606+
};
607+
608+
using (var repo = new Repository(path))
609+
{
610+
RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = true });
611+
612+
Assert.Equal(unalteredPaths.Length, status.Unaltered.Count());
613+
Assert.Equal(unalteredPaths, status.Unaltered.OrderBy(s => s.FilePath).Select(s => s.FilePath).ToArray());
614+
}
615+
}
595616
}
596617
}

LibGit2Sharp/RepositoryStatus.cs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class RepositoryStatus : IEnumerable<StatusEntry>
2626
private readonly List<StatusEntry> ignored = new List<StatusEntry>();
2727
private readonly List<StatusEntry> renamedInIndex = new List<StatusEntry>();
2828
private readonly List<StatusEntry> renamedInWorkDir = new List<StatusEntry>();
29+
private readonly List<StatusEntry> unaltered = new List<StatusEntry>();
2930
private readonly bool isDirty;
3031

3132
private readonly IDictionary<FileStatus, Action<RepositoryStatus, StatusEntry>> dispatcher = Build();
@@ -42,7 +43,7 @@ private static IDictionary<FileStatus, Action<RepositoryStatus, StatusEntry>> Bu
4243
{ FileStatus.Removed, (rs, s) => rs.removed.Add(s) },
4344
{ FileStatus.RenamedInIndex, (rs, s) => rs.renamedInIndex.Add(s) },
4445
{ FileStatus.Ignored, (rs, s) => rs.ignored.Add(s) },
45-
{ FileStatus.RenamedInWorkDir, (rs, s) => rs.renamedInWorkDir.Add(s) }
46+
{ FileStatus.RenamedInWorkDir, (rs, s) => rs.renamedInWorkDir.Add(s) },
4647
};
4748
}
4849

@@ -81,7 +82,7 @@ internal RepositoryStatus(Repository repo, StatusOptions options)
8182
AddStatusEntryForDelta(entry.Status, deltaHeadToIndex, deltaIndexToWorkDir);
8283
}
8384

84-
isDirty = statusEntries.Any(entry => entry.State != FileStatus.Ignored);
85+
isDirty = statusEntries.Any(entry => entry.State != FileStatus.Ignored && entry.State != FileStatus.Unaltered);
8586
}
8687
}
8788

@@ -134,6 +135,12 @@ private static GitStatusOptions CreateStatusOptions(StatusOptions options)
134135
GitStatusOptionFlags.DisablePathspecMatch;
135136
}
136137

138+
if (options.IncludeUnaltered)
139+
{
140+
coreOptions.Flags |=
141+
GitStatusOptionFlags.IncludeUnmodified;
142+
}
143+
137144
return coreOptions;
138145
}
139146

@@ -164,14 +171,21 @@ private void AddStatusEntryForDelta(FileStatus gitStatus, GitDiffDelta deltaHead
164171

165172
StatusEntry statusEntry = new StatusEntry(filePath, gitStatus, headToIndexRenameDetails, indexToWorkDirRenameDetails);
166173

167-
foreach (KeyValuePair<FileStatus, Action<RepositoryStatus, StatusEntry>> kvp in dispatcher)
174+
if (gitStatus == FileStatus.Unaltered)
168175
{
169-
if (!gitStatus.HasFlag(kvp.Key))
176+
unaltered.Add(statusEntry);
177+
}
178+
else
179+
{
180+
foreach (KeyValuePair<FileStatus, Action<RepositoryStatus, StatusEntry>> kvp in dispatcher)
170181
{
171-
continue;
172-
}
182+
if (!gitStatus.HasFlag(kvp.Key))
183+
{
184+
continue;
185+
}
173186

174-
kvp.Value(this, statusEntry);
187+
kvp.Value(this, statusEntry);
188+
}
175189
}
176190

177191
statusEntries.Add(statusEntry);
@@ -289,6 +303,14 @@ public virtual IEnumerable<StatusEntry> RenamedInWorkDir
289303
get { return renamedInWorkDir; }
290304
}
291305

306+
/// <summary>
307+
/// List of files that were unmodified in the working directory.
308+
/// </summary>
309+
public virtual IEnumerable<StatusEntry> Unaltered
310+
{
311+
get { return unaltered; }
312+
}
313+
292314
/// <summary>
293315
/// True if the index or the working directory has been altered since the last commit. False otherwise.
294316
/// </summary>

LibGit2Sharp/StatusOptions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,12 @@ public StatusOptions()
7676
/// as explicit paths, and NOT as pathspecs containing globs.
7777
/// </summary>
7878
public bool DisablePathSpecMatch { get; set; }
79+
80+
/// Include unaltered files when scanning for status
81+
/// </summary>
82+
/// <remarks>
83+
/// Unaltered meaning the file is identical in the working directory, the index and HEAD.
84+
/// </remarks>
85+
public bool IncludeUnaltered { get; set; }
7986
}
8087
}

0 commit comments

Comments
 (0)