Skip to content

Commit fa21d54

Browse files
committed
Introduce StatusOptions.IncludeUnaltered
1 parent fe932f3 commit fa21d54

File tree

3 files changed

+58
-7
lines changed

3 files changed

+58
-7
lines changed

LibGit2Sharp.Tests/StatusFixture.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,5 +536,26 @@ 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+
const string[] unalteredPaths = {
545+
"1.txt",
546+
"1/branch_file.txt",
547+
"branch_file.txt",
548+
"new.txt",
549+
"README",
550+
};
551+
552+
using (var repo = new Repository(path))
553+
{
554+
RepositoryStatus status = repo.RetrieveStatus(new StatusOptions() { IncludeUnaltered = true });
555+
556+
Assert.Equal(unalteredPaths.Length, status.Unaltered.Count());
557+
Assert.Equal(unalteredPaths, status.Unaltered.OrderBy(s => s.FilePath).Select(s => s.FilePath)
558+
}
559+
}
539560
}
540561
}

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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,13 @@ 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+
/// <remarks>
74+
/// Unaltered meaning the file is identical in the working directory, the index and HEAD.
75+
/// </remarks>
76+
public bool IncludeUnaltered { get; set; }
6977
}
7078
}

0 commit comments

Comments
 (0)