Example #1
0
        public async ValueTask <bool> ExecuteAsync(CancellationToken token)
        {
            var repository = Container.Resolve <IPackageRepository>();
            var state      = new UpdateCommandState(repository);

            var(created, updated) = await UpdateReferencesAsync(state, token);

            var(softRemoved, hardRemoved) = await RemoveFromApplicationAsync(state, token);

            Logger.Info("New {0}; updated {1}; removed {2}".FormatWith(created, updated, softRemoved + hardRemoved));

            return(true);
        }
Example #2
0
        private async Task ValidatePackageAsync(UpdateCommandState state, Package package, CancellationToken token)
        {
            foreach (var license in package.Licenses)
            {
                if (license.Code.IsNullOrEmpty())
                {
                    Logger.Info("{0} license cannot be resolved automatically: {1}".FormatWith(license.Subject, license.CodeDescription));
                }
                else
                {
                    await state.LicenseRequiresApprovalAsync(license.Code, token);

                    Logger.Info("{0} license: {1}".FormatWith(license.Subject, license.Code));
                }
            }

            if (package.ApprovalStatus == PackageApprovalStatus.None)
            {
                package.ApprovalStatus = PackageApprovalStatus.HasToBeApproved;
            }

            if (package.LicenseCode.IsNullOrEmpty())
            {
                if (package.ApprovalStatus != PackageApprovalStatus.HasToBeApproved)
                {
                    Logger.Info("License cannot be resolved automatically.");
                    package.ApprovalStatus = PackageApprovalStatus.HasToBeApproved;
                }
            }
            else
            {
                var licenseRequiresApproval = await state.LicenseRequiresApprovalAsync(package.LicenseCode, token);

                if (licenseRequiresApproval)
                {
                    if (package.ApprovalStatus == PackageApprovalStatus.AutomaticallyApproved)
                    {
                        Logger.Info("License {0} (has to be approved)".FormatWith(package.LicenseCode));
                        package.ApprovalStatus = PackageApprovalStatus.HasToBeApproved;
                    }
                }
                else if (package.ApprovalStatus == PackageApprovalStatus.HasToBeApproved)
                {
                    Logger.Info("License: {0} (auto-approve)".FormatWith(package.LicenseCode));
                    package.ApprovalStatus = PackageApprovalStatus.AutomaticallyApproved;
                }
            }
        }
Example #3
0
        private async Task <(int NewCount, int UpdatedCount)> UpdateReferencesAsync(UpdateCommandState state, CancellationToken token)
        {
            var codeParser = Container.Resolve <ISourceCodeParser>();

            var references = codeParser
                             .GetReferences(Sources)
                             .OrderBy(i => i.Id.SourceCode)
                             .ThenBy(i => i.Id.Name)
                             .ThenBy(i => i.Id.Version);

            var newCount     = 0;
            var updatedCount = 0;

            foreach (var reference in references)
            {
                Logger.Info("Validate reference {0} {1} from {2}".FormatWith(reference.Id.Name, reference.Id.Version, reference.Id.SourceCode));
                using (Logger.Indent())
                {
                    var isNew = await Container.Resolve <IPackageResolver>(reference.Id.SourceCode).DownloadAsync(reference.Id, token);

                    var package = await state.LoadPackageAsync(reference.Id, token);

                    if (isNew)
                    {
                        newCount++;
                    }
                    else
                    {
                        updatedCount++;
                    }

                    await ValidatePackageAsync(state, package, token);

                    await state.UpdatePackageAsync(reference, package, AppName, token);
                }
            }

            return(newCount, updatedCount);
        }
Example #4
0
        private async Task <(int SoftCount, int HardCount)> RemoveFromApplicationAsync(UpdateCommandState state, CancellationToken token)
        {
            var toRemove = await state.GetIdsToRemoveAsync(token);

            var order = toRemove
                        .OrderBy(i => i.SourceCode)
                        .ThenBy(i => i.Name)
                        .ThenBy(i => i.Version);

            var softCount = 0;
            var hardCount = 0;

            foreach (var id in order)
            {
                var action = await state.Repository.RemoveFromApplicationAsync(id, AppName, token);

                if (action == PackageRemoveResult.Removed)
                {
                    softCount++;
                    Logger.Info("Reference {0} {1} {2} was removed from application {3}".FormatWith(id.SourceCode, id.Name, id.Version, AppName));
                }
                else if (action == PackageRemoveResult.RemovedNoRefs)
                {
                    hardCount++;
                    Logger.Info("Reference {0} {1} {2} was completely removed from repository".FormatWith(id.SourceCode, id.Name, id.Version));
                }
            }

            return(softCount, hardCount);
        }