mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-22 20:47:28 +01:00
Cleanup repository management code
This commit is contained in:
@@ -20,8 +20,9 @@ namespace Tgstation.Server.Host.Components.Repository
|
||||
/// Load a <see cref="LibGit2Sharp.IRepository"/> from a given <paramref name="path"/>.
|
||||
/// </summary>
|
||||
/// <param name="path">The full path to the <see cref="LibGit2Sharp.IRepository"/>.</param>
|
||||
/// <returns>The loaded <see cref="LibGit2Sharp.IRepository"/>.</returns>
|
||||
LibGit2Sharp.IRepository CreateFromPath(string path);
|
||||
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> resulting in, the loaded <see cref="LibGit2Sharp.IRepository"/>.</returns>
|
||||
Task<LibGit2Sharp.IRepository> CreateFromPath(string path, CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// Clone a remote <see cref="LibGit2Sharp.IRepository"/>.
|
||||
|
||||
@@ -28,17 +28,21 @@ namespace Tgstation.Server.Host.Components.Repository
|
||||
/// <inheritdoc />
|
||||
public LibGit2Sharp.IRepository CreateInMemory()
|
||||
{
|
||||
logger.LogTrace("Creating in-memory LibGit2Sharp...");
|
||||
logger.LogTrace("Creating in-memory repository...");
|
||||
return new LibGit2Sharp.Repository();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public LibGit2Sharp.IRepository CreateFromPath(string path)
|
||||
public Task<LibGit2Sharp.IRepository> 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);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -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);
|
||||
|
||||
@@ -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<IRepository> 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();
|
||||
});
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
Reference in New Issue
Block a user