diff --git a/src/libraries/Directory.Build.targets b/src/libraries/Directory.Build.targets index eafd69cd11b76..954e900b03bb0 100644 --- a/src/libraries/Directory.Build.targets +++ b/src/libraries/Directory.Build.targets @@ -274,6 +274,7 @@ true + $(_PreReleaseLabel)$(_BuildNumberLabels) diff --git a/src/libraries/libraries-packages.proj b/src/libraries/libraries-packages.proj index f2eef864898f2..88e5bb94e91a3 100644 --- a/src/libraries/libraries-packages.proj +++ b/src/libraries/libraries-packages.proj @@ -44,6 +44,9 @@ --> + + + e.FullName.EndsWith(".nuspec"))) + { + Rewrite(nuspec, s => + { + XDocument content = XDocument.Parse(s); + + RewriteNuspecPackageVersion(content); + RewriteNuspecDependencyVersions(content); + + return content.ToString(); + }); + } + } + + private void RewriteRuntimeJson(ZipArchive zip) + { + foreach (var runtimeJson in zip.Entries.Where(e => e.FullName == "runtime.json")) + { + Rewrite(runtimeJson, s => + { + JObject content = JObject.Parse(s); + + RewriteRuntimeJsonVersions(content); + + return content.ToString(); + }); + } + } + + private void RewriteNuspecPackageVersion(XDocument content) + { + XElement versionElement = content + .Element(CreateQualifiedName(content, "package")) + .Element(CreateQualifiedName(content, "metadata")) + .Element(CreateQualifiedName(content, "version")); + + if (versionElement.Value != OriginalVersion) + { + Log.LogError( + $"Original version is '{versionElement.Value}', " + + $"expected '{OriginalVersion}'"); + } + + versionElement.Value = TargetVersion; + } + + private void RewriteNuspecDependencyVersions(XDocument content) + { + foreach (var dependency in content + .Descendants(CreateQualifiedName(content, "dependency")) + .Where(x => + x.Attribute("version").Value == OriginalVersion && + DependencyPackageIdsToChange?.Contains(x.Attribute("id").Value) == true)) + { + dependency.Value = TargetVersion; + } + } + + private void RewriteRuntimeJsonVersions(JObject content) + { + var versionProperties = content + .Descendants() + .OfType() + .Where(p => + p.Value is JValue v && + v.Type == JTokenType.String); + + foreach (var p in versionProperties) + { + var range = VersionRange.Parse(p.Value.Value()); + + if (range.MinVersion.OriginalVersion == OriginalVersion) + { + var newRange = new VersionRange( + NuGetVersion.Parse(TargetVersion), + range.Float); + + p.Value = newRange.ToString(); + } + } + } + + private static XName CreateQualifiedName(XDocument doc, string name) + { + return doc.Root.GetDefaultNamespace().GetName(name); + } + + private static void Rewrite(ZipArchiveEntry entry, Func rewrite) + { + using (var stream = entry.Open()) + using (var reader = new StreamReader(stream)) + using (var writer = new StreamWriter(stream)) + { + var content = rewrite(reader.ReadToEnd()); + + stream.Position = 0; + stream.SetLength(0); + writer.Write(content); + } + } + } +}