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

Commit c08b776

Browse files
StanleyGoldmanshana
authored andcommitted
Functionality to revert changes for a folder
1 parent bc63155 commit c08b776

File tree

5 files changed

+68
-43
lines changed

5 files changed

+68
-43
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<GitStatusEntry> files);
22-
21+
ITask DiscardChanges(GitStatusEntry[] discardEntries);
2322
void CheckLogChangedEvent(CacheUpdateEvent gitLogCacheUpdateEvent);
2423
void CheckStatusChangedEvent(CacheUpdateEvent cacheUpdateEvent);
2524
void CheckStatusEntriesChangedEvent(CacheUpdateEvent cacheUpdateEvent);

src/GitHub.Api/Git/Repository.cs

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

115-
public ITask DiscardChanges(List<GitStatusEntry> files)
115+
public ITask DiscardChanges(GitStatusEntry[] gitStatusEntry)
116116
{
117-
return repositoryManager.DiscardChanges(files);
117+
return repositoryManager.DiscardChanges(gitStatusEntry);
118118
}
119119

120120
public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent)

src/GitHub.Api/Git/RepositoryManager.cs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public interface IRepositoryManager : IDisposable
1717
event Action<List<GitLogEntry>> GitLogUpdated;
1818
event Action<Dictionary<string, ConfigBranch>> LocalBranchesUpdated;
1919
event Action<Dictionary<string, ConfigRemote>, Dictionary<string, Dictionary<string, ConfigBranch>>> RemoteBranchesUpdated;
20+
event Action<GitAheadBehindStatus> GitAheadBehindStatusUpdated;
2021

2122
void Initialize();
2223
void Start();
@@ -35,7 +36,7 @@ public interface IRepositoryManager : IDisposable
3536
ITask CreateBranch(string branch, string baseBranch);
3637
ITask LockFile(string file);
3738
ITask UnlockFile(string file, bool force);
38-
ITask DiscardChanges(List<GitStatusEntry> files);
39+
ITask DiscardChanges(GitStatusEntry[] gitStatusEntries);
3940
void UpdateGitLog();
4041
void UpdateGitStatus();
4142
void UpdateGitAheadBehindStatus();
@@ -45,7 +46,6 @@ public interface IRepositoryManager : IDisposable
4546
IGitConfig Config { get; }
4647
IGitClient GitClient { get; }
4748
bool IsBusy { get; }
48-
event Action<GitAheadBehindStatus> GitAheadBehindStatusUpdated;
4949
}
5050

5151
interface IRepositoryPathConfiguration
@@ -292,56 +292,55 @@ public void UpdateGitStatus()
292292
task.Start();
293293
}
294294

295-
public ITask DiscardChanges(List<GitStatusEntry> files)
295+
public ITask DiscardChanges(GitStatusEntry[] gitStatusEntries)
296296
{
297-
var itemsToDelete = files
298-
.Where(entry => entry.status == GitFileStatus.Added
299-
|| entry.status == GitFileStatus.Untracked)
300-
.Select(entry => entry.path)
301-
.ToArray();
297+
Guard.ArgumentNotNullOrEmpty(gitStatusEntries, "gitStatusEntries");
298+
299+
var itemsToDelete = new List<string>();
300+
var itemsToRevert = new List<string>();
301+
302+
foreach (var gitStatusEntry in gitStatusEntries)
303+
{
304+
if (gitStatusEntry.status == GitFileStatus.Added || gitStatusEntry.status == GitFileStatus.Untracked)
305+
{
306+
itemsToDelete.Add(gitStatusEntry.path);
307+
}
308+
else
309+
{
310+
itemsToRevert.Add(gitStatusEntry.path);
311+
}
312+
}
302313

303314
ActionTask deleteItemsTask = null;
304315
if (itemsToDelete.Any())
305316
{
306317
deleteItemsTask = new ActionTask(CancellationToken.None, () => {
307-
for (var index = 0; index < itemsToDelete.Length; index++)
318+
foreach (var itemToDelete in itemsToDelete)
308319
{
309-
var itemToDelete = itemsToDelete[index];
310320
fileSystem.FileDelete(itemToDelete);
311321
}
312322
});
313323
}
314324

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();
321-
322325
ITask<string> gitDiscardTask = null;
323326
if (itemsToRevert.Any())
324327
{
325328
gitDiscardTask = GitClient.Discard(itemsToRevert);
326329
}
327330

328331
ITask task;
329-
if(deleteItemsTask != null && gitDiscardTask != null)
332+
if (deleteItemsTask != null && gitDiscardTask != null)
330333
{
331334
task = deleteItemsTask.Then(gitDiscardTask);
332335
}
333336
else if (deleteItemsTask != null)
334337
{
335338
task = deleteItemsTask;
336339
}
337-
else if (gitDiscardTask != null)
340+
else //if (gitDiscardTask != null)
338341
{
339342
task = gitDiscardTask;
340343
}
341-
else
342-
{
343-
throw new NotImplementedException();
344-
}
345344

346345
return HookupHandlers(task, true, true);
347346
}

