diff --git a/src/Paket.Core/PaketConfigFiles/ProjectFile.fs b/src/Paket.Core/PaketConfigFiles/ProjectFile.fs index c7fac7430c..b5d47435c5 100644 --- a/src/Paket.Core/PaketConfigFiles/ProjectFile.fs +++ b/src/Paket.Core/PaketConfigFiles/ProjectFile.fs @@ -2087,12 +2087,24 @@ type ProjectFile with member self.GetTemplateMetadata () = let prop name = self.GetProperty name + // SDK-style projects (new csproj format) expose several pack-related + // properties under a "Package" prefix (e.g. PackageReleaseNotes, + // PackageProjectUrl). Fall back to the "Package"-prefixed name when the + // plain property isn't present, so both old- and new-style projects work. + let propOrPackage name = + match prop name with + | Some _ as v -> v + | None -> prop ("Package" + name) + let propOr name value = defaultArg (self.GetProperty name) value let propMap name value fn = defaultArg (self.GetProperty name|>Option.map fn) value + let propMapOrPackage name value fn = + defaultArg (propOrPackage name|>Option.map fn) value + let tryBool (s: string) = Boolean.TryParse s |> function true, value -> value | _ -> false let splitString = String.split[|';'|] >> Array.map (fun x -> x.Trim()) >> List.ofArray @@ -2107,22 +2119,22 @@ type ProjectFile with let optionalInfo = { Title = prop "Title" Owners = propMap "Owners" [] splitString - ReleaseNotes = prop "ReleaseNotes" + ReleaseNotes = propOrPackage "ReleaseNotes" Summary = prop "Summary" Readme = prop "Readme" Language = prop "Langauge" - ProjectUrl = prop "ProjectUrl" - IconUrl = prop "IconUrl" + ProjectUrl = propOrPackage "ProjectUrl" + IconUrl = propOrPackage "IconUrl" Icon = prop "Icon" - LicenseExpression = prop "LicenseExpression" - LicenseUrl = prop "LicenseUrl" + LicenseExpression = propOrPackage "LicenseExpression" + LicenseUrl = propOrPackage "LicenseUrl" Copyright = prop "Copyright" RepositoryType = prop "RepositoryType" RepositoryUrl = prop "RepositoryUrl" RepositoryBranch = prop "RepositoryBranch" RepositoryCommit = prop "RepositoryCommit" - RequireLicenseAcceptance = propMap "RequireLicenseAcceptance" false tryBool - Tags = propMap "Tags" [] splitString + RequireLicenseAcceptance = propMapOrPackage "RequireLicenseAcceptance" false tryBool + Tags = propMapOrPackage "Tags" [] splitString DevelopmentDependency = propMap "DevelopmentDependency" false tryBool DependencyGroups = [] ExcludedDependencies = Set.empty //propOr "ExcludedDependencies" diff --git a/tests/Paket.Tests/Packaging/PackageProcessSpecs.fs b/tests/Paket.Tests/Packaging/PackageProcessSpecs.fs index 7f07b009ca..97ae90297d 100644 --- a/tests/Paket.Tests/Packaging/PackageProcessSpecs.fs +++ b/tests/Paket.Tests/Packaging/PackageProcessSpecs.fs @@ -94,4 +94,33 @@ let ``#3195 resolveProjectId does not override an id already present in the temp """ let projFile = ProjectFile.LoadFromString("dummy.fsproj", projectFileContents) Paket.PackageProcess.resolveProjectId projFile "AssemblyName" (Some "Template.Id") - |> shouldEqual (Some "Template.Id") \ No newline at end of file + |> shouldEqual (Some "Template.Id") + +[] +let ``#3603 GetTemplateMetadata reads PackageReleaseNotes from an SDK-style csproj``() = + let projectFileContents = """ + + + netstandard2.0 + Fixed some bugs. + + +""" + let projFile = ProjectFile.LoadFromString("dummy.fsproj", projectFileContents) + let _, optionalInfo = projFile.GetTemplateMetadata() + optionalInfo.ReleaseNotes |> shouldEqual (Some "Fixed some bugs.") + +[] +let ``#3603 GetTemplateMetadata prefers plain ReleaseNotes over PackageReleaseNotes``() = + let projectFileContents = """ + + + netstandard2.0 + Plain wins. + Package loses. + + +""" + let projFile = ProjectFile.LoadFromString("dummy.fsproj", projectFileContents) + let _, optionalInfo = projFile.GetTemplateMetadata() + optionalInfo.ReleaseNotes |> shouldEqual (Some "Plain wins.") \ No newline at end of file