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

Commit 5a478a1

Browse files
StanleyGoldmanshana
authored andcommitted
Functionality to revert and delete
1 parent 618e9dc commit 5a478a1

File tree

8 files changed

+113
-7
lines changed

8 files changed

+113
-7
lines changed

src/GitHub.Api/Application/ApplicationManagerBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public void RestartRepository()
128128
{
129129
if (Environment.RepositoryPath != null)
130130
{
131-
repositoryManager = Unity.RepositoryManager.CreateInstance(Platform, TaskManager, GitClient, Environment.RepositoryPath);
131+
repositoryManager = Unity.RepositoryManager.CreateInstance(Platform, TaskManager, GitClient, ProcessManager, Environment.RepositoryPath);
132132
repositoryManager.Initialize();
133133
Environment.Repository.Initialize(repositoryManager);
134134
repositoryManager.Start();

src/GitHub.Api/Git/IRepository.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public interface IRepository : IEquatable<IRepository>
1919
ITask RequestLock(string file);
2020
ITask ReleaseLock(string file, bool force);
2121
ITask DiscardChanges(List<string> files);
22+
ITask DeleteFiles(List<string> list);
2223

2324
void CheckLogChangedEvent(CacheUpdateEvent gitLogCacheUpdateEvent);
2425
void CheckStatusChangedEvent(CacheUpdateEvent cacheUpdateEvent);

src/GitHub.Api/Git/Repository.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ public ITask DiscardChanges(List<string> files)
117117
return repositoryManager.CheckoutFiles(files);
118118
}
119119

120+
public ITask DeleteFiles(List<string> list)
121+
{
122+
return repositoryManager.DeleteFiles(list);
123+
}
124+
120125
public void CheckLogChangedEvent(CacheUpdateEvent cacheUpdateEvent)
121126
{
122127
var managedCache = cacheContainer.GitLogCache;

src/GitHub.Api/Git/RepositoryManager.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public interface IRepositoryManager : IDisposable
3636
ITask LockFile(string file);
3737
ITask UnlockFile(string file, bool force);
3838
ITask CheckoutFiles(List<string> files);
39+
ITask DeleteFiles(List<string> list);
3940
void UpdateGitLog();
4041
void UpdateGitStatus();
4142
void UpdateGitAheadBehindStatus();
@@ -97,6 +98,7 @@ class RepositoryManager : IRepositoryManager
9798
{
9899
private readonly IGitConfig config;
99100
private readonly IGitClient gitClient;
101+
private readonly IProcessManager processManager;
100102
private readonly IRepositoryPathConfiguration repositoryPaths;
101103
private readonly IRepositoryWatcher watcher;
102104

@@ -113,18 +115,19 @@ class RepositoryManager : IRepositoryManager
113115

114116
public RepositoryManager(IGitConfig gitConfig,
115117
IRepositoryWatcher repositoryWatcher, IGitClient gitClient,
118+
IProcessManager processManager,
116119
IRepositoryPathConfiguration repositoryPaths)
117120
{
118121
this.repositoryPaths = repositoryPaths;
119122
this.gitClient = gitClient;
123+
this.processManager = processManager;
120124
this.watcher = repositoryWatcher;
121125
this.config = gitConfig;
122126

123127
SetupWatcher();
124128
}
125129

126-
public static RepositoryManager CreateInstance(IPlatform platform, ITaskManager taskManager,
127-
IGitClient gitClient, NPath repositoryRoot)
130+
public static RepositoryManager CreateInstance(IPlatform platform, ITaskManager taskManager, IGitClient gitClient, IProcessManager processManager, NPath repositoryRoot)
128131
{
129132
var repositoryPathConfiguration = new RepositoryPathConfiguration(repositoryRoot);
130133
string filePath = repositoryPathConfiguration.DotGitConfig;
@@ -133,7 +136,7 @@ public static RepositoryManager CreateInstance(IPlatform platform, ITaskManager
133136
var repositoryWatcher = new RepositoryWatcher(platform, repositoryPathConfiguration, taskManager.Token);
134137

135138
return new RepositoryManager(gitConfig, repositoryWatcher,
136-
gitClient, repositoryPathConfiguration);
139+
gitClient, processManager, repositoryPathConfiguration);
137140
}
138141

139142
public void Initialize()
@@ -293,6 +296,21 @@ public ITask CheckoutFiles(List<string> files)
293296
return discard.Finally(() => IsBusy = false);
294297
}
295298

299+
public ITask DeleteFiles(List<string> list)
300+
{
301+
ITask<List<string>> task = new DeleteFilesExecTask(list.ToArray(), CancellationToken.None)
302+
.Configure(processManager);
303+
304+
task = HookupHandlers(task, true, true);
305+
306+
var @finally = task.Finally((b, exception, arg3) => {
307+
Logger.Trace("Delete Files success:{0} output: {1}", b, arg3 != null ? string.Join(",", arg3.ToArray()) : "[NULL]");
308+
});
309+
310+
return @finally
311+
.Start();
312+
}
313+
296314
public void UpdateGitAheadBehindStatus()
297315
{
298316
ConfigBranch? configBranch;

src/GitHub.Api/GitHub.Api.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@
147147
<Compile Include="Tasks\TaskCanceledExceptions.cs" />
148148
<Compile Include="Tasks\TaskExtensions.cs" />
149149
<Compile Include="Tasks\TaskManager.cs" />
150+
<Compile Include="Platform\DeleteFilesExecTask.cs" />
150151
<Compile Include="Platform\FindExecTask.cs" />
151152
<Compile Include="Helpers\Progress.cs" />
152153
<Compile Include="Metrics\IMetricsService.cs" />
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System.Collections.Generic;
2+
using System.Threading;
3+
4+
namespace GitHub.Unity
5+
{
6+
class DeleteFilesExecTask : ProcessTask<List<string>>
7+
{
8+
private readonly string arguments;
9+
10+
public DeleteFilesExecTask(string[] files, CancellationToken token)
11+
: base(token, new SimpleListOutputProcessor())
12+
{
13+
Name = DefaultEnvironment.OnWindows ? "cmd" : "rm";
14+
15+
var fileString = string.Join(" ", files);
16+
if (DefaultEnvironment.OnWindows)
17+
{
18+
arguments = $"/c \"del {fileString}\"";
19+
}
20+
else
21+
{
22+
arguments = fileString;
23+
}
24+
25+
}
26+
27+
public override string ProcessName { get { return Name; } }
28+
public override string ProcessArguments { get { return arguments; } }
29+
public override TaskAffinity Affinity { get { return TaskAffinity.Concurrent; } }
30+
}
31+
}

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

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ class ChangesView : Subview
2323
[NonSerialized] private bool currentLocksHasUpdate;
2424
[NonSerialized] private bool isBusy;
2525

26+
[NonSerialized] private GUIContent revertGuiContent;
27+
[NonSerialized] private GUIContent deleteGuiContent;
28+
2629
[SerializeField] private string commitBody = "";
2730
[SerializeField] private string commitMessage = "";
2831
[SerializeField] private string currentBranch = "[unknown]";
@@ -143,7 +146,10 @@ private void OnTreeGUI(Rect rect)
143146
var treeRenderRect = treeChanges.Render(rect, treeScroll,
144147
node => { },
145148
node => { },
146-
node => { });
149+
node => {
150+
var menu = CreateContextMenu(node);
151+
menu.ShowAsContext();
152+
});
147153

148154
if (treeChanges.RequiresRepaint)
149155
Redraw();
@@ -152,6 +158,51 @@ private void OnTreeGUI(Rect rect)
152158
}
153159
}
154160

