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

Commit fd2a568

Browse files
authored
Merge pull request #167 from github-for-unity/fixes/repository-manager-refactory
Repository & RepositoryManager refactoring
2 parents 7e38bc6 + 2b5a6c3 commit fd2a568

File tree

13 files changed

+447
-406
lines changed

13 files changed

+447
-406
lines changed

src/GitHub.Api/Application/ApplicationManagerBase.cs

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,18 @@ protected void Initialize()
3939
Logging.TracingEnabled = UserSettings.Get(Constants.TraceLoggingKey, false);
4040
ProcessManager = new ProcessManager(Environment, Platform.GitEnvironment, CancellationToken);
4141
Platform.Initialize(ProcessManager, TaskManager);
42+
if (Environment.GitExecutablePath != null)
43+
{
44+
GitClient = new GitClient(Environment, ProcessManager, Platform.CredentialManager, TaskManager);
45+
}
46+
SetupMetrics();
4247
}
4348

4449
public virtual async Task Run(bool firstRun)
4550
{
4651
Logger.Trace("Run - CurrentDirectory {0}", NPath.CurrentDirectory);
4752

48-
if (Environment.GitExecutablePath != null)
49-
{
50-
GitClient = new GitClient(Environment, ProcessManager, Platform.CredentialManager, TaskManager);
51-
}
52-
else
53+
if (Environment.GitExecutablePath == null)
5354
{
5455
GitClient = new GitClient(Environment, ProcessManager, Platform.CredentialManager, TaskManager);
5556
Environment.GitExecutablePath = await DetermineGitExecutablePath();
@@ -69,9 +70,7 @@ public virtual async Task Run(bool firstRun)
6970
RestartRepository();
7071
InitializeUI();
7172

72-
new ActionTask(CancellationToken, SetupMetrics).Start();
7373
new ActionTask(new Task(() => LoadKeychain().Start())).Start();
74-
new ActionTask(CancellationToken, RunRepositoryManager).Start();
7574
}
7675

7776
public ITask InitializeRepository()
@@ -104,8 +103,7 @@ public ITask InitializeRepository()
104103
.Then(GitClient.Add(filesForInitialCommit))
105104
.Then(GitClient.Commit("Initial commit", null))
106105
.Then(RestartRepository)
107-
.ThenInUI(InitializeUI)
108-
.Then(RunRepositoryManager);
106+
.ThenInUI(InitializeUI);
109107
return task;
110108
}
111109

@@ -114,29 +112,15 @@ public void RestartRepository()
114112
Environment.InitializeRepository();
115113
if (Environment.RepositoryPath != null)
116114
{
117-
var repositoryPathConfiguration = new RepositoryPathConfiguration(Environment.RepositoryPath);
118-
var gitConfig = new GitConfig(repositoryPathConfiguration.DotGitConfig);
119-
120-
var repositoryWatcher = new RepositoryWatcher(Platform, repositoryPathConfiguration, TaskManager.Token);
121-
repositoryManager = new RepositoryManager(Platform, TaskManager, UsageTracker, gitConfig, repositoryWatcher,
122-
GitClient, repositoryPathConfiguration, TaskManager.Token);
123-
Environment.Repository = repositoryManager.Repository;
115+
repositoryManager = Unity.RepositoryManager.CreateInstance(Platform, TaskManager, UsageTracker, GitClient, Environment.RepositoryPath);
116+
Environment.Repository = new Repository(GitClient, repositoryManager, Environment.RepositoryPath);
117+
repositoryManager.Initialize();
118+
Environment.Repository.Initialize();
119+
repositoryManager.Start();
124120
Logger.Trace($"Got a repository? {Environment.Repository}");
125121
}
126122
}
127123

128-
private void RunRepositoryManager()
129-
{
130-
Logger.Trace("RunRepositoryManager");
131-
132-
if (Environment.RepositoryPath != null)
133-
{
134-
new ActionTask(repositoryManager.Initialize())
135-
.Then(repositoryManager.Start)
136-
.Start();;
137-
}
138-
}
139-
140124
private async Task LoadKeychain()
141125
{
142126
Logger.Trace("Loading Keychain");

src/GitHub.Api/Events/RepositoryWatcher.cs

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ interface IRepositoryWatcher : IDisposable
2121
event Action<string, string> RemoteBranchCreated;
2222
event Action<string, string> RemoteBranchDeleted;
2323
void Initialize();
24+
int CheckAndProcessEvents();
2425
}
2526

2627
class RepositoryWatcher : IRepositoryWatcher
@@ -33,6 +34,9 @@ class RepositoryWatcher : IRepositoryWatcher
3334
private NativeInterface nativeInterface;
3435
private bool running;
3536
private Task task;
37+
private int lastCountOfProcessedEvents = 0;
38+
private bool processingEvents;
39+
private readonly ManualResetEventSlim signalProcessingEventsDone = new ManualResetEventSlim(false);
3640

