diff --git a/modules/packages/nuget/metadata.go b/modules/packages/nuget/metadata.go index 1e98ddffde..dfb81baf4e 100644 --- a/modules/packages/nuget/metadata.go +++ b/modules/packages/nuget/metadata.go @@ -57,12 +57,21 @@ type Package struct { // Metadata represents the metadata of a Nuget package type Metadata struct { + Title string `json:"title,omitempty"` + Language string `json:"language,omitempty"` Description string `json:"description,omitempty"` ReleaseNotes string `json:"release_notes,omitempty"` Readme string `json:"readme,omitempty"` Authors string `json:"authors,omitempty"` + Owners string `json:"owners,omitempty"` + Copyright string `json:"copyright,omitempty"` ProjectURL string `json:"project_url,omitempty"` RepositoryURL string `json:"repository_url,omitempty"` + LicenseURL string `json:"license_url,omitempty"` + IconURL string `json:"icon_url,omitempty"` + MinClientVersion string `json:"min_client_version,omitempty"` + Tags string `json:"tags,omitempty"` + DevelopmentDependency bool `json:"development_dependency,omitempty"` RequireLicenseAcceptance bool `json:"require_license_acceptance"` Dependencies map[string][]Dependency `json:"dependencies,omitempty"` } @@ -77,13 +86,22 @@ type Dependency struct { type nuspecPackage struct { Metadata struct { ID string `xml:"id"` + Title string `xml:"title"` + Language string `xml:"language"` Version string `xml:"version"` Authors string `xml:"authors"` + Owners string `xml:"owners"` + Copyright string `xml:"copyright"` + DevelopmentDependency bool `xml:"developmentDependency"` RequireLicenseAcceptance bool `xml:"requireLicenseAcceptance"` ProjectURL string `xml:"projectUrl"` + LicenseURL string `xml:"licenseUrl"` + IconURL string `xml:"iconUrl"` Description string `xml:"description"` ReleaseNotes string `xml:"releaseNotes"` Readme string `xml:"readme"` + Tags string `xml:"tags"` + MinClientVersion string `xml:"minClientVersion,attr"` PackageTypes struct { PackageType []struct { Name string `xml:"name,attr"` @@ -167,11 +185,20 @@ func ParseNuspecMetaData(archive *zip.Reader, r io.Reader) (*Package, error) { } m := &Metadata{ + Title: p.Metadata.Title, + Language: p.Metadata.Language, Description: p.Metadata.Description, ReleaseNotes: p.Metadata.ReleaseNotes, Authors: p.Metadata.Authors, + Owners: p.Metadata.Owners, + Copyright: p.Metadata.Copyright, ProjectURL: p.Metadata.ProjectURL, RepositoryURL: p.Metadata.Repository.URL, + LicenseURL: p.Metadata.LicenseURL, + IconURL: p.Metadata.IconURL, + MinClientVersion: p.Metadata.MinClientVersion, + Tags: p.Metadata.Tags, + DevelopmentDependency: p.Metadata.DevelopmentDependency, RequireLicenseAcceptance: p.Metadata.RequireLicenseAcceptance, Dependencies: make(map[string][]Dependency), } diff --git a/modules/packages/nuget/metadata_test.go b/modules/packages/nuget/metadata_test.go index ecce052be4..8a34f1a5ae 100644 --- a/modules/packages/nuget/metadata_test.go +++ b/modules/packages/nuget/metadata_test.go @@ -13,14 +13,22 @@ import ( ) const ( - id = "System.Gitea" + id = "System.Forgejo" + title = "Package Title" + language = "Package Language" semver = "1.0.1" - authors = "Gitea Authors" - projectURL = "https://gitea.io" + authors = "Forgejo Authors" + owners = "Package Owners" + copyright = "Package Copyright" + projectURL = "https://forgejo.org" + licenseURL = "https://forgejo.org/docs/latest/license/" + iconURL = "https://codeberg.org/forgejo/governance/raw/branch/main/branding/logo/forgejo.png" description = "Package Description" releaseNotes = "Package Release Notes" readme = "Readme" - repositoryURL = "https://gitea.io/gitea/gitea" + tags = "tag_1 tag_2 tag_3" + minClientVersion = "1.0.0.0" + repositoryURL = "https://codeberg.org/forgejo" targetFramework = ".NETStandard2.1" dependencyID = "System.Text.Json" dependencyVersion = "5.0.0" @@ -28,16 +36,24 @@ const ( const nuspecContent = ` - + ` + id + ` + ` + title + ` + ` + language + ` ` + semver + ` ` + authors + ` + ` + owners + ` + ` + copyright + ` + true true ` + projectURL + ` + ` + licenseURL + ` + ` + iconURL + ` ` + description + ` ` + releaseNotes + ` README.md + ` + tags + ` @@ -142,12 +158,22 @@ func TestParsePackageMetaData(t *testing.T) { assert.Equal(t, DependencyPackage, np.PackageType) assert.Equal(t, id, np.ID) + assert.Equal(t, title, np.Metadata.Title) + assert.Equal(t, language, np.Metadata.Language) assert.Equal(t, semver, np.Version) assert.Equal(t, authors, np.Metadata.Authors) + assert.Equal(t, owners, np.Metadata.Owners) + assert.Equal(t, copyright, np.Metadata.Copyright) + assert.True(t, np.Metadata.DevelopmentDependency) + assert.True(t, np.Metadata.RequireLicenseAcceptance) assert.Equal(t, projectURL, np.Metadata.ProjectURL) + assert.Equal(t, licenseURL, np.Metadata.LicenseURL) + assert.Equal(t, iconURL, np.Metadata.IconURL) assert.Equal(t, description, np.Metadata.Description) assert.Equal(t, releaseNotes, np.Metadata.ReleaseNotes) assert.Equal(t, readme, np.Metadata.Readme) + assert.Equal(t, tags, np.Metadata.Tags) + assert.Equal(t, minClientVersion, np.Metadata.MinClientVersion) assert.Equal(t, repositoryURL, np.Metadata.RepositoryURL) assert.Len(t, np.Metadata.Dependencies, 1) assert.Contains(t, np.Metadata.Dependencies, targetFramework) diff --git a/routers/api/packages/nuget/api_v2.go b/routers/api/packages/nuget/api_v2.go index a726065ad0..073b2700ef 100644 --- a/routers/api/packages/nuget/api_v2.go +++ b/routers/api/packages/nuget/api_v2.go @@ -249,6 +249,9 @@ type FeedEntryProperties struct { Version string `xml:"d:Version"` NormalizedVersion string `xml:"d:NormalizedVersion"` Authors string `xml:"d:Authors"` + Owners string `xml:"d:Owners,omitempty"` + Copyright string `xml:"d:Copyright,omitempty"` + Language string `xml:"d:Language,omitempty"` Dependencies string `xml:"d:Dependencies"` Description string `xml:"d:Description"` VersionDownloadCount TypedValue[int64] `xml:"d:VersionDownloadCount"` @@ -258,9 +261,15 @@ type FeedEntryProperties struct { LastUpdated TypedValue[time.Time] `xml:"d:LastUpdated"` Published TypedValue[time.Time] `xml:"d:Published"` ProjectURL string `xml:"d:ProjectUrl,omitempty"` + LicenseURL string `xml:"d:LicenseUrl,omitempty"` + IconURL string `xml:"d:IconUrl,omitempty"` ReleaseNotes string `xml:"d:ReleaseNotes,omitempty"` RequireLicenseAcceptance TypedValue[bool] `xml:"d:RequireLicenseAcceptance"` - Title string `xml:"d:Title"` + DevelopmentDependency TypedValue[bool] `xml:"d:DevelopmentDependency"` + Title string `xml:"d:Title,omitempty"` + MinClientVersion string `xml:"d:MinClientVersion,omitempty"` + Tags string `xml:"d:Tags,omitempty"` + ID string `xml:"d:Id,omitempty"` } type FeedEntry struct { @@ -356,6 +365,9 @@ func createEntry(l *linkBuilder, pd *packages_model.PackageDescriptor, withNames Version: pd.Version.Version, NormalizedVersion: pd.Version.Version, Authors: metadata.Authors, + Owners: metadata.Owners, + Copyright: metadata.Copyright, + Language: metadata.Language, Dependencies: buildDependencyString(metadata), Description: metadata.Description, VersionDownloadCount: TypedValue[int64]{Type: "Edm.Int64", Value: pd.Version.DownloadCount}, @@ -365,9 +377,15 @@ func createEntry(l *linkBuilder, pd *packages_model.PackageDescriptor, withNames LastUpdated: createdValue, Published: createdValue, ProjectURL: metadata.ProjectURL, + LicenseURL: metadata.LicenseURL, + IconURL: metadata.IconURL, ReleaseNotes: metadata.ReleaseNotes, RequireLicenseAcceptance: TypedValue[bool]{Type: "Edm.Boolean", Value: metadata.RequireLicenseAcceptance}, - Title: pd.Package.Name, + DevelopmentDependency: TypedValue[bool]{Type: "Edm.Boolean", Value: metadata.DevelopmentDependency}, + Title: metadata.Title, + MinClientVersion: metadata.MinClientVersion, + Tags: metadata.Tags, + ID: pd.Package.Name, }, } diff --git a/tests/integration/api_packages_nuget_test.go b/tests/integration/api_packages_nuget_test.go index 03e2176fe5..47b9cfe86c 100644 --- a/tests/integration/api_packages_nuget_test.go +++ b/tests/integration/api_packages_nuget_test.go @@ -49,6 +49,9 @@ func TestPackageNuGet(t *testing.T) { Version string `xml:"Version"` NormalizedVersion string `xml:"NormalizedVersion"` Authors string `xml:"Authors"` + Owners string `xml:"Owners,omitempty"` + Copyright string `xml:"Copyright,omitempty"` + Language string `xml:"Language,omitempty"` Dependencies string `xml:"Dependencies"` Description string `xml:"Description"` VersionDownloadCount nuget.TypedValue[int64] `xml:"VersionDownloadCount"` @@ -58,9 +61,15 @@ func TestPackageNuGet(t *testing.T) { LastUpdated nuget.TypedValue[time.Time] `xml:"LastUpdated"` Published nuget.TypedValue[time.Time] `xml:"Published"` ProjectURL string `xml:"ProjectUrl,omitempty"` + LicenseURL string `xml:"LicenseUrl,omitempty"` + IconURL string `xml:"IconUrl,omitempty"` ReleaseNotes string `xml:"ReleaseNotes,omitempty"` RequireLicenseAcceptance nuget.TypedValue[bool] `xml:"RequireLicenseAcceptance"` + DevelopmentDependency nuget.TypedValue[bool] `xml:"DevelopmentDependency"` Title string `xml:"Title"` + MinClientVersion string `xml:"MinClientVersion,omitempty"` + Tags string `xml:"Tags,omitempty"` + ID string `xml:"Id,omitempty"` } type FeedEntry struct { @@ -87,21 +96,43 @@ func TestPackageNuGet(t *testing.T) { packageName := "test.package" packageVersion := "1.0.3" packageAuthors := "KN4CK3R" - packageDescription := "Gitea Test Package" + packageDescription := "Forgejo Test Package" symbolFilename := "test.pdb" symbolID := "d910bb6948bd4c6cb40155bcf52c3c94" + packageTitle := "Package Title" + packageLanguage := "Package Language" + packageOwners := "Package Owners" + packageCopyright := "Package Copyright" + packageProjectURL := "https://forgejo.org" + packageLicenseURL := "https://forgejo.org/docs/latest/license/" + packageIconURL := "https://codeberg.org/forgejo/governance/raw/branch/main/branding/logo/forgejo.png" + packageReleaseNotes := "Package Release Notes" + packageTags := "tag_1 tag_2 tag_3" + packageMinClientVersion := "1.0.0.0" + createPackage := func(id, version string) io.Reader { var buf bytes.Buffer archive := zip.NewWriter(&buf) w, _ := archive.Create("package.nuspec") w.Write([]byte(` - + ` + id + ` + ` + packageTitle + ` + ` + packageLanguage + ` ` + version + ` ` + packageAuthors + ` + ` + packageOwners + ` + ` + packageCopyright + ` + true + true + ` + packageProjectURL + ` + ` + packageLicenseURL + ` + ` + packageIconURL + ` ` + packageDescription + ` + ` + packageReleaseNotes + ` + ` + packageTags + ` @@ -115,11 +146,22 @@ func TestPackageNuGet(t *testing.T) { nuspec := ` - + ` + packageName + ` + ` + packageTitle + ` + ` + packageLanguage + ` ` + packageVersion + ` ` + packageAuthors + ` + ` + packageOwners + ` + ` + packageCopyright + ` + true + true + ` + packageProjectURL + ` + ` + packageLicenseURL + ` + ` + packageIconURL + ` ` + packageDescription + ` + ` + packageReleaseNotes + ` + ` + packageTags + ` @@ -325,7 +367,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`) pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID) require.NoError(t, err) - assert.Equal(t, int64(414), pb.Size) + assert.Equal(t, int64(len(content)), pb.Size) case fmt.Sprintf("%s.%s.snupkg", packageName, packageVersion): assert.False(t, pf.IsLead) @@ -337,7 +379,7 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`) pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID) require.NoError(t, err) - assert.Equal(t, int64(453), pb.Size) + assert.Equal(t, int64(len([]byte(nuspec))), pb.Size) case symbolFilename: assert.False(t, pf.IsLead) @@ -668,10 +710,22 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`) var result FeedEntry decodeXML(t, resp, &result) - assert.Equal(t, packageName, result.Properties.Title) + assert.Equal(t, packageName, result.Properties.ID) assert.Equal(t, packageVersion, result.Properties.Version) assert.Equal(t, packageAuthors, result.Properties.Authors) assert.Equal(t, packageDescription, result.Properties.Description) + assert.Equal(t, packageTitle, result.Properties.Title) + assert.Equal(t, packageLanguage, result.Properties.Language) + assert.Equal(t, packageOwners, result.Properties.Owners) + assert.Equal(t, packageCopyright, result.Properties.Copyright) + assert.Equal(t, packageProjectURL, result.Properties.ProjectURL) + assert.Equal(t, packageLicenseURL, result.Properties.LicenseURL) + assert.Equal(t, packageIconURL, result.Properties.IconURL) + assert.Equal(t, packageReleaseNotes, result.Properties.ReleaseNotes) + assert.Equal(t, packageTags, result.Properties.Tags) + assert.Equal(t, packageMinClientVersion, result.Properties.MinClientVersion) + assert.True(t, result.Properties.DevelopmentDependency.Value) + assert.True(t, result.Properties.RequireLicenseAcceptance.Value) assert.Equal(t, "Microsoft.CSharp:4.5.0:.NETStandard2.0", result.Properties.Dependencies) })