@@ -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>
0 commit comments