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

Commit 94f691f

Browse files
StanleyGoldmanshana
authored andcommitted
Allowing RepositoryManager to control the process of discarding changes
1 parent 2942e24 commit 94f691f

File tree

5 files changed

+102
-94
lines changed

5 files changed

+102
-94
lines changed

src/GitHub.Api/Git/IRepository.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ public interface IRepository : IEquatable<IRepository>
1818
ITask Revert(string changeset);
1919
ITask RequestLock(string file);
2020
ITask ReleaseLock(string file, bool force);
21-
ITask DiscardChanges(List<string> files);
22-
ITask DeleteFiles(List<string> list);
21+
ITask DiscardChanges(List<GitStatusEntry> files);
2322

2423
void CheckLogChangedEvent(CacheUpdateEvent gitLogCacheUpdateEvent);
2524
void CheckStatusChangedEvent(CacheUpdateEvent cacheUpdateEvent);

src/GitHub.Api/Git/Repository.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,9 @@ public ITask ReleaseLock(string file, bool force)
112112
return repositoryManager.UnlockFile(file, force);
113113
}
114114

115-
public ITask DiscardChanges(List<string> files)
115+
public ITask DiscardChanges(List<GitStatusEntry> files)
116116
{
117-
return repositoryManager.CheckoutFiles(files);
118-
}
119-
120-
public ITask DeleteFiles(List<string> list)
121-
{
122-
return repositoryManager.DeleteFiles(list);
117+
return repositoryManager.DiscardChanges(files);
123118
}
124119

125120
public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent)

src/GitHub.Api/Git/RepositoryManager.cs

Lines changed: 85 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ public interface IRepositoryManager : IDisposable
3535
ITask CreateBranch(string branch, string baseBranch);
3636
ITask LockFile(string file);
3737
ITask UnlockFile(string file, bool force);
38-
ITask CheckoutFiles(List<string> files);
39-
ITask DeleteFiles(List<string> list);
38+
ITask DiscardChanges(List<GitStatusEntry> files);
4039
void UpdateGitLog();
4140
void UpdateGitStatus();
4241
void UpdateGitAheadBehindStatus();
@@ -218,15 +217,13 @@ public ITask Revert(string changeset)
218217
public ITask RemoteAdd(string remote, string url)
219218
{
220219
var task = GitClient.RemoteAdd(remote, url);
221-
task = HookupHandlers(task, true, false);
222-
return task;
220+
return HookupHandlers(task, true, false);
223221
}
224222

225223
public ITask RemoteRemove(string remote)
226224
{
227225
var task = GitClient.RemoteRemove(remote);
228-
task = HookupHandlers(task, true, false);
229-
return task;
226+
return HookupHandlers(task, true, false);
230227
}
231228

232229
public ITask RemoteChange(string remote, string url)
@@ -267,50 +264,86 @@ public ITask UnlockFile(string file, bool force)
267264

268265
public void UpdateGitLog()
269266
{
270-
var task = GitClient.Log();
271-
task = HookupHandlers(task, false, false);
272-
task.Then((success, logEntries) =>
273-
{
274-
if (success)
267+
var task = GitClient
268+
.Log()
269+
.Then((success, logEntries) =>
275270
{
276-
GitLogUpdated?.Invoke(logEntries);
277-
}
278-
}).Start();
271+
if (success)
272+
{
273+
GitLogUpdated?.Invoke(logEntries);
274+
}
275+
});
276+
task = HookupHandlers(task, false, false);
277+
task.Start();
279278
}
280279

281280
public void UpdateGitStatus()
282281
{
283-
var task = GitClient.Status();
284-
task = HookupHandlers(task, true, false);
285-
task.Then((success, status) =>
286-
{
287-
if (success)
282+
var task = GitClient
283+
.Status()
284+
.Then((success, status) =>
288285
{
289-
GitStatusUpdated?.Invoke(status);
290-
}
291-
}).Start();
286+
if (success)
287+
{
288+
GitStatusUpdated?.Invoke(status);
289+
}
290+
});
291+
task = HookupHandlers(task, true, false);
292+
task.Start();
292293
}
293294

