예제 #1
0
        /// <summary>
        /// Throw if the tool versions does not match the feed.
        /// </summary>
        public static async Task EnsureCompatibility(ISleetFileSystem fileSystem, ILogger log, CancellationToken token)
        {
            var requirements = await GetFeedRequirementsAsync(fileSystem, log, token);

            AddDefaultCapabilities(requirements);

            var originalVersion = AssemblyVersionHelper.GetVersion();
            var assemblyVersion = new NuGetVersion(originalVersion.Major, originalVersion.Minor, originalVersion.Patch);

            // Check if a newer client is needed for the feed
            if (!requirements.RequiredVersion.Satisfies(assemblyVersion))
            {
                throw new InvalidOperationException($"{fileSystem.BaseURI} requires Sleet version: {requirements.RequiredVersion.PrettyPrint()}  Upgrade your Sleet client to work with this feed.");
            }

            var compareResult = CompareCapabilities(SupportedFeedCapabilities, requirements.RequiredCapabilities);

            if (compareResult < 0)
            {
                throw new InvalidOperationException($"{fileSystem.BaseURI} requires a newer version of Sleet. Upgrade your Sleet client to work with this feed.");
            }
            else if (compareResult > 0)
            {
                throw new InvalidOperationException($"{fileSystem.BaseURI} uses an older version of Sleet: {requirements.CreatorSleetVersion.ToNormalizedString()}. Upgrade the feed to {assemblyVersion} by running 'Sleet recreate' against this feed.");
            }
        }
예제 #2
0
        /// <summary>
        /// Create PackageDetails for a delete
        /// </summary>
        public static async Task <JObject> CreateDeleteDetailsAsync(PackageIdentity package, string reason, Uri catalogBaseURI, Guid commitId)
        {
            var now    = DateTimeOffset.UtcNow;
            var pageId = Guid.NewGuid().ToString().ToLowerInvariant();

            var rootUri = UriUtility.GetPath(catalogBaseURI, $"data/{pageId}.json");

            var json = JsonUtility.Create(rootUri, new List <string>()
            {
                "PackageDelete", "catalog:Permalink"
            });

            json.Add("commitId", commitId.ToString().ToLowerInvariant());
            json.Add("commitTimeStamp", now.GetDateString());
            json.Add("sleet:operation", "remove");

            var context = await JsonUtility.GetContextAsync("Catalog");

            json.Add("@context", context);

            json.Add("id", package.Id);
            json.Add("version", package.Version.ToFullVersionString());

            json.Add("created", DateTimeOffset.UtcNow.GetDateString());
            json.Add("sleet:removeReason", reason);

            json.Add("sleet:toolVersion", AssemblyVersionHelper.GetVersion().ToFullVersionString());

            return(JsonLDTokenComparer.Format(json));
        }
예제 #3
0
        /// <summary>
        /// Throw if the tool versions does not match the feed.
        /// </summary>
        public static async Task <bool> EnsureFeedVersionMatchesTool(ISleetFileSystem fileSystem, bool allowNewer, ILogger log, CancellationToken token)
        {
            var sourceVersion = await GetSleetVersionAsync(fileSystem, log, token);

            var originalVersion = AssemblyVersionHelper.GetVersion();
            var assemblyVersion = new NuGetVersion(originalVersion.Major, originalVersion.Minor, originalVersion.Patch);

            // Allow all X.Y.* versions to be used, patches should only contain bug fixes
            // no breaking changes or new features.
            var allowedRange = GetAllowedRange(sourceVersion, allowNewer);

            if (!allowedRange.Satisfies(assemblyVersion))
            {
                if (sourceVersion < assemblyVersion)
                {
                    throw new InvalidOperationException($"{fileSystem.BaseURI} uses an older version of Sleet: {sourceVersion}. Upgrade the feed to {assemblyVersion} by running 'Sleet recreate' against this feed.");
                }
                else if (sourceVersion > assemblyVersion)
                {
                    throw new InvalidOperationException($"{fileSystem.BaseURI} was created using a newer version of Sleet: {sourceVersion}. Use the same or higher version to make changes.");
                }
            }

            return(true);
        }
