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...");
92 public async Task<IRepository>
CloneRepository(Uri url,
string initialBranch,
string username,
string password, Action<int> progressReporter, CancellationToken cancellationToken)
95 throw new ArgumentNullException(nameof(url));
96 if (progressReporter == null)
97 throw new ArgumentNullException(nameof(progressReporter));
99 logger.LogInformation(
"Begin clone {0} (Branch: {1})", url, initialBranch);
104 CloneInProgress =
true;
111 logger.LogTrace(
"Semaphore acquired");
112 var repositoryPath = ioManager.ResolvePath();
113 if (!await ioManager.DirectoryExists(repositoryPath, cancellationToken).ConfigureAwait(
false))
116 var cloneOptions =
new CloneOptions
118 OnProgress = (a) => !cancellationToken.IsCancellationRequested,
119 OnTransferProgress = (a) =>
121 var percentage = 100 * (((float)a.IndexedObjects + a.ReceivedObjects) / (a.TotalObjects * 2));
122 progressReporter((
int)percentage);
123 return !cancellationToken.IsCancellationRequested;
125 RecurseSubmodules =
true,
126 OnUpdateTips = (a, b, c) => !cancellationToken.IsCancellationRequested,
127 RepositoryOperationStarting = (a) => !cancellationToken.IsCancellationRequested,
128 BranchName = initialBranch,
129 CredentialsProvider = repositoryFactory.GenerateCredentialsHandler(username, password)
132 await repositoryFactory.Clone(
137 .ConfigureAwait(
false);
143 logger.LogTrace(
"Deleting partially cloned repository...");
144 await ioManager.DeleteDirectory(repositoryPath,
default).ConfigureAwait(
false);
148 logger.LogDebug(
"Error deleting partially cloned repository! Exception: {0}", e);
155 logger.LogDebug(
"Repository exists, clone aborted!");
160 logger.LogInformation(
"Clone complete!");
164 CloneInProgress =
false;
167 return await LoadRepository(cancellationToken).ConfigureAwait(
false);
171 public async Task<IRepository>
LoadRepository(CancellationToken cancellationToken)
173 logger.LogTrace(
"Begin LoadRepository...");
177 await semaphore.WaitAsync(cancellationToken).ConfigureAwait(
false);
182 var libGitRepo = await repositoryFactory.CreateFromPath(ioManager.ResolvePath(), cancellationToken).ConfigureAwait(
false);
189 repositoryLogger, () =>
191 logger.LogTrace(
"Releasing semaphore due to Repository disposal...");
201 catch (RepositoryNotFoundException e)
203 logger.LogDebug(
"Repository not found!");
204 logger.LogTrace(
"Exception: {0}", e);
212 logger.LogInformation(
"Deleting repository...");
215 logger.LogTrace(
"Semaphore acquired, deleting Repository directory...");
216 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
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
async Task< IRepository > CloneRepository(Uri url, string initialBranch, string username, string password, Action< int > progressReporter, CancellationToken cancellationToken)
Clone the repository at url
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