Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit 8c37aff

Browse files
Merge remote-tracking branch 'remotes/origin/master' into enhancements/repository-watcher-refactor-rollup
2 parents f7fd3e4 + 1352d60 commit 8c37aff

File tree

2 files changed

+95
-45
lines changed

2 files changed

+95
-45
lines changed

src/GitHub.Api/Git/RepositoryManager.cs

Lines changed: 57 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using System.Threading;
45
using System.Threading.Tasks;
56

67
namespace GitHub.Unity
@@ -168,64 +169,62 @@ public int WaitForEvents()
168169

169170
public ITask CommitAllFiles(string message, string body)
170171
{
171-
var add = GitClient.AddAll();
172-
add.OnStart += t => IsBusy = true;
173-
return add
174-
.Then(GitClient.Commit(message, body))
175-
.Finally(() => IsBusy = false);
172+
var task = GitClient
173+
.AddAll()
174+
.Then(GitClient.Commit(message, body));
175+
176+
return HookupHandlers(task, true, true);
176177
}
177178

178179
public ITask CommitFiles(List<string> files, string message, string body)
179180
{
180-
var add = GitClient.Add(files);
181-
add.OnStart += t => IsBusy = true;
182-
return add
183-
.Then(GitClient.Commit(message, body))
184-
.Finally(() => IsBusy = false);
181+
var task = GitClient
182+
.Add(files)
183+
.Then(GitClient.Commit(message, body));
184+
185+
return HookupHandlers(task, true, true);
185186
}
186187

187188
public ITask<List<GitLogEntry>> Log()
188189
{
189190
var task = GitClient.Log();
190-
HookupHandlers(task);
191-
return task;
191+
return HookupHandlers(task, false, false);
192192
}
193193

194194
public ITask<GitStatus> Status()
195195
{
196196
var task = GitClient.Status();
197-
HookupHandlers(task);
198-
return task;
197+
return HookupHandlers(task, true, false);
199198
}
200199

201200
public ITask Fetch(string remote)
202201
{
203202
var task = GitClient.Fetch(remote);
204-
return HookupHandlers(task);
203+
return HookupHandlers(task, true, false);
205204
}
206205

207206
public ITask Pull(string remote, string branch)
208207
{
209208
var task = GitClient.Pull(remote, branch);
210-
return HookupHandlers(task, true);
209+
return HookupHandlers(task, true, true);
211210
}
212211

213212
public ITask Push(string remote, string branch)
214213
{
215214
var task = GitClient.Push(remote, branch);
216-
return HookupHandlers(task);
215+
return HookupHandlers(task, true, false);
217216
}
218217

219218
public ITask Revert(string changeset)
220219
{
221220
var task = GitClient.Revert(changeset);
222-
return HookupHandlers(task);
221+
return HookupHandlers(task, true, true);
223222
}
224223