예제 #4
0
 public static string LoadTemplate(string name, DateTimeOffset now, Uri baseUri)
 {
     using (var reader = new StreamReader(GetResource($"template{name}.json")))
     {
         return(reader.ReadToEnd()
                .Replace("$SLEETVERSION$", AssemblyVersionHelper.GetVersion().ToFullVersionString())
                .Replace("$BASEURI$", UriUtility.RemoveTrailingSlash(baseUri).AbsoluteUri.TrimEnd('/'))
                .Replace("$NOW$", now.GetDateString()));
     }
 }
예제 #5
0
        public static Task <int> MainCore(string[] args, ILogger log)
        {
            CmdUtils.LaunchDebuggerIfSet(ref args, log);

            var app = new CommandLineApplication()
            {
                Name     = "sleet",
                FullName = "Sleet"
            };

            app.HelpOption(Constants.HelpOption);
            app.VersionOption("--version", AssemblyVersionHelper.GetVersion().ToFullVersionString());

            Configure();

            InitAppCommand.Register(app, log);
            PushAppCommand.Register(app, log);
            DeleteAppCommand.Register(app, log);
            ValidateAppCommand.Register(app, log);
            StatsAppCommand.Register(app, log);
            CreateConfigAppCommand.Register(app, log);
            DestroyAppCommand.Register(app, log);
            DownloadAppCommand.Register(app, log);
            RecreateAppCommand.Register(app, log);
            FeedSettingsAppCommand.Register(app, log);
            RetentionAppCommand.Register(app, log);

            app.OnExecute(() =>
            {
                app.ShowHelp();
                return(1);
            });

            var exitCode = 1;

            try
            {
                exitCode = app.Execute(args);
            }
            catch (CommandParsingException ex)
            {
                ex.Command.ShowHelp();
            }
            catch (Exception ex)
            {
                ExceptionUtils.LogException(ex, log);
            }

            return(Task.FromResult(exitCode));
        }