294-
public ITask CheckoutFiles(List<string> files)
295+
public ITask DiscardChanges(List<GitStatusEntry> files)
295296
{
296-
var discard = GitClient.Discard(files);
297-
discard.OnStart += t => IsBusy = true;
297+
var itemsToDelete = files
298+
.Where(entry => entry.status == GitFileStatus.Added
299+
|| entry.status == GitFileStatus.Untracked)
300+
.Select(entry => entry.path)
301+
.ToArray();
298302

299-
return discard.Finally(() => IsBusy = false);
300-
}
303+
ActionTask deleteItemsTask = null;
304+
if (itemsToDelete.Any())
305+
{
306+
deleteItemsTask = new ActionTask(CancellationToken.None, () => {
307+
for (var index = 0; index < itemsToDelete.Length; index++)
308+
{
309+
var itemToDelete = itemsToDelete[index];
310+
fileSystem.FileDelete(itemToDelete);
311+
}
312+
});
313+
}
301314

302-
public ITask DeleteFiles(List<string> list)
303-
{
304-
var delete = new ActionTask(CancellationToken.None, () => {
305-
for (var index = 0; index < list.Count; index++)
306-
{
307-
fileSystem.FileDelete(list[index]);
308-
}
309-
});
315+
var itemsToRevert = files
316+
.Where(entry => entry.status == GitFileStatus.Modified
317+
|| entry.status == GitFileStatus.Deleted
318+
|| entry.status == GitFileStatus.Renamed)
319+
.Select(entry => entry.path)
320+
.ToArray();
310321

311-
delete.OnStart += t => IsBusy = true;
322+
ITask<string> gitDiscardTask = null;
323+
if (itemsToRevert.Any())
324+
{
325+
gitDiscardTask = GitClient.Discard(itemsToRevert);
326+
}
312327

313-
return delete.Finally(() => IsBusy = false);
328+
ITask task;
329+
if(deleteItemsTask != null && gitDiscardTask != null)
330+
{
331+
task = deleteItemsTask.Then(gitDiscardTask);
332+
}
333+
else if (deleteItemsTask != null)
334+
{
335+
task = deleteItemsTask;
336+
}
337+
else if (gitDiscardTask != null)
338+
{
339+
task = gitDiscardTask;
340+
}
341+
else
342+
{
343+
throw new NotImplementedException();
344+
}
345+
346+
return HookupHandlers(task, true, true);
314347
}
315348

316349
public void UpdateGitAheadBehindStatus()
@@ -324,15 +357,17 @@ public void UpdateGitAheadBehindStatus()
324357
var name = configBranch.Value.Name;
325358
var trackingName = configBranch.Value.IsTracking ? configBranch.Value.Remote.Value.Name + "/" + name : "[None]";
326359

327-
var task = GitClient.AheadBehindStatus(name, trackingName);
328-
task = HookupHandlers(task, true, false);
329-
task.Then((success, status) =>
330-
{
331-
if (success)
360+
var task = GitClient
361+
.AheadBehindStatus(name, trackingName)
362+
.Then((success, status) =>
332363
{
333-
GitAheadBehindStatusUpdated?.Invoke(status);
334-
}
335-
}).Start();
364+
if (success)
365+
{
366+
GitAheadBehindStatusUpdated?.Invoke(status);
367+
}
368+
});
369+
task = HookupHandlers(task, true, false);
370+
task.Start();
336371
}
337372
else
338373
{
@@ -353,9 +388,9 @@ public void UpdateLocks()
353388
}).Start();
354389
}
355390