225224
public ITask RemoteAdd(string remote, string url)
226225
{
227226
var task = GitClient.RemoteAdd(remote, url);
228-
HookupHandlers(task);
227+
task = HookupHandlers(task, true, false);
229228
if (!platform.Environment.IsWindows)
230229
{
231230
task.Then(_ => {
@@ -238,7 +237,7 @@ public ITask RemoteAdd(string remote, string url)
238237
public ITask RemoteRemove(string remote)
239238
{
240239
var task = GitClient.RemoteRemove(remote);
241-
HookupHandlers(task);
240+
task = HookupHandlers(task, true, false);
242241
if (!platform.Environment.IsWindows)
243242
{
244243
task.Then(_ => {
@@ -251,44 +250,44 @@ public ITask RemoteRemove(string remote)
251250
public ITask RemoteChange(string remote, string url)
252251
{
253252
var task = GitClient.RemoteChange(remote, url);
254-
return HookupHandlers(task);
253+
return HookupHandlers(task, true, false);
255254
}
256255

257256
public ITask SwitchBranch(string branch)
258257
{
259258
var task = GitClient.SwitchBranch(branch);
260-
return HookupHandlers(task, true);
259+
return HookupHandlers(task, true, true);
261260
}
262261

263262
public ITask DeleteBranch(string branch, bool deleteUnmerged = false)
264263
{
265264
var task = GitClient.DeleteBranch(branch, deleteUnmerged);
266-
return HookupHandlers(task);
265+
return HookupHandlers(task, true, false);
267266
}
268267

269268
public ITask CreateBranch(string branch, string baseBranch)
270269
{
271270
var task = GitClient.CreateBranch(branch, baseBranch);
272-
return HookupHandlers(task);
271+
return HookupHandlers(task, true, false);
273272
}
274273

275274
public ITask<List<GitLock>> ListLocks(bool local)
276275
{
277276
var task = GitClient.ListLocks(local);
278-
HookupHandlers(task);
277+
HookupHandlers(task, false, false);
279278
return task;
280279
}
281280

282281
public ITask LockFile(string file)
283282
{
284283
var task = GitClient.Lock(file);
285-
return HookupHandlers(task);
284+
return HookupHandlers(task, true, false);
286285
}
287286

288287
public ITask UnlockFile(string file, bool force)
289288
{
290289
var task = GitClient.Unlock(file, force);
291-
return HookupHandlers(task);
290+
return HookupHandlers(task, true, false);
292291
}
293292

294293
private void SetupWatcher()
@@ -311,29 +310,42 @@ private void UpdateHead()
311310
UpdateCurrentBranchAndRemote(head);
312311
}
313312

314-
private ITask HookupHandlers(ITask task, bool disableWatcher = false)
313+
private ITask<T> HookupHandlers<T>(ITask<T> task, bool isExclusive, bool filesystemChangesExpected)
315314
{
316-
task.OnStart += t => {
317-
Logger.Trace("Start " + task.Name);
318-
IsBusy = true;
315+
return new ActionTask(CancellationToken.None, () => {
316+
if (isExclusive)
317+
{
318+
Logger.Trace("Starting Operation - Setting Busy Flag");
319+
IsBusy = true;
320+
}
319321

320-
if (disableWatcher)
321-
{
322-
watcher.Stop();
323-
}
324-
};
322+
if (filesystemChangesExpected)
323+
{
324+
Logger.Trace("Starting Operation - Disable Watcher");
325+
watcher.Stop();
326+
}
327+
})
328+
.Then(task)
329+
.Finally((success, exception, result) => {
330+
if (filesystemChangesExpected)
331+
{
332+
Logger.Trace("Ended Operation - Enable Watcher");
333+
watcher.Start();
334+
}
325335

326-
task.OnEnd += t => {
327-
if (disableWatcher)
328-
{
329-
watcher.Start();
330-
}
336+
if (isExclusive)
337+
{
338+
Logger.Trace("Ended Operation - Clearing Busy Flag");
339+
IsBusy = false;
340+
}
331341

332-
IsBusy = false;
342+
if (success)
343+
{
344+
return result;
345+
}
333346

334-
Logger.Trace("Finish " + task.Name);
335-
};
336-
return task;
347+
throw exception;
348+
});
337349
}
338350

339351
private void Watcher_OnRemoteBranchDeleted(string remote, string name)

src/tests/TaskSystemIntegrationTests/Tests.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,44 @@ public async Task ProcessReadsFromStandardInput()
108108
Assert.AreEqual(expectedOutput, output);
109109
}
110110

111+
[Test]
112+
public async Task ProcessOnStartOnEndTaskOrder()
113+
{
114+
var values = new List<string>();
115+
string process1Value = null;
116+
string process2Value = null;
117+
118+
var process1Task = new FirstNonNullLineProcessTask(Token, TestApp, @"-s 100 -d process1")
119+
.Configure(ProcessManager, true).Then((b, s) => {
120+
process1Value = s;
121+
values.Add(s);
122+
});
123+
124+
var process2Task = new FirstNonNullLineProcessTask(Token, TestApp, @"-s 100 -d process2")
125+
.Configure(ProcessManager, true).Then((b, s) => {
126+
process2Value = s;
127+
values.Add(s);
128+
});
129+
130+
var combinedTask = process1Task
131+
.Then(process2Task);
132+
133+
combinedTask.OnStart += task => {
134+
values.Add("OnStart");
135+
};
136+
137+
combinedTask.OnEnd += task => {
138+
values.Add("OnEnd");
139+
};
140+
141+
await combinedTask
142+
.StartAsAsync();
143+
144+
Assert.AreEqual(process1Value, "process1");
145+
Assert.AreEqual(process2Value, "process2");
146+
Assert.True(values.SequenceEqual(new []{ "process1", "OnStart", "process2", "OnEnd" }));
147+
}
148+
111149
[Test]
112150
public async Task ProcessReturningErrorThrowsException()
113151
{

0 commit comments

Comments
 (0)