public async Task <string[]> Update(IEnumerable <Uri> remotes, StatusRepo repo, bool skipWhenFileMatches = true) { var objects = GetNeededObjects(skipWhenFileMatches); var doneObjects = new ConcurrentBag <FileObjectMapping>(); var relObjects = objects.OrderByDescending(x => Tools.FileUtil.SizePrediction(x.FO.FilePath)) .Select( x => new FileFetchInfo(Repository.GetObjectSubPath(x.FO), x.FO.FilePath) { OnComplete = () => doneObjects.Add(x.FO) }) .ToArray(); StatusRepo.ProcessSize(GetExistingObjects(objects.Select(x => x.FO)), Repository.ObjectsPath, MetaData.SizePacked); // TODO: Abort support! // TODO: Progress fix??! try { await DownloadObjects(remotes, repo, relObjects, Repository.ObjectsPath).ConfigureAwait(false); } finally { Repository.ReAddObject(doneObjects.Select(x => x.Checksum).ToArray()); } return(relObjects.Select(x => x.FilePath).ToArray()); }
void HandleMissingObjects(List <Package.ObjectMap> missingObjects) { var currentPackage = MetaData.GetFullName(); var packages = Repository.GetPackagesList() .Where(x => !x.Equals(currentPackage)) .OrderByDescending(x => x.StartsWith(MetaData.Name)).ToArray(); if (packages.Any()) { ProcessMissingObjects(missingObjects, packages); } var resolvableObjects = missingObjects.Where(x => x.ExistingObject != null).ToArray(); StatusRepo.Reset(RepoStatus.Copying, resolvableObjects.Length); foreach (var o in resolvableObjects) { this.Logger() .Info("Found local previous version match for {0}", o.FO.FilePath, o.ExistingObject, o.FO.Checksum); missingObjects.Remove(o); } StatusRepo.Reset(RepoStatus.Packing, missingObjects.Count); var resolvedObjects = new List <Package.ObjectMap>(); foreach (var o in missingObjects) { ProcessMissingObject(o, resolvedObjects); } Repository.ReAddObject(resolvedObjects.Select(x => x.ExistingObject).ToArray()); foreach (var o in resolvedObjects) { missingObjects.Remove(o); } Repository.Log( "\nFound {0} missing objects, resolved {1} candidates from other packages and {2} from uncompressed files", missingObjects.Count + resolvedObjects.Count + resolvableObjects.Length, resolvableObjects.Length, resolvedObjects.Count); }