private static async Task <RepoSync> BuildAsync(IRepositoryMod repository, StorageMod storage, IStorageMod implementation, Logger logger, CancellationToken cancellationToken) { logger.Debug($"Building sync actions {storage} to {repository}"); var allActions = new List <SyncWorkUnit>(); var repositoryList = await repository.GetFileList(cancellationToken); var storageList = await implementation.GetFileList(cancellationToken); var storageListCopy = new List <string>(storageList); foreach (var repoFile in repositoryList) { if (storageList.Contains(repoFile)) { var repoFileHash = await repository.GetFileHash(repoFile, cancellationToken); var storageFileHash = await implementation.GetFileHash(repoFile, cancellationToken); if (!repoFileHash.Equals(storageFileHash)) { var fileSize = await repository.GetFileSize(repoFile, cancellationToken); allActions.Add(new UpdateAction(repository, implementation, repoFile, fileSize)); storageListCopy.Remove(repoFile + ".part"); } storageListCopy.Remove(repoFile); } else { var fileSize = await repository.GetFileSize(repoFile, cancellationToken); allActions.Add(new DownloadAction(repository, implementation, repoFile, fileSize)); } } foreach (var storageModFile in storageListCopy) { allActions.Add(new DeleteAction(implementation, storageModFile)); } logger.Debug($"Download actions: {allActions.OfType<DownloadAction>().Count()}"); logger.Debug($"Update actions: {allActions.OfType<UpdateAction>().Count()}"); logger.Debug($"Delete actions: {allActions.OfType<DeleteAction>().Count()}"); return(new RepoSync(allActions, logger)); }
public static async Task <UpdateResult> UpdateAsync(IRepositoryMod repository, StorageMod storage, IStorageMod implementation, CancellationToken cancellationToken, IProgress <FileSyncStats>?progress) { var logger = LogHelper.GetLoggerWithIdentifier(typeof(RepoSync), Guid.NewGuid().ToString()); try { var repoSync = await BuildAsync(repository, storage, implementation, logger, cancellationToken); await repoSync.UpdateAsync(cancellationToken, progress); } catch (IOException e) when((e.HResult & 0xFFFF) == 32) // 32: sharing violation, aka open in arma { logger.Error(e); return(UpdateResult.FailedSharingViolation); } catch (Exception e) { logger.Error(e); return(UpdateResult.Failed); } logger.Trace("Progress: None"); progress?.Report(new FileSyncStats(FileSyncState.None)); return(UpdateResult.Success); }