356-
private ITask<T> HookupHandlers<T>(ITask<T> task, bool isExclusive, bool filesystemChangesExpected)
391+
private ITask HookupHandlers(ITask task, bool isExclusive, bool filesystemChangesExpected)
357392
{
358-
return new ActionTask(TaskManager.Instance.Token, () => {
393+
return new ActionTask(CancellationToken.None, () => {
359394
if (isExclusive)
360395
{
361396
Logger.Trace("Starting Operation - Setting Busy Flag");
@@ -369,7 +404,7 @@ private ITask<T> HookupHandlers<T>(ITask<T> task, bool isExclusive, bool filesys
369404
}
370405
})
371406
.Then(task)
372-
.Finally((success, exception, result) => {
407+
.Finally((success, exception) => {
373408
if (filesystemChangesExpected)
374409
{
375410
Logger.Trace("Ended Operation - Enable Watcher");
@@ -382,12 +417,10 @@ private ITask<T> HookupHandlers<T>(ITask<T> task, bool isExclusive, bool filesys
382417
IsBusy = false;
383418
}
384419

385-
if (success)
420+
if (!success)
386421
{
387-
return result;
422+
throw exception;
388423
}
389-
390-
throw exception;
391424
});
392425
}
393426

src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ChangesTreeControl.cs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ public class ChangesTreeNode : TreeNode
1717
public GitFileStatus gitFileStatus;
1818
public bool isLocked;
1919

20+
public GitStatusEntry GitStatusEntry { get; set; }
21+
2022
public string ProjectPath
2123
{
22-
get { return projectPath; }
23-
set { projectPath = value; }
24+
get { return GitStatusEntry.projectPath; }
2425
}
2526

2627
public GitFileStatus GitFileStatus
2728
{
28-
get { return gitFileStatus; }
29-
set { gitFileStatus = value; }
29+
get { return GitStatusEntry.status; }
3030
}
3131

3232
public bool IsLocked
@@ -191,15 +191,13 @@ protected Texture GetNodeIconBadge(ChangesTreeNode node)
191191

192192
protected override ChangesTreeNode CreateTreeNode(string path, string label, int level, bool isFolder, bool isActive, bool isHidden, bool isCollapsed, bool isChecked, GitStatusEntryTreeData? treeData)
193193
{
194-
var gitFileStatus = GitFileStatus.None;
195-
var projectPath = (string) null;
194+
var gitStatusEntry = GitStatusEntry.Default;
196195
var isLocked = false;
197196

198197
if (treeData.HasValue)
199198
{
200199
isLocked = treeData.Value.IsLocked;
201-
gitFileStatus = treeData.Value.FileStatus;
202-
projectPath = treeData.Value.ProjectPath;
200+
gitStatusEntry = treeData.Value.GitStatusEntry;
203201
}
204202

205203
var node = new ChangesTreeNode
@@ -213,8 +211,7 @@ protected override ChangesTreeNode CreateTreeNode(string path, string label, int
213211
IsCollapsed = isCollapsed,
214212
TreeIsCheckable = IsCheckable,
215213
CheckState = isChecked ? CheckState.Checked : CheckState.Empty,
216-
GitFileStatus = gitFileStatus,
217-
ProjectPath = projectPath,
214+
GitStatusEntry = gitStatusEntry,
218215
IsLocked = isLocked,
219216
};
220217

src/UnityExtension/Assets/Editor/GitHub.Unity/UI/ChangesView.cs

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class ChangesView : Subview
2424
[NonSerialized] private bool isBusy;
2525

2626
[NonSerialized] private GUIContent revertGuiContent;
27-
[NonSerialized] private GUIContent deleteGuiContent;
2827

2928
[SerializeField] private string commitBody = "";
3029
[SerializeField] private string commitMessage = "";
@@ -161,45 +160,30 @@ private void OnTreeGUI(Rect rect)
161160
private GenericMenu CreateContextMenu(ChangesTreeNode node)
162161
{
163162
var genericMenu = new GenericMenu();
164-
var canRevert = false;
165-
var canDelete = false;
163+
var canDiscard = false;
166164

167165
if (!node.isFolder)
168166
{
169-
canRevert = node.GitFileStatus == GitFileStatus.Added
167+
canDiscard = node.GitFileStatus == GitFileStatus.Added
170168
|| node.GitFileStatus == GitFileStatus.Modified
171169
|| node.GitFileStatus == GitFileStatus.Deleted
172-
|| node.GitFileStatus == GitFileStatus.Renamed;
173-
174-
canDelete = node.GitFileStatus == GitFileStatus.Untracked;
170+
|| node.GitFileStatus == GitFileStatus.Renamed
171+
|| node.GitFileStatus == GitFileStatus.Untracked;
175172
}
176173

177-
if (canRevert)
174+
if (canDiscard)
178175
{
179176
if (revertGuiContent == null)
180177
{
181-
revertGuiContent = new GUIContent("Revert");
178+
revertGuiContent = new GUIContent("Discard");
182179
}
183180

184181
genericMenu.AddItem(revertGuiContent, false, () => {
185-
Repository.DiscardChanges(new List<string> { node.Path })
182+
Repository.DiscardChanges(new List<GitStatusEntry> { node.GitStatusEntry })
186183
.Start();
187184
});
188185
}
189186

190-
if (canDelete)
191-
{
192-
if (deleteGuiContent == null)
193-
{
194-
deleteGuiContent = new GUIContent("Delete");
195-
}
196-
197-
genericMenu.AddItem(deleteGuiContent, false, () => {
198-
Repository.DeleteFiles(new List<string> { node.Path })
199-
.Start();
200-
});
201-
}
202-
203187
return genericMenu;
204188
}
205189

0 commit comments

Comments
 (0)