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();
- });
}
///