diff --git a/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs b/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs
index a34c461d70..cc50ff085e 100644
--- a/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs
+++ b/src/Tgstation.Server.Host/Components/Repository/RepositoryManager.cs
@@ -65,11 +65,21 @@ namespace Tgstation.Server.Host.Components.Repository
}
///
- public void Dispose() => semaphore.Dispose();
+ public void Dispose()
+ {
+ logger.LogTrace("Disposed");
+ semaphore.Dispose();
+ }
///
public async Task CloneRepository(Uri url, string initialBranch, string username, string password, Action progressReporter, CancellationToken cancellationToken)
{
+ if (url == null)
+ throw new ArgumentNullException(nameof(url));
+ if (progressReporter == null)
+ throw new ArgumentNullException(nameof(progressReporter));
+
+ logger.LogInformation("Begin clone {0} (Branch: {1})", url, initialBranch);
lock (this)
{
if (CloneInProgress)
@@ -79,6 +89,8 @@ namespace Tgstation.Server.Host.Components.Repository
try
{
using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
+ {
+ logger.LogTrace("Semaphore acquired");
if (!await ioManager.DirectoryExists(".", cancellationToken).ConfigureAwait(false))
try
{
@@ -100,11 +112,31 @@ namespace Tgstation.Server.Host.Components.Repository
OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
RepositoryOperationStarting = (a) => !cancellationToken.IsCancellationRequested,
BranchName = initialBranch,
- CredentialsProvider = (a, b, c) => username != null ? (Credentials)new UsernamePasswordCredentials
+ CredentialsProvider = (a, b, supportedCredentialTypes) =>
{
- Username = username,
- Password = password
- } : new DefaultCredentials()
+ var hasCreds = username != null;
+ var supportsUserPass = supportedCredentialTypes.HasFlag(SupportedCredentialTypes.UsernamePassword);
+ var supportsAnonymous = supportedCredentialTypes.HasFlag(SupportedCredentialTypes.Default);
+
+ logger.LogTrace("Credentials requested. Present: {0}. Supports anonymous: {1}. Supports user/pass: {2}", hasCreds, supportsAnonymous, supportsUserPass);
+ if (supportsUserPass)
+ {
+ if (hasCreds)
+ return new UsernamePasswordCredentials
+ {
+ Username = username,
+ Password = password
+ };
+ }
+
+ if (supportsAnonymous)
+ return new DefaultCredentials();
+
+ if (hasCreds)
+ throw new JobException("Remote does not support anonymous authentication!");
+
+ throw new JobException("Server does not support anonymous or username/password authentication!");
+ }
});
}
catch (UserCancelledException) { }
@@ -115,13 +147,22 @@ namespace Tgstation.Server.Host.Components.Repository
{
try
{
+ logger.LogTrace("Deleting partially cloned repository...");
await ioManager.DeleteDirectory(".", default).ConfigureAwait(false);
}
- catch { }
+ catch (Exception e)
+ {
+ logger.LogDebug("Error deleting partially cloned repository! Exception: {0}", e);
+ }
throw;
}
else
+ {
+ logger.LogDebug("Repository exists, clone aborted!");
return null;
+ }
+ }
+ logger.LogInformation("Clone complete!");
}
finally
{
@@ -133,6 +174,7 @@ namespace Tgstation.Server.Host.Components.Repository
///
public async Task LoadRepository(CancellationToken cancellationToken)
{
+ logger.LogTrace("Begin LoadRepository...");
lock (this)
if (CloneInProgress)
throw new InvalidOperationException("The repository is being cloned!");
@@ -142,28 +184,37 @@ namespace Tgstation.Server.Host.Components.Repository
{
try
{
+ logger.LogTrace("Creating LibGit2Sharp.Repository...");
repo = new LibGit2Sharp.Repository(ioManager.ResolvePath("."));
}
- catch (RepositoryNotFoundException) { }
+ catch (RepositoryNotFoundException e)
+ {
+ logger.LogDebug("Repository not found!");
+ logger.LogTrace("Exception: {0}", e);
+ }
+ catch
+ {
+ semaphore.Release();
+ throw;
+ }
}, cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Current).ConfigureAwait(false);
if (repo == null)
{
semaphore.Release();
return null;
}
- var localSemaphore = semaphore;
- return new Repository(repo, ioManager, eventConsumer, repositoryLogger, () =>
- {
- localSemaphore?.Release();
- localSemaphore = null;
- });
+ return new Repository(repo, ioManager, eventConsumer, repositoryLogger, () => semaphore.Release());
}
///
public async Task DeleteRepository(CancellationToken cancellationToken)
{
+ logger.LogInformation("Deleting repository...");
using (await SemaphoreSlimContext.Lock(semaphore, cancellationToken).ConfigureAwait(false))
+ {
+ logger.LogTrace("Semaphore acquired, deleting Repository directory...");
await ioManager.DeleteDirectory(".", cancellationToken).ConfigureAwait(false);
+ }
}
}
}