loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'Some NuGet package enhancements' (#3246) from viceice/forgejo:feat/nuget/improvements into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3246
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>

+73 -32
+32 -2
modules/packages/nuget/metadata.go
··· 59 59 type Metadata struct { 60 60 Description string `json:"description,omitempty"` 61 61 ReleaseNotes string `json:"release_notes,omitempty"` 62 + Readme string `json:"readme,omitempty"` 62 63 Authors string `json:"authors,omitempty"` 63 64 ProjectURL string `json:"project_url,omitempty"` 64 65 RepositoryURL string `json:"repository_url,omitempty"` ··· 72 73 Version string `json:"version"` 73 74 } 74 75 76 + // https://learn.microsoft.com/en-us/nuget/reference/nuspec 75 77 type nuspecPackage struct { 76 78 Metadata struct { 77 79 ID string `xml:"id"` ··· 81 83 ProjectURL string `xml:"projectUrl"` 82 84 Description string `xml:"description"` 83 85 ReleaseNotes string `xml:"releaseNotes"` 86 + Readme string `xml:"readme"` 84 87 PackageTypes struct { 85 88 PackageType []struct { 86 89 Name string `xml:"name,attr"` ··· 90 93 URL string `xml:"url,attr"` 91 94 } `xml:"repository"` 92 95 Dependencies struct { 96 + Dependency []struct { 97 + ID string `xml:"id,attr"` 98 + Version string `xml:"version,attr"` 99 + Exclude string `xml:"exclude,attr"` 100 + } `xml:"dependency"` 93 101 Group []struct { 94 102 TargetFramework string `xml:"targetFramework,attr"` 95 103 Dependency []struct { ··· 123 131 } 124 132 defer f.Close() 125 133 126 - return ParseNuspecMetaData(f) 134 + return ParseNuspecMetaData(archive, f) 127 135 } 128 136 } 129 137 return nil, ErrMissingNuspecFile 130 138 } 131 139 132 140 // ParseNuspecMetaData parses a Nuspec file to retrieve the metadata of a Nuget package 133 - func ParseNuspecMetaData(r io.Reader) (*Package, error) { 141 + func ParseNuspecMetaData(archive *zip.Reader, r io.Reader) (*Package, error) { 134 142 var nuspecBuf bytes.Buffer 135 143 var p nuspecPackage 136 144 if err := xml.NewDecoder(io.TeeReader(r, &nuspecBuf)).Decode(&p); err != nil { ··· 168 176 Dependencies: make(map[string][]Dependency), 169 177 } 170 178 179 + if p.Metadata.Readme != "" { 180 + f, err := archive.Open(p.Metadata.Readme) 181 + if err == nil { 182 + buf, _ := io.ReadAll(f) 183 + m.Readme = string(buf) 184 + _ = f.Close() 185 + } 186 + } 187 + 188 + if len(p.Metadata.Dependencies.Dependency) > 0 { 189 + deps := make([]Dependency, 0, len(p.Metadata.Dependencies.Dependency)) 190 + for _, dep := range p.Metadata.Dependencies.Dependency { 191 + if dep.ID == "" || dep.Version == "" { 192 + continue 193 + } 194 + deps = append(deps, Dependency{ 195 + ID: dep.ID, 196 + Version: dep.Version, 197 + }) 198 + } 199 + m.Dependencies[""] = deps 200 + } 171 201 for _, group := range p.Metadata.Dependencies.Group { 172 202 deps := make([]Dependency, 0, len(group.Dependency)) 173 203 for _, dep := range group.Dependency {
+37 -25
modules/packages/nuget/metadata_test.go
··· 6 6 import ( 7 7 "archive/zip" 8 8 "bytes" 9 - "strings" 10 9 "testing" 11 10 12 11 "github.com/stretchr/testify/assert" ··· 19 18 projectURL = "https://gitea.io" 20 19 description = "Package Description" 21 20 releaseNotes = "Package Release Notes" 21 + readme = "Readme" 22 22 repositoryURL = "https://gitea.io/gitea/gitea" 23 23 targetFramework = ".NETStandard2.1" 24 24 dependencyID = "System.Text.Json" ··· 36 36 <description>` + description + `</description> 37 37 <releaseNotes>` + releaseNotes + `</releaseNotes> 38 38 <repository url="` + repositoryURL + `" /> 39 + <readme>README.md</readme> 39 40 <dependencies> 40 41 <group targetFramework="` + targetFramework + `"> 41 42 <dependency id="` + dependencyID + `" version="` + dependencyVersion + `" exclude="Build,Analyzers" /> ··· 60 61 </package>` 61 62 62 63 func TestParsePackageMetaData(t *testing.T) { 63 - createArchive := func(name, content string) []byte { 64 + createArchive := func(files map[string]string) []byte { 64 65 var buf bytes.Buffer 65 66 archive := zip.NewWriter(&buf) 66 - w, _ := archive.Create(name) 67 - w.Write([]byte(content)) 67 + for name, content := range files { 68 + w, _ := archive.Create(name) 69 + w.Write([]byte(content)) 70 + } 68 71 archive.Close() 69 72 return buf.Bytes() 70 73 } 71 74 72 75 t.Run("MissingNuspecFile", func(t *testing.T) { 73 - data := createArchive("dummy.txt", "") 76 + data := createArchive(map[string]string{"dummy.txt": ""}) 74 77 75 78 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 76 79 assert.Nil(t, np) ··· 78 81 }) 79 82 80 83 t.Run("MissingNuspecFileInRoot", func(t *testing.T) { 81 - data := createArchive("sub/package.nuspec", "") 84 + data := createArchive(map[string]string{"sub/package.nuspec": ""}) 82 85 83 86 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 84 87 assert.Nil(t, np) ··· 86 89 }) 87 90 88 91 t.Run("InvalidNuspecFile", func(t *testing.T) { 89 - data := createArchive("package.nuspec", "") 92 + data := createArchive(map[string]string{"package.nuspec": ""}) 90 93 91 94 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 92 95 assert.Nil(t, np) ··· 94 97 }) 95 98 96 99 t.Run("InvalidPackageId", func(t *testing.T) { 97 - data := createArchive("package.nuspec", `<?xml version="1.0" encoding="utf-8"?> 100 + data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?> 98 101 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 99 102 <metadata></metadata> 100 - </package>`) 103 + </package>`}) 101 104 102 105 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 103 106 assert.Nil(t, np) ··· 105 108 }) 106 109 107 110 t.Run("InvalidPackageVersion", func(t *testing.T) { 108 - data := createArchive("package.nuspec", `<?xml version="1.0" encoding="utf-8"?> 111 + data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?> 109 112 <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 110 113 <metadata> 111 - <id>`+id+`</id> 114 + <id>` + id + `</id> 112 115 </metadata> 113 - </package>`) 116 + </package>`}) 114 117 115 118 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 116 119 assert.Nil(t, np) 117 120 assert.ErrorIs(t, err, ErrNuspecInvalidVersion) 118 121 }) 119 122 120 - t.Run("Valid", func(t *testing.T) { 121 - data := createArchive("package.nuspec", nuspecContent) 123 + t.Run("MissingReadme", func(t *testing.T) { 124 + data := createArchive(map[string]string{"package.nuspec": nuspecContent}) 122 125 123 126 np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 124 127 assert.NoError(t, err) 125 128 assert.NotNil(t, np) 129 + assert.Empty(t, np.Metadata.Readme) 126 130 }) 127 - } 128 131 129 - func TestParseNuspecMetaData(t *testing.T) { 130 132 t.Run("Dependency Package", func(t *testing.T) { 131 - np, err := ParseNuspecMetaData(strings.NewReader(nuspecContent)) 133 + data := createArchive(map[string]string{ 134 + "package.nuspec": nuspecContent, 135 + "README.md": readme, 136 + }) 137 + 138 + np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 132 139 assert.NoError(t, err) 133 140 assert.NotNil(t, np) 134 141 assert.Equal(t, DependencyPackage, np.PackageType) ··· 139 146 assert.Equal(t, projectURL, np.Metadata.ProjectURL) 140 147 assert.Equal(t, description, np.Metadata.Description) 141 148 assert.Equal(t, releaseNotes, np.Metadata.ReleaseNotes) 149 + assert.Equal(t, readme, np.Metadata.Readme) 142 150 assert.Equal(t, repositoryURL, np.Metadata.RepositoryURL) 143 151 assert.Len(t, np.Metadata.Dependencies, 1) 144 152 assert.Contains(t, np.Metadata.Dependencies, targetFramework) ··· 148 156 assert.Equal(t, dependencyVersion, deps[0].Version) 149 157 150 158 t.Run("NormalizedVersion", func(t *testing.T) { 151 - np, err := ParseNuspecMetaData(strings.NewReader(`<?xml version="1.0" encoding="utf-8"?> 152 - <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 153 - <metadata> 154 - <id>test</id> 155 - <version>1.04.5.2.5-rc.1+metadata</version> 156 - </metadata> 157 - </package>`)) 159 + data := createArchive(map[string]string{"package.nuspec": `<?xml version="1.0" encoding="utf-8"?> 160 + <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> 161 + <metadata> 162 + <id>test</id> 163 + <version>1.04.5.2.5-rc.1+metadata</version> 164 + </metadata> 165 + </package>`}) 166 + 167 + np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 158 168 assert.NoError(t, err) 159 169 assert.NotNil(t, np) 160 170 assert.Equal(t, "1.4.5.2-rc.1", np.Version) ··· 162 172 }) 163 173 164 174 t.Run("Symbols Package", func(t *testing.T) { 165 - np, err := ParseNuspecMetaData(strings.NewReader(symbolsNuspecContent)) 175 + data := createArchive(map[string]string{"package.nuspec": symbolsNuspecContent}) 176 + 177 + np, err := ParsePackageMetaData(bytes.NewReader(data), int64(len(data))) 166 178 assert.NoError(t, err) 167 179 assert.NotNil(t, np) 168 180 assert.Equal(t, SymbolsPackage, np.PackageType)
+4 -5
templates/package/content/nuget.tmpl
··· 16 16 </div> 17 17 </div> 18 18 19 - {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.ReleaseNotes}} 19 + {{if or .PackageDescriptor.Metadata.Description .PackageDescriptor.Metadata.ReleaseNotes .PackageDescriptor.Metadata.Readme}} 20 20 <h4 class="ui top attached header">{{ctx.Locale.Tr "packages.about"}}</h4> 21 - <div class="ui attached segment"> 22 - {{if .PackageDescriptor.Metadata.Description}}{{.PackageDescriptor.Metadata.Description}}{{end}} 23 - {{if .PackageDescriptor.Metadata.ReleaseNotes}}{{.PackageDescriptor.Metadata.ReleaseNotes}}{{end}} 24 - </div> 21 + {{if .PackageDescriptor.Metadata.Description}}<div class="ui attached segment">{{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.Description}}</div>{{end}} 22 + {{if .PackageDescriptor.Metadata.Readme}}<div class="ui attached segment markup markdown">{{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.Readme}}</div>{{end}} 23 + {{if .PackageDescriptor.Metadata.ReleaseNotes}}<div class="ui attached segment">{{RenderMarkdownToHtml $.Context .PackageDescriptor.Metadata.ReleaseNotes}}</div>{{end}} 25 24 {{end}} 26 25 27 26 {{if .PackageDescriptor.Metadata.Dependencies}}