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

Commit 1352d60

Browse files
Merge pull request #419 from github-for-unity/fixes/stop-watcher-for-commit
Refactor HookupHandlers in order accurately wrap tasks
2 parents 61771b0 + 685d982 commit 1352d60

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
@@ -169,64 +170,62 @@ public int WaitForEvents()
169170

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

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

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

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

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

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

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

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

226225
public ITask RemoteAdd(string remote, string url)
227226
{
228227
var task = GitClient.RemoteAdd(remote, url);
229-
HookupHandlers(task);
228+
task = HookupHandlers(task, true, false);
230229
if (!platform.Environment.IsWindows)
231230
{
232231
task.Then(_ => {
@@ -239,7 +238,7 @@ public ITask RemoteAdd(string remote, string url)
239238
public ITask RemoteRemove(string remote)
240239
{
241240
var task = GitClient.RemoteRemove(remote);
242-
HookupHandlers(task);
241+
task = HookupHandlers(task, true, false);
243242
if (!platform.Environment.IsWindows)
244243
{
245244
task.Then(_ => {
@@ -252,44 +251,44 @@ public ITask RemoteRemove(string remote)
252251
public ITask RemoteChange(string remote, string url)
253252
{
254253
var task = GitClient.RemoteChange(remote, url);
255-
return HookupHandlers(task);
254+
return HookupHandlers(task, true, false);
256255
}
257256

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

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

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

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

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

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

295294
public void UpdateConfigData()
@@ -317,29 +316,42 @@ private void UpdateHead()
317316
UpdateCurrentBranchAndRemote(head);
318317
}
319318

320-
private ITask HookupHandlers(ITask task, bool disableWatcher = false)
319+
private ITask<T> HookupHandlers<T>(ITask<T> task, bool isExclusive, bool filesystemChangesExpected)
321320
{
322-
task.OnStart += t => {
323-
Logger.Trace("Start " + task.Name);
324-
IsBusy = true;
321+
return new ActionTask(CancellationToken.None, () => {
322+
if (isExclusive)
323+
{
324+
Logger.Trace("Starting Operation - Setting Busy Flag");
325+
IsBusy = true;
326+
}
325327

326-
if (disableWatcher)
327-
{
328-
watcher.Stop();
329-
}
330-
};
328+
if (filesystemChangesExpected)
329+
{
330+
Logger.Trace("Starting Operation - Disable Watcher");
331+
watcher.Stop();
332+
}
333+
})
334+
.Then(task)
335+
.Finally((success, exception, result) => {
336+
if (filesystemChangesExpected)
337+
{
338+
Logger.Trace("Ended Operation - Enable Watcher");
339+
watcher.Start();
340+
}
331341

332-
task.OnEnd += t => {
333-
if (disableWatcher)
334-
{
335-
watcher.Start();
336-
}
342+
if (isExclusive)
343+
{
344+
Logger.Trace("Ended Operation - Clearing Busy Flag");
345+
IsBusy = false;
346+
}
337347

338-
IsBusy = false;
348+
if (success)
349+
{
350+
return result;
351+
}
339352

340-
Logger.Trace("Finish " + task.Name);
341-
};
342-
return task;
353+
throw exception;
354+
});
343355
}
344356

345357
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)