Skip to content

Commit 7339b31

Browse files
committed
Introduce StatusOptions.IncludeUnaltered
1 parent c9157e4 commit 7339b31

File tree

3 files changed

+46
-7
lines changed

3 files changed

+46
-7
lines changed

LibGit2Sharp.Tests/StatusFixture.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,5 +536,17 @@ public void CanExcludeStatusOfFilesInSubmodule()
536536
Assert.Equal(expected, status.Modified.Select(x => x.FilePath).ToArray());
537537
}
538538
}
539+
540+
[Fact]
541+
public void CanIncludeStatusOfUnalteredFiles()
542+
{
543+
string path = CloneStandardTestRepo();
544+
using (var repo = new Repository(path))
545+
{
546+
RepositoryStatus status = repo.Index.RetrieveStatus(new StatusOptions() { IncludeUnaltered = true });
547+
548+
Assert.Equal(11, status.Unaltered.Count());
549+
}
550+
}
539551
}
540552
}

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

@@ -123,6 +124,12 @@ private static GitStatusOptions CreateStatusOptions(StatusOptions options)
123124
GitStatusOptionFlags.RecurseIgnoredDirs;
124125
}
125126

127+
if (options.IncludeUnaltered)
128+
{
129+
coreOptions.Flags |=
130+
GitStatusOptionFlags.IncludeUnmodified;
131+
}
132+
126133
return coreOptions;
127134
}
128135

@@ -153,14 +160,21 @@ private void AddStatusEntryForDelta(FileStatus gitStatus, GitDiffDelta deltaHead
153160

154161
StatusEntry statusEntry = new StatusEntry(filePath, gitStatus, headToIndexRenameDetails, indexToWorkDirRenameDetails);
155162

156-
foreach (KeyValuePair<FileStatus, Action<RepositoryStatus, StatusEntry>> kvp in dispatcher)
163+
if (gitStatus == FileStatus.Unaltered)
157164
{
158-
if (!gitStatus.HasFlag(kvp.Key))
165+
unaltered.Add(statusEntry);
166+
}
167+
else
168+
{
169+
foreach (KeyValuePair<FileStatus, Action<RepositoryStatus, StatusEntry>> kvp in dispatcher)
159170
{
160-
continue;
161-
}
171+
if (!gitStatus.HasFlag(kvp.Key))
172+
{
173+
continue;
174+
}
162175

163-
kvp.Value(this, statusEntry);
176+
kvp.Value(this, statusEntry);
177+
}
164178
}
165179

166180
statusEntries.Add(statusEntry);
@@ -278,6 +292,14 @@ public virtual IEnumerable<StatusEntry> RenamedInWorkDir
278292
get { return renamedInWorkDir; }
279293
}
280294

295+
/// <summary>
296+
/// List of files that were unmodified in the working directory.
297+
/// </summary>
298+
public virtual IEnumerable<StatusEntry> Unaltered
299+
{
300+
get { return unaltered; }
301+
}
302+
281303
/// <summary>
282304
/// True if the index or the working directory has been altered since the last commit. False otherwise.
283305
/// </summary>

LibGit2Sharp/StatusOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,10 @@ public StatusOptions()
6666
/// Recurse into ignored directories
6767
/// </summary>
6868
public bool RecurseIgnoredDirs { get; set; }
69+
70+
/// <summary>
71+
/// Include unaltered files when scanning for status
72+
/// </summary>
73+
public bool IncludeUnaltered { get; set; }
6974
}
7075
}

0 commit comments

Comments
 (0)