3741
public event Action<string> HeadChanged;
3842
public event Action IndexChanged;
@@ -112,66 +116,85 @@ private void WatcherLoop()
112116
break;
113117
}
114118

115-
var fileEvents = nativeInterface.GetEvents();
119+
CheckAndProcessEvents();
116120

117-
if (fileEvents.Any())
121+
if (pauseEvent.Wait(1000))
118122
{
119-
Logger.Trace("Processing {0} Events", fileEvents.Length);
123+
break;
120124
}
125+
}
126+
}
121127

122-
var repositoryChanged = false;
128+
public int CheckAndProcessEvents()
129+
{
130+
if (processingEvents)
131+
{
132+
signalProcessingEventsDone.Wait(cancellationToken);
133+
return lastCountOfProcessedEvents;
134+
}
123135

124-
foreach (var fileEvent in fileEvents)
125-
{
126-
if (!running)
127-
{
128-
break;
129-
}
136+
signalProcessingEventsDone.Reset();
137+
processingEvents = true;
138+
lastCountOfProcessedEvents = 0;
139+
var fileEvents = nativeInterface.GetEvents();
130140

131-
if (cancellationToken.IsCancellationRequested)
132-
{
133-
Stop();
134-
break;
135-
}
141+
if (fileEvents.Length > 0)
142+
{
143+
Logger.Trace("Processing {0} Events", fileEvents.Length);
144+
}
136145

137-
//Logger.Trace(fileEvent.Describe());
146+
var repositoryChanged = false;
138147

139-
var eventDirectory = new NPath(fileEvent.Directory);
140-
var fileA = eventDirectory.Combine(fileEvent.FileA);
148+
foreach (var fileEvent in fileEvents)
149+
{
150+
if (!running)
151+
{
152+
break;
153+
}
141154

142-
NPath fileB = null;
143-
if (fileEvent.FileB != null)
144-
{
145-
fileB = eventDirectory.Combine(fileEvent.FileB);
146-
}
155+
if (cancellationToken.IsCancellationRequested)
156+
{
157+
Stop();
158+
break;
159+
}
147160

148-
// handling events in .git/*
149-
if (fileA.IsChildOf(paths.DotGitPath))
150-
{
151-
HandleEventInDotGit(fileEvent, fileA, fileB);
152-
}
153-
else
154-
{
155-
if (repositoryChanged || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath)))
156-
{
157-
continue;
158-
}
161+
//Logger.Trace(fileEvent.Describe());
159162

160-
repositoryChanged = true;
161-
}
162-
}
163+
var eventDirectory = new NPath(fileEvent.Directory);
164+
var fileA = eventDirectory.Combine(fileEvent.FileA);
163165

164-
if (repositoryChanged)
166+
NPath fileB = null;
167+
if (fileEvent.FileB != null)
165168
{
166-
Logger.Trace("RepositoryChanged");
167-
RepositoryChanged?.Invoke();
169+
fileB = eventDirectory.Combine(fileEvent.FileB);
168170
}
169171

170-
if (pauseEvent.Wait(200))
172+
// handling events in .git/*
173+
if (fileA.IsChildOf(paths.DotGitPath))
171174
{
172-
break;
175+
HandleEventInDotGit(fileEvent, fileA, fileB);
176+
}
177+
else
178+
{
179+
if (repositoryChanged || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath)))
180+
{
181+
continue;
182+
}
183+
184+
repositoryChanged = true;
173185
}
186+
lastCountOfProcessedEvents++;
174187
}
188+
189+
if (repositoryChanged)
190+
{
191+
Logger.Trace("RepositoryChanged");
192+
RepositoryChanged?.Invoke();
193+
}
194+
195+
processingEvents = false;
196+
signalProcessingEventsDone.Set();
197+
return lastCountOfProcessedEvents;
175198
}
176199

177200
private void HandleEventInDotGit(Event fileEvent, NPath fileA, NPath fileB = null)

src/GitHub.Api/Git/IRepository.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace GitHub.Unity
88
/// </summary>
99
interface IRepository : IEquatable<IRepository>
1010
{
11+
void Initialize();
1112
void Refresh();
1213
ITask SetupRemote(string remoteName, string remoteUrl);
1314
ITask Pull();
@@ -58,5 +59,6 @@ interface IRepository : IEquatable<IRepository>
5859
event Action OnLocalBranchListChanged;
5960
event Action OnHeadChanged;
6061
event Action<IEnumerable<GitLock>> OnLocksUpdated;
62+
event Action OnRepositoryInfoChanged;
6163
}
6264
}

0 commit comments

Comments
 (0)