2 using Microsoft.Extensions.Logging;
5 using System.Threading.Tasks;
18 public bool InUse => semaphore.CurrentCount == 0;
21 public bool CloneInProgress {
get;
private set; }
51 readonly ILogger<RepositoryManager>
logger;
72 ILogger<Repository> repositoryLogger,
73 ILogger<RepositoryManager> logger)
75 this.repositoryFactory = repositoryFactory ??
throw new ArgumentNullException(nameof(repositoryFactory));
76 this.commands = commands ??
throw new ArgumentNullException(nameof(commands));
77 this.ioManager = ioManager ??
throw new ArgumentNullException(nameof(ioManager));
78 this.eventConsumer = eventConsumer ??
throw new ArgumentNullException(nameof(eventConsumer));
79 this.repositoryLogger = repositoryLogger ??
throw new ArgumentNullException(nameof(repositoryLogger));
80 this.logger = logger ??
throw new ArgumentNullException(nameof(logger));
81 semaphore =
new SemaphoreSlim(1);
87 logger.LogTrace(
"Disposing...");
97 Action<int> progressReporter,
98 bool recurseSubmodules,
99 CancellationToken cancellationToken)
102 throw new ArgumentNullException(nameof(url));
103 if (progressReporter == null)
104 throw new ArgumentNullException(nameof(progressReporter));
106 logger.LogInformation(
"Begin clone {0} (Branch: {1})", url, initialBranch);
111 CloneInProgress =
true;
118 logger.LogTrace(
"Semaphore acquired");
119 var repositoryPath = ioManager.ResolvePath();
120 if (!await ioManager.DirectoryExists(repositoryPath, cancellationToken).ConfigureAwait(
false))
123 var cloneOptions =
new CloneOptions
125 OnProgress = (a) => !cancellationToken.IsCancellationRequested,
126 OnTransferProgress = (a) =>
128 var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
129 progressReporter((
int)percentage);
130 return !cancellationToken.IsCancellationRequested;
132 RecurseSubmodules = recurseSubmodules,
133 OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
134 RepositoryOperationStarting = (a) => !cancellationToken.IsCancellationRequested,
135 BranchName = initialBranch,
136 CredentialsProvider = repositoryFactory.GenerateCredentialsHandler(username, password)
139 await repositoryFactory.Clone(
144 .ConfigureAwait(
false);
150 logger.LogTrace(
"Deleting partially cloned repository...");
151 await ioManager.DeleteDirectory(repositoryPath,
default).ConfigureAwait(
false);
155 logger.LogDebug(
"Error deleting partially cloned repository! Exception: {0}", e);
162 logger.LogDebug(
"Repository exists, clone aborted!");
167 logger.LogInformation(
"Clone complete!");
171 CloneInProgress =
false;
174 return await LoadRepository(cancellationToken).ConfigureAwait(
false);
178 public async Task<IRepository>
LoadRepository(CancellationToken cancellationToken)
180 logger.LogTrace(
"Begin LoadRepository...");
184 await semaphore.WaitAsync(cancellationToken).ConfigureAwait(
false);
189 var libGitRepo = await repositoryFactory.CreateFromPath(ioManager.ResolvePath(), cancellationToken).ConfigureAwait(
false);
196 repositoryLogger, () =>
198 logger.LogTrace(
"Releasing semaphore due to Repository disposal...");
208 catch (RepositoryNotFoundException e)
210 logger.LogDebug(
"Repository not found!");
211 logger.LogTrace(
"Exception: {0}", e);
219 logger.LogInformation(
"Deleting repository...");
222 logger.LogTrace(
"Semaphore acquired, deleting Repository directory...");
223 await ioManager.DeleteDirectory(ioManager.ResolvePath(), cancellationToken).ConfigureAwait(
false);
ErrorCode
Types of ErrorMessages that the API may return.
Use server authentication
readonly ILogger< RepositoryManager > logger
The ILogger for the RepositoryManager
For low level interactions with a LibGit2Sharp.IRepository.
RepositoryManager(ILibGit2RepositoryFactory repositoryFactory, ILibGit2Commands commands, IIOManager ioManager, IEventConsumer eventConsumer, ILogger< Repository > repositoryLogger, ILogger< RepositoryManager > logger)
Construct a RepositoryManager
readonly ILogger< Repository > repositoryLogger
The ILogger created Repositorys
readonly SemaphoreSlim semaphore
Used for controlling single access to the IRepository
async Task< IRepository > CloneRepository(Uri url, string initialBranch, string username, string password, Action< int > progressReporter, bool recurseSubmodules, CancellationToken cancellationToken)
Clone the repository at url
Factory for creating LibGit2Sharp.IRepositorys.
Operation exceptions thrown from the context of a Models.Job
Represents a git repository
readonly IIOManager ioManager
The IIOManager for the RepositoryManager
Consumes EventTypes and takes the appropriate actions
readonly ILibGit2RepositoryFactory repositoryFactory
The ILibGit2RepositoryFactory for the RepositoryManager
Factory for creating and loading IRepositorys
readonly ILibGit2Commands commands
The ILibGit2Commands for the RepositoryManager.
readonly IEventConsumer eventConsumer
The IEventConsumer for the RepositoryManager
Interface for using filesystems
async Task< IRepository > LoadRepository(CancellationToken cancellationToken)
Attempt to load the IRepository from the default location
async Task DeleteRepository(CancellationToken cancellationToken)
Delete the current repository
static async Task< SemaphoreSlimContext > Lock(SemaphoreSlim semaphore, CancellationToken cancellationToken)
Asyncronously locks a semaphore
Async lock context helper