From 4802806bdccee27cb3d5fa8c2d0dfbdc117fdb4d Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 20 Apr 2020 12:24:42 -0400 Subject: [PATCH] Cleanup repository management code --- .../Repository/IRepositoryFactory.cs | 5 ++- .../Repository/RepositoryFactory.cs | 16 ++++--- .../Repository/RepositoryManager.cs | 43 +++++++------------ 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/Tgstation.Server.Host/Components/Repository/IRepositoryFactory.cs b/src/Tgstation.Server.Host/Components/Repository/IRepositoryFactory.cs index a4e7d2b4c3..1b9d7b8c41 100644 --- a/src/Tgstation.Server.Host/Components/Repository/IRepositoryFactory.cs +++ b/src/Tgstation.Server.Host/Components/Repository/IRepositoryFactory.cs @@ -20,8 +20,9 @@ namespace Tgstation.Server.Host.Components.Repository /// Load a from a given . /// /// The full path to the . - /// The loaded . - LibGit2Sharp.IRepository CreateFromPath(string path); + /// The for the operation. + /// A resulting in, the loaded . + Task CreateFromPath(string path, CancellationToken cancellationToken); /// /// Clone a remote . diff --git a/src/Tgstation.Server.Host/Components/Repository/RepositoryFactory.cs b/src/Tgstation.Server.Host/Components/Repository/RepositoryFactory.cs index 5c6e4e2667..69865ce950 100644 --- a/src/Tgstation.Server.Host/Components/Repository/RepositoryFactory.cs +++ b/src/Tgstation.Server.Host/Components/Repository/RepositoryFactory.cs @@ -28,17 +28,21 @@ namespace Tgstation.Server.Host.Components.Repository /// public LibGit2Sharp.IRepository CreateInMemory() { - logger.LogTrace("Creating in-memory LibGit2Sharp..."); + logger.LogTrace("Creating in-memory repository..."); return new LibGit2Sharp.Repository(); } /// - public LibGit2Sharp.IRepository CreateFromPath(string path) + public Task CreateFromPath(string path, CancellationToken cancellationToken) { if (path == null) throw new ArgumentNullException(nameof(path)); - logger.LogTrace("Creating LibGit2Sharp Repostory at {0}...", path); - return new LibGit2Sharp.Repository(path); + logger.LogTrace("Creating repostory at {0}...", path); + return Task.Factory.StartNew( + () => (LibGit2Sharp.IRepository)new LibGit2Sharp.Repository(path), + cancellationToken, + TaskCreationOptions.LongRunning, + TaskScheduler.Current); } /// @@ -46,10 +50,12 @@ namespace Tgstation.Server.Host.Components.Repository { try { + logger.LogTrace("Cloning {0} into {1}...", url, path); LibGit2Sharp.Repository.Clone(url.ToString(), path, cloneOptions); } - catch (UserCancelledException) + catch (UserCancelledException ex) { + logger.LogTrace("Suppressing clone cancellation exception: {0}", ex); cancellationToken.ThrowIfCancellationRequested(); } }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current); diff --git a/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs b/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs index f198ad0b4b..f495a56693 100644 --- a/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs +++ b/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs @@ -94,7 +94,7 @@ namespace Tgstation.Server.Host.Components.Repository throw new ArgumentNullException(nameof(progressReporter)); logger.LogInformation("Begin clone {0} (Branch: {1})", url, initialBranch); - lock (this) + lock (semaphore) { if (CloneInProgress) throw new InvalidOperationException("The repository is already being cloned!"); @@ -167,40 +167,29 @@ namespace Tgstation.Server.Host.Components.Repository public async Task LoadRepository(CancellationToken cancellationToken) { logger.LogTrace("Begin LoadRepository..."); - lock (this) + lock (semaphore) if (CloneInProgress) throw new InvalidOperationException("The repository is being cloned!"); - await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false); - LibGit2Sharp.IRepository repo = null; - await Task.Factory.StartNew(() => + try { - try - { - logger.LogTrace("Creating LibGit2Sharp.Repository..."); - repo = repositoryFactory.CreateFromPath(ioManager.ResolvePath(".")); - } - catch (RepositoryNotFoundException e) - { - logger.LogDebug("Repository not found!"); - logger.LogTrace("Exception: {0}", e); - } - catch + using var context = await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false); + var repo = await repositoryFactory.CreateFromPath(ioManager.ResolvePath("."), cancellationToken).ConfigureAwait(false); + + if (repo == null) + return null; + + return new Repository(repo, ioManager, eventConsumer, repositoryFactory, repositoryLogger, () => { + logger.LogTrace("Releasing semaphore due to Repository disposal..."); semaphore.Release(); - throw; - } - }, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false); - if (repo == null) + }); + } + catch (RepositoryNotFoundException e) { - semaphore.Release(); + logger.LogDebug("Repository not found!"); + logger.LogTrace("Exception: {0}", e); return null; } - - return new Repository(repo, ioManager, eventConsumer, repositoryFactory, repositoryLogger, () => - { - logger.LogTrace("Releasing semaphore due to Repository disposal..."); - semaphore.Release(); - }); } ///