From 305d076b29b673fba9ea3f1666d3106f79ae9c6d Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Wed, 19 Sep 2018 10:04:29 -0400 Subject: [PATCH] Add logging to RepositoryManager --- .../Repository/RepositoryManager.cs | 77 +++++++++++++++---- 1 file changed, 64 insertions(+), 13 deletions(-) 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); + } } } }