@@ -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
@@ -123,6 +124,12 @@ private static GitStatusOptions CreateStatusOptions(StatusOptions options)
123
124
GitStatusOptionFlags . RecurseIgnoredDirs ;
124
125
}
125
126
127
+ if ( options . IncludeUnaltered )
128
+ {
129
+ coreOptions . Flags |=
130
+ GitStatusOptionFlags . IncludeUnmodified ;
131
+ }
132
+
126
133
return coreOptions ;
127
134
}
128
135
@@ -153,14 +160,21 @@ private void AddStatusEntryForDelta(FileStatus gitStatus, GitDiffDelta deltaHead
153
160
154
161
StatusEntry statusEntry = new StatusEntry ( filePath , gitStatus , headToIndexRenameDetails , indexToWorkDirRenameDetails ) ;
155
162
156
- foreach ( KeyValuePair < FileStatus , Action < RepositoryStatus , StatusEntry > > kvp in dispatcher )
163
+ if ( gitStatus == FileStatus . Unaltered )
157
164
{
158
- if ( ! gitStatus . HasFlag ( kvp . Key ) )
165
+ unaltered . Add ( statusEntry ) ;
166
+ }
167
+ else
168
+ {
169
+ foreach ( KeyValuePair < FileStatus , Action < RepositoryStatus , StatusEntry > > kvp in dispatcher )
159
170
{
160
- continue ;
161
- }
171
+ if ( ! gitStatus . HasFlag ( kvp . Key ) )
172
+ {
173
+ continue ;
174
+ }
162
175
163
- kvp . Value ( this , statusEntry ) ;
176
+ kvp . Value ( this , statusEntry ) ;
177
+ }
164
178
}
165
179
166
180
statusEntries . Add ( statusEntry ) ;
@@ -278,6 +292,14 @@ public virtual IEnumerable<StatusEntry> RenamedInWorkDir
278
292
get { return renamedInWorkDir ; }
279
293
}
280
294
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
+
281
303
/// <summary>
282
304
/// True if the index or the working directory has been altered since the last commit. False otherwise.
283
305
/// </summary>
0 commit comments