예제 #1
0
        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());
        }
예제 #2
0
        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);
        }