161+
private GenericMenu CreateContextMenu(ChangesTreeNode node)
162+
{
163+
var genericMenu = new GenericMenu();
164+
var canRevert = false;
165+
var canDelete = false;
166+
167+
if (!node.isFolder)
168+
{
169+
canRevert = node.GitFileStatus == GitFileStatus.Added
170+
|| node.GitFileStatus == GitFileStatus.Modified
171+
|| node.GitFileStatus == GitFileStatus.Deleted
172+
|| node.GitFileStatus == GitFileStatus.Renamed;
173+
174+
canDelete = node.GitFileStatus == GitFileStatus.Untracked;
175+
}
176+
177+
if (canRevert)
178+
{
179+
if (revertGuiContent == null)
180+
{
181+
revertGuiContent = new GUIContent("Revert");
182+
}
183+
184+
genericMenu.AddItem(revertGuiContent, false, () => {
185+
Repository.DiscardChanges(new List<string> { node.Path })
186+
.Start();
187+
});
188+
}
189+
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+
203+
return genericMenu;
204+
}
205+
155206
private void RepositoryOnStatusEntriesChanged(CacheUpdateEvent cacheUpdateEvent)
156207
{
157208
if (!lastStatusEntriesChangedEvent.Equals(cacheUpdateEvent))

src/tests/IntegrationTests/BaseGitEnvironmentTest.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ protected IEnvironment Initialize(NPath repoPath, NPath environmentPath = null,
1414
{
1515
InitializePlatform(repoPath, environmentPath, enableEnvironmentTrace);
1616

17-
var repositoryManager =
18-
GitHub.Unity.RepositoryManager.CreateInstance(Platform, TaskManager, GitClient, repoPath);
17+
var repositoryManager = GitHub.Unity.RepositoryManager.CreateInstance(Platform, TaskManager, GitClient, ProcessManager, repoPath);
1918
onRepositoryManagerCreated?.Invoke(repositoryManager);
2019

2120
RepositoryManager = repositoryManager;

0 commit comments

Comments
 (0)