@@ -26,6 +26,7 @@ public class RepositoryStatus : IEnumerable<StatusEntry>
26
26
private readonly List < StatusEntry > ignored = new List < StatusEntry > ( ) ;
27
27
private readonly List < StatusEntry > renamedInIndex = new List < StatusEntry > ( ) ;
28
28
private readonly List < StatusEntry > renamedInWorkDir = new List < StatusEntry > ( ) ;
29
+ private readonly List < StatusEntry > unaltered = new List < StatusEntry > ( ) ;
29
30
private readonly bool isDirty ;
30
31
31
32
private readonly IDictionary < FileStatus , Action < RepositoryStatus , StatusEntry > > dispatcher = Build ( ) ;
@@ -42,7 +43,7 @@ private static IDictionary<FileStatus, Action<RepositoryStatus, StatusEntry>> Bu
42
43
{ FileStatus . Removed , ( rs , s ) => rs . removed . Add ( s ) } ,
43
44
{ FileStatus . RenamedInIndex , ( rs , s ) => rs . renamedInIndex . Add ( s ) } ,
44
45
{ 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 ) } ,
46
47
} ;
47
48
}
48
49
@@ -81,7 +82,7 @@ internal RepositoryStatus(Repository repo, StatusOptions options)
81
82
AddStatusEntryForDelta ( entry . Status , deltaHeadToIndex , deltaIndexToWorkDir ) ;
82
83
}
83
84
84
- isDirty = statusEntries . Any ( entry => entry . State != FileStatus . Ignored ) ;
85
+ isDirty = statusEntries . Any ( entry => entry . State != FileStatus . Ignored && entry . State != FileStatus . Unaltered ) ;
85
86
}
86
87
}
87
88
@@ -134,6 +135,12 @@ private static GitStatusOptions CreateStatusOptions(StatusOptions options)
134
135
GitStatusOptionFlags . DisablePathspecMatch ;
135
136
}
136
137
138
+ if ( options . IncludeUnaltered )
139
+ {
140
+ coreOptions . Flags |=
141
+ GitStatusOptionFlags . IncludeUnmodified ;
142
+ }
143
+
137
144
return coreOptions ;
138
145
}
139
146
@@ -164,14 +171,21 @@ private void AddStatusEntryForDelta(FileStatus gitStatus, GitDiffDelta deltaHead
164
171
165
172
StatusEntry statusEntry = new StatusEntry ( filePath , gitStatus , headToIndexRenameDetails , indexToWorkDirRenameDetails ) ;
166
173
167
- foreach ( KeyValuePair < FileStatus , Action < RepositoryStatus , StatusEntry > > kvp in dispatcher )
174
+ if ( gitStatus == FileStatus . Unaltered )
168
175
{
169
- if ( ! gitStatus . HasFlag ( kvp . Key ) )
176
+ unaltered . Add ( statusEntry ) ;
177
+ }
178
+ else
179
+ {
180
+ foreach ( KeyValuePair < FileStatus , Action < RepositoryStatus , StatusEntry > > kvp in dispatcher )
170
181
{
171
- continue ;
172
- }
182
+ if ( ! gitStatus . HasFlag ( kvp . Key ) )
183
+ {
184
+ continue ;
185
+ }
173
186
174
- kvp . Value ( this , statusEntry ) ;
187
+ kvp . Value ( this , statusEntry ) ;
188
+ }
175
189
}
176
190
177
191
statusEntries . Add ( statusEntry ) ;
@@ -289,6 +303,14 @@ public virtual IEnumerable<StatusEntry> RenamedInWorkDir
289
303
get { return renamedInWorkDir ; }
290
304
}
291
305
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
+
292
314
/// <summary>
293
315
/// True if the index or the working directory has been altered since the last commit. False otherwise.
294
316
/// </summary>
0 commit comments