/// <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."); } }
/// <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)); }
/// <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); }
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())); } }
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)); }
/// <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)); }