예제 #6
0
        /// <summary>
        /// Create a PackageDetails page that contains all the package information and an exact uri.
        /// </summary>
        public static async Task <JObject> CreatePackageDetailsWithExactUriAsync(PackageInput packageInput, Uri detailsUri, Uri nupkgUri, Guid commitId, bool writeFileList)
        {
            var now          = DateTimeOffset.UtcNow;
            var nuspecReader = packageInput.Nuspec;

            var json = JsonUtility.Create(detailsUri, new List <string>()
            {
                "PackageDetails", "catalog:Permalink"
            });

            json.Add("commitId", commitId.ToString().ToLowerInvariant());
            json.Add("commitTimeStamp", DateTimeOffset.UtcNow.GetDateString());
            json.Add("sleet:operation", "add");

            var context = await JsonUtility.GetContextAsync("Catalog");

            json.Add("@context", context);

            json.Add("id", packageInput.Identity.Id);
            json.Add("version", packageInput.Identity.Version.ToFullVersionString());

            json.Add("created", now.GetDateString());
            json.Add("lastEdited", "0001-01-01T00:00:00Z");

            var copyProperties = new List <string>()
            {
                "authors",
                "copyright",
                "description",
                "iconUrl",
                "projectUrl",
                "licenseUrl",
                "language",
                "summary",
                "owners",
                "releaseNotes"
            };

            foreach (var propertyName in copyProperties)
            {
                json.Add(CreateProperty(propertyName, propertyName, nuspecReader));
            }

            json.Add("isPrerelease", packageInput.Identity.Version.IsPrerelease);

            // Unused?
            json.Add("licenseNames", string.Empty);
            json.Add("licenseReportUrl", string.Empty);

            // All packages are listed
            json.Add("listed", true);

            var titleValue = GetEntry(nuspecReader, "title");

            if (!string.IsNullOrEmpty(titleValue))
            {
                json.Add("title", titleValue);
            }

            // Avoid hashing the package for virtual catalog pages, it takes
            // a long time for machines with slow disks. It also isn't used
            // anywhere except in the real catalog.
            if (writeFileList)
            {
                using (var stream = File.OpenRead(packageInput.PackagePath))
                {
                    using (var sha512 = SHA512.Create())
                    {
                        var packageHash = Convert.ToBase64String(sha512.ComputeHash(stream));

                        json.Add("packageHash", packageHash);
                        json.Add("packageHashAlgorithm", "SHA512");
                    }

                    json.Add("packageSize", stream.Length);
                }
            }

            json.Add("published", now.GetDateString());
            json.Add("requireLicenseAcceptance", GetEntry(nuspecReader, "requireLicenseAcceptance").Equals("true", StringComparison.OrdinalIgnoreCase));

            var minVersion = nuspecReader.GetMinClientVersion();

            if (minVersion != null)
            {
                json.Add("minClientVersion", minVersion.ToIdentityString());
            }

            // Tags
            var tagSet = new HashSet <string>(GetEntry(nuspecReader, "tags").Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries), StringComparer.OrdinalIgnoreCase);

            tagSet.Remove(string.Empty);
            var tagArray = new JArray(tagSet);

            json.Add("tags", tagArray);

            // Framework assemblies
            var fwrGroups = nuspecReader.GetFrameworkAssemblyGroups();
            var fwrArray  = new JArray();

            json.Add("frameworkAssemblyGroup", fwrArray);

            foreach (var group in fwrGroups.OrderBy(e => e.TargetFramework.GetShortFolderName(), StringComparer.OrdinalIgnoreCase))
            {
                var groupTFM  = group.TargetFramework.GetShortFolderName().ToLowerInvariant();
                var groupNode = JsonUtility.Create(detailsUri, $"frameworkassemblygroup/{groupTFM}".ToLowerInvariant(), "FrameworkAssemblyGroup");

                // Leave the framework property out for the 'any' group
                if (!group.TargetFramework.IsAny)
                {
                    groupNode.Add("targetFramework", groupTFM);
                }

                fwrArray.Add(groupNode);

                if (group.Items.Any())
                {
                    var assemblyArray = new JArray();
                    groupNode.Add("assembly", assemblyArray);

                    foreach (var fwAssembly in group.Items.Distinct().OrderBy(e => e, StringComparer.OrdinalIgnoreCase))
                    {
                        assemblyArray.Add(fwAssembly);
                    }
                }
            }

            // Dependencies
            var dependencyGroups = nuspecReader.GetDependencyGroups();

            var depArray = new JArray();

            json.Add("dependencyGroups", depArray);

            foreach (var group in dependencyGroups.OrderBy(e => e.TargetFramework.GetShortFolderName(), StringComparer.OrdinalIgnoreCase))
            {
                var groupTFM  = group.TargetFramework.GetShortFolderName().ToLowerInvariant();
                var groupNode = JsonUtility.Create(detailsUri, $"dependencygroup/{groupTFM}".ToLowerInvariant(), "PackageDependencyGroup");

                // Leave the framework property out for the 'any' group
                if (!group.TargetFramework.IsAny)
                {
                    groupNode.Add("targetFramework", groupTFM);
                }

                depArray.Add(groupNode);

                if (group.Packages.Any())
                {
                    var packageArray = new JArray();
                    groupNode.Add("dependencies", packageArray);

                    foreach (var depPackage in group.Packages.Distinct().OrderBy(e => e.Id, StringComparer.OrdinalIgnoreCase))
                    {
                        var packageNode = JsonUtility.Create(detailsUri, $"dependencygroup/{groupTFM}/{depPackage.Id}".ToLowerInvariant(), "PackageDependency");
                        packageNode.Add("id", depPackage.Id);
                        packageNode.Add("range", depPackage.VersionRange.ToNormalizedString());

                        packageArray.Add(packageNode);
                    }
                }
            }

            json.Add("packageContent", nupkgUri.AbsoluteUri);

            if (writeFileList)
            {
                // Write out all files contained in the package
                var packageEntriesArray = new JArray();
                json.Add("packageEntries", packageEntriesArray);

                using (var zip = packageInput.CreateZip())
                {
                    AddZipEntry(zip, detailsUri, packageEntriesArray);
                }
            }

            json.Add("sleet:toolVersion", AssemblyVersionHelper.GetVersion().ToFullVersionString());

            return(JsonLDTokenComparer.Format(json));
        }