src/GitHub.Api/UI/TreeBase.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,33 @@ private void ToggleChildrenChecked(int idx, TNode node, bool isChecked)
290290
}
291291
}
292292

293+
public List<TNode> GetLeafNodes(TNode parentNode)
294+
{
295+
var index = Nodes.IndexOf(parentNode);
296+
return GetLeafNodes(parentNode, index);
297+
}
298+
299+
private List<TNode> GetLeafNodes(TNode node, int idx)
300+
{
301+
var results = new List<TNode>();
302+
for (var i = idx + 1; i < Nodes.Count && node.Level < Nodes[i].Level; i++)
303+
{
304+
var childNode = Nodes[i];
305+
if (childNode.IsFolder)
306+
{
307+
var leafNodes = GetLeafNodes(childNode, i);
308+
results.AddRange(leafNodes);
309+
}
310+
else
311+
{
312+
results.Add(childNode);
313+
}
314+
}
315+
316+
return results;
317+
}
318+
319+
293320
private void ToggleParentFoldersChecked(int idx, TNode node, bool isChecked)
294321
{
295322
while (true)

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -160,29 +160,29 @@ private void OnTreeGUI(Rect rect)
160160
private GenericMenu CreateContextMenu(ChangesTreeNode node)
161161
{
162162
var genericMenu = new GenericMenu();
163-
var canDiscard = false;
164163

165-
if (!node.isFolder)
164+
if (discardGuiContent == null)
166165
{
167-
canDiscard = node.GitFileStatus == GitFileStatus.Added
168-
|| node.GitFileStatus == GitFileStatus.Modified
169-
|| node.GitFileStatus == GitFileStatus.Deleted
170-
|| node.GitFileStatus == GitFileStatus.Renamed
171-
|| node.GitFileStatus == GitFileStatus.Untracked;
166+
discardGuiContent = new GUIContent("Discard");
172167
}
173168

174-
if (canDiscard)
175-
{
176-
if (discardGuiContent == null)
169+
genericMenu.AddItem(discardGuiContent, false, () => {
170+
GitStatusEntry[] discardEntries;
171+
if (node.isFolder)
172+
{
173+
discardEntries = treeChanges
174+
.GetLeafNodes(node)
175+
.Select(treeNode => treeNode.GitStatusEntry)
176+
.ToArray();
177+
}
178+
else
177179
{
178-
discardGuiContent = new GUIContent("Discard");
180+
discardEntries = new [] { node.GitStatusEntry };
179181
}
180182

181-
genericMenu.AddItem(discardGuiContent, false, () => {
182-
Repository.DiscardChanges(new List<GitStatusEntry> { node.GitStatusEntry })
183-
.Start();
184-
});
185-
}
183+
Repository.DiscardChanges(discardEntries)
184+
.Start();
185+
});
186186

187187
return genericMenu;
188188
}

0 commit comments

Comments
 (0)