@@ -17,6 +17,7 @@ public interface IRepositoryManager : IDisposable
17
17
event Action < List < GitLogEntry > > GitLogUpdated ;
18
18
event Action < Dictionary < string , ConfigBranch > > LocalBranchesUpdated ;
19
19
event Action < Dictionary < string , ConfigRemote > , Dictionary < string , Dictionary < string , ConfigBranch > > > RemoteBranchesUpdated ;
20
+ event Action < GitAheadBehindStatus > GitAheadBehindStatusUpdated ;
20
21
21
22
void Initialize ( ) ;
22
23
void Start ( ) ;
@@ -35,6 +36,7 @@ public interface IRepositoryManager : IDisposable
35
36
ITask CreateBranch ( string branch , string baseBranch ) ;
36
37
ITask LockFile ( string file ) ;
37
38
ITask UnlockFile ( string file , bool force ) ;
39
+ ITask DiscardChanges ( GitStatusEntry [ ] gitStatusEntries ) ;
38
40
void UpdateGitLog ( ) ;
39
41
void UpdateGitStatus ( ) ;
40
42
void UpdateGitAheadBehindStatus ( ) ;
@@ -44,7 +46,6 @@ public interface IRepositoryManager : IDisposable
44
46
IGitConfig Config { get ; }
45
47
IGitClient GitClient { get ; }
46
48
bool IsBusy { get ; }
47
- event Action < GitAheadBehindStatus > GitAheadBehindStatusUpdated ;
48
49
}
49
50
50
51
interface IRepositoryPathConfiguration
@@ -96,7 +97,10 @@ class RepositoryManager : IRepositoryManager
96
97
{
97
98
private readonly IGitConfig config ;
98
99
private readonly IGitClient gitClient ;
100
+ private readonly IProcessManager processManager ;
99
101
private readonly IRepositoryPathConfiguration repositoryPaths ;
102
+ private readonly IFileSystem fileSystem ;
103
+ private readonly CancellationToken token ;
100
104
private readonly IRepositoryWatcher watcher ;
101
105
102
106
private bool isBusy ;
@@ -112,18 +116,24 @@ class RepositoryManager : IRepositoryManager
112
116
113
117
public RepositoryManager ( IGitConfig gitConfig ,
114
118
IRepositoryWatcher repositoryWatcher , IGitClient gitClient ,
119
+ IProcessManager processManager ,
120
+ IFileSystem fileSystem ,
121
+ CancellationToken token ,
115
122
IRepositoryPathConfiguration repositoryPaths )
116
123
{
117
124
this . repositoryPaths = repositoryPaths ;
125
+ this . fileSystem = fileSystem ;
126
+ this . token = token ;
118
127
this . gitClient = gitClient ;
128
+ this . processManager = processManager ;
119
129
this . watcher = repositoryWatcher ;
120
130
this . config = gitConfig ;
121
131
122
132
SetupWatcher ( ) ;
123
133
}
124
134
125
- public static RepositoryManager CreateInstance ( IPlatform platform , ITaskManager taskManager ,
126
- IGitClient gitClient , NPath repositoryRoot )
135
+ public static RepositoryManager CreateInstance ( IPlatform platform , ITaskManager taskManager , IGitClient gitClient ,
136
+ IProcessManager processManager , IFileSystem fileSystem , NPath repositoryRoot )
127
137
{
128
138
var repositoryPathConfiguration = new RepositoryPathConfiguration ( repositoryRoot ) ;
129
139
string filePath = repositoryPathConfiguration . DotGitConfig ;
@@ -132,7 +142,8 @@ public static RepositoryManager CreateInstance(IPlatform platform, ITaskManager
132
142
var repositoryWatcher = new RepositoryWatcher ( platform , repositoryPathConfiguration , taskManager . Token ) ;
133
143
134
144
return new RepositoryManager ( gitConfig , repositoryWatcher ,
135
- gitClient , repositoryPathConfiguration ) ;
145
+ gitClient , processManager , fileSystem ,
146
+ taskManager . Token , repositoryPathConfiguration ) ;
136
147
}
137
148
138
149
public void Initialize ( )
@@ -211,15 +222,13 @@ public ITask Revert(string changeset)
211
222
public ITask RemoteAdd ( string remote , string url )
212
223
{
213
224
var task = GitClient . RemoteAdd ( remote , url ) ;
214
- task = HookupHandlers ( task , true , false ) ;
215
- return task ;
225
+ return HookupHandlers ( task , true , false ) ;
216
226
}
217
227
218
228
public ITask RemoteRemove ( string remote )
219
229
{
220
230
var task = GitClient . RemoteRemove ( remote ) ;
221
- task = HookupHandlers ( task , true , false ) ;
222
- return task ;
231
+ return HookupHandlers ( task , true , false ) ;
223
232
}
224
233
225
234
public ITask RemoteChange ( string remote , string url )
@@ -260,28 +269,75 @@ public ITask UnlockFile(string file, bool force)
260
269
261
270
public void UpdateGitLog ( )
262
271
{
263
- var task = GitClient . Log ( ) ;
264
- task = HookupHandlers ( task , false , false ) ;
265
- task . Then ( ( success , logEntries ) =>
266
- {
267
- if ( success )
272
+ var task = GitClient
273
+ . Log ( )
274
+ . Then ( ( success , logEntries ) =>
268
275
{
269
- GitLogUpdated ? . Invoke ( logEntries ) ;
270
- }
271
- } ) . Start ( ) ;
276
+ if ( success )
277
+ {
278
+ GitLogUpdated ? . Invoke ( logEntries ) ;
279
+ }
280
+ } ) ;
281
+ task = HookupHandlers ( task , false , false ) ;
282
+ task . Start ( ) ;
272
283
}
273
284
274
285
public void UpdateGitStatus ( )
275
286
{
276
- var task = GitClient . Status ( ) ;
287
+ var task = GitClient
288
+ . Status ( )
289
+ . Then ( ( success , status ) =>
290
+ {
291
+ if ( success )
292
+ {
293
+ GitStatusUpdated ? . Invoke ( status ) ;
294
+ }
295
+ } ) ;
277
296
task = HookupHandlers ( task , true , false ) ;
278
- task . Then ( ( success , status ) =>
279
- {
280
- if ( success )
297
+ task . Start ( ) ;
298
+ }
299
+
300
+ public ITask DiscardChanges ( GitStatusEntry [ ] gitStatusEntries )
301
+ {
302
+ Guard . ArgumentNotNullOrEmpty ( gitStatusEntries , "gitStatusEntries" ) ;
303
+
304
+ ActionTask < GitStatusEntry [ ] > task = null ;
305
+ task = new ActionTask < GitStatusEntry [ ] > ( token , ( _ , entries ) =>
281
306
{
282
- GitStatusUpdated ? . Invoke ( status ) ;
307
+ var itemsToDelete = new List < string > ( ) ;
308
+ var itemsToRevert = new List < string > ( ) ;
309
+
310
+ foreach ( var gitStatusEntry in gitStatusEntries )
311
+ {
312
+ if ( gitStatusEntry . status == GitFileStatus . Added || gitStatusEntry . status == GitFileStatus . Untracked )
313
+ {
314
+ itemsToDelete . Add ( gitStatusEntry . path ) ;
315
+ }
316
+ else
317
+ {
318
+ itemsToRevert . Add ( gitStatusEntry . path ) ;
319
+ }
320
+ }
321
+
322
+ if ( itemsToDelete . Any ( ) )
323
+ {
324
+ foreach ( var itemToDelete in itemsToDelete )
325
+ {
326
+ fileSystem . FileDelete ( itemToDelete ) ;
327
+ }
328
+ }
329
+
330
+ ITask < string > gitDiscardTask = null ;
331
+ if ( itemsToRevert . Any ( ) )
332
+ {
333
+ gitDiscardTask = GitClient . Discard ( itemsToRevert ) ;
334
+ task . Then ( gitDiscardTask ) ;
335
+ }
283
336
}
284
- } ) . Start ( ) ;
337
+ , ( ) => gitStatusEntries ) ;
338
+
339
+
340
+ return HookupHandlers ( task , true , true ) ;
285
341
}
286
342
287
343
public void UpdateGitAheadBehindStatus ( )
@@ -295,15 +351,17 @@ public void UpdateGitAheadBehindStatus()
295
351
var name = configBranch . Value . Name ;
296
352
var trackingName = configBranch . Value . IsTracking ? configBranch . Value . Remote . Value . Name + "/" + name : "[None]" ;
297
353
298
- var task = GitClient . AheadBehindStatus ( name , trackingName ) ;
299
- task = HookupHandlers ( task , true , false ) ;
300
- task . Then ( ( success , status ) =>
301
- {
302
- if ( success )
354
+ var task = GitClient
355
+ . AheadBehindStatus ( name , trackingName )
356
+ . Then ( ( success , status ) =>
303
357
{
304
- GitAheadBehindStatusUpdated ? . Invoke ( status ) ;
305
- }
306
- } ) . Start ( ) ;
358
+ if ( success )
359
+ {
360
+ GitAheadBehindStatusUpdated ? . Invoke ( status ) ;
361
+ }
362
+ } ) ;
363
+ task = HookupHandlers ( task , true , false ) ;
364
+ task . Start ( ) ;
307
365
}
308
366
else
309
367
{
@@ -324,9 +382,9 @@ public void UpdateLocks()
324
382
} ) . Start ( ) ;
325
383
}
326
384
327
- private ITask < T > HookupHandlers < T > ( ITask < T > task , bool isExclusive , bool filesystemChangesExpected )
385
+ private ITask HookupHandlers ( ITask task , bool isExclusive , bool filesystemChangesExpected )
328
386
{
329
- return new ActionTask ( TaskManager . Instance . Token , ( ) => {
387
+ return new ActionTask ( token , ( ) => {
330
388
if ( isExclusive )
331
389
{
332
390
Logger . Trace ( "Starting Operation - Setting Busy Flag" ) ;
@@ -340,7 +398,7 @@ private ITask<T> HookupHandlers<T>(ITask<T> task, bool isExclusive, bool filesys
340
398
}
341
399
} )
342
400
. Then ( task )
343
- . Finally ( ( success , exception , result ) => {
401
+ . Finally ( ( success , exception ) => {
344
402
if ( filesystemChangesExpected )
345
403
{
346
404
Logger . Trace ( "Ended Operation - Enable Watcher" ) ;
@@ -353,12 +411,10 @@ private ITask<T> HookupHandlers<T>(ITask<T> task, bool isExclusive, bool filesys
353
411
IsBusy = false ;
354
412
}
355
413
356
- if ( success )
414
+ if ( ! success )
357
415
{
358
- return result ;
416
+ throw exception ;
359
417
}
360
-
361
- throw exception ;
362
418
} ) ;
363
419
}
364
420
0 commit comments