Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 12 additions & 28 deletions src/GitHub.Api/Application/ApplicationManagerBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,18 @@ protected void Initialize()
Logging.TracingEnabled = UserSettings.Get(Constants.TraceLoggingKey, false);
ProcessManager = new ProcessManager(Environment, Platform.GitEnvironment, CancellationToken);
Platform.Initialize(ProcessManager, TaskManager);
if (Environment.GitExecutablePath != null)
{
GitClient = new GitClient(Environment, ProcessManager, Platform.CredentialManager, TaskManager);
}
SetupMetrics();
}

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

if (Environment.GitExecutablePath != null)
{
GitClient = new GitClient(Environment, ProcessManager, Platform.CredentialManager, TaskManager);
}
else
if (Environment.GitExecutablePath == null)
{
GitClient = new GitClient(Environment, ProcessManager, Platform.CredentialManager, TaskManager);
Environment.GitExecutablePath = await DetermineGitExecutablePath();
Expand All @@ -69,9 +70,7 @@ public virtual async Task Run(bool firstRun)
RestartRepository();
InitializeUI();

new ActionTask(CancellationToken, SetupMetrics).Start();
new ActionTask(new Task(() => LoadKeychain().Start())).Start();
new ActionTask(CancellationToken, RunRepositoryManager).Start();
}

public ITask InitializeRepository()
Expand Down Expand Up @@ -104,8 +103,7 @@ public ITask InitializeRepository()
.Then(GitClient.Add(filesForInitialCommit))
.Then(GitClient.Commit("Initial commit", null))
.Then(RestartRepository)
.ThenInUI(InitializeUI)
.Then(RunRepositoryManager);
.ThenInUI(InitializeUI);
return task;
}

Expand All @@ -114,29 +112,15 @@ public void RestartRepository()
Environment.InitializeRepository();
if (Environment.RepositoryPath != null)
{
var repositoryPathConfiguration = new RepositoryPathConfiguration(Environment.RepositoryPath);
var gitConfig = new GitConfig(repositoryPathConfiguration.DotGitConfig);

var repositoryWatcher = new RepositoryWatcher(Platform, repositoryPathConfiguration, TaskManager.Token);
repositoryManager = new RepositoryManager(Platform, TaskManager, UsageTracker, gitConfig, repositoryWatcher,
GitClient, repositoryPathConfiguration, TaskManager.Token);
Environment.Repository = repositoryManager.Repository;
repositoryManager = Unity.RepositoryManager.CreateInstance(Platform, TaskManager, UsageTracker, GitClient, Environment.RepositoryPath);
Environment.Repository = new Repository(GitClient, repositoryManager, Environment.RepositoryPath);
repositoryManager.Initialize();
Environment.Repository.Initialize();
repositoryManager.Start();
Logger.Trace($"Got a repository? {Environment.Repository}");
}
}

private void RunRepositoryManager()
{
Logger.Trace("RunRepositoryManager");

if (Environment.RepositoryPath != null)
{
new ActionTask(repositoryManager.Initialize())
.Then(repositoryManager.Start)
.Start();;
}
}

private async Task LoadKeychain()
{
Logger.Trace("Loading Keychain");
Expand Down
107 changes: 65 additions & 42 deletions src/GitHub.Api/Events/RepositoryWatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ interface IRepositoryWatcher : IDisposable
event Action<string, string> RemoteBranchCreated;
event Action<string, string> RemoteBranchDeleted;
void Initialize();
int CheckAndProcessEvents();
}

class RepositoryWatcher : IRepositoryWatcher
Expand All @@ -33,6 +34,9 @@ class RepositoryWatcher : IRepositoryWatcher
private NativeInterface nativeInterface;
private bool running;
private Task task;
private int lastCountOfProcessedEvents = 0;
private bool processingEvents;
private readonly ManualResetEventSlim signalProcessingEventsDone = new ManualResetEventSlim(false);

public event Action<string> HeadChanged;
public event Action IndexChanged;
Expand Down Expand Up @@ -112,66 +116,85 @@ private void WatcherLoop()
break;
}

var fileEvents = nativeInterface.GetEvents();
CheckAndProcessEvents();

if (fileEvents.Any())
if (pauseEvent.Wait(1000))
{
Logger.Trace("Processing {0} Events", fileEvents.Length);
break;
}
}
}

var repositoryChanged = false;
public int CheckAndProcessEvents()
{
if (processingEvents)
{
signalProcessingEventsDone.Wait(cancellationToken);
return lastCountOfProcessedEvents;
}

foreach (var fileEvent in fileEvents)
{
if (!running)
{
break;
}
signalProcessingEventsDone.Reset();
processingEvents = true;
lastCountOfProcessedEvents = 0;
var fileEvents = nativeInterface.GetEvents();

if (cancellationToken.IsCancellationRequested)
{
Stop();
break;
}
if (fileEvents.Length > 0)
{
Logger.Trace("Processing {0} Events", fileEvents.Length);
}

//Logger.Trace(fileEvent.Describe());
var repositoryChanged = false;

var eventDirectory = new NPath(fileEvent.Directory);
var fileA = eventDirectory.Combine(fileEvent.FileA);
foreach (var fileEvent in fileEvents)
{
if (!running)
{
break;
}

NPath fileB = null;
if (fileEvent.FileB != null)
{
fileB = eventDirectory.Combine(fileEvent.FileB);
}
if (cancellationToken.IsCancellationRequested)
{
Stop();
break;
}

// handling events in .git/*
if (fileA.IsChildOf(paths.DotGitPath))
{
HandleEventInDotGit(fileEvent, fileA, fileB);
}
else
{
if (repositoryChanged || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath)))
{
continue;
}
//Logger.Trace(fileEvent.Describe());

repositoryChanged = true;
}
}
var eventDirectory = new NPath(fileEvent.Directory);
var fileA = eventDirectory.Combine(fileEvent.FileA);

if (repositoryChanged)
NPath fileB = null;
if (fileEvent.FileB != null)
{
Logger.Trace("RepositoryChanged");
RepositoryChanged?.Invoke();
fileB = eventDirectory.Combine(fileEvent.FileB);
}

if (pauseEvent.Wait(200))
// handling events in .git/*
if (fileA.IsChildOf(paths.DotGitPath))
{
break;
HandleEventInDotGit(fileEvent, fileA, fileB);
}
else
{
if (repositoryChanged || ignoredPaths.Any(ignoredPath => fileA.IsChildOf(ignoredPath)))
{
continue;
}

repositoryChanged = true;
}
lastCountOfProcessedEvents++;
}

if (repositoryChanged)
{
Logger.Trace("RepositoryChanged");
RepositoryChanged?.Invoke();
}

processingEvents = false;
signalProcessingEventsDone.Set();
return lastCountOfProcessedEvents;
}

private void HandleEventInDotGit(Event fileEvent, NPath fileA, NPath fileB = null)
Expand Down
2 changes: 2 additions & 0 deletions src/GitHub.Api/Git/IRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ namespace GitHub.Unity
/// </summary>
interface IRepository : IEquatable<IRepository>
{
void Initialize();
void Refresh();
ITask SetupRemote(string remoteName, string remoteUrl);
ITask Pull();
Expand Down Expand Up @@ -58,5 +59,6 @@ interface IRepository : IEquatable<IRepository>
event Action OnLocalBranchListChanged;
event Action OnHeadChanged;
event Action<IEnumerable<GitLock>> OnLocksUpdated;
event Action OnRepositoryInfoChanged;
}
}
Loading