mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-27 00:23:41 +09:00 
			
		
		
		
	Support nuspec manifest download for nuget packages (#28921)
Support downloading nuget nuspec manifest[^1]. This is useful for renovate because it uses this api to find the corresponding repository - Store nuspec along with nupkg on upload - allow downloading nuspec - add doctor command to add missing nuspec files [^1]: https://learn.microsoft.com/en-us/nuget/api/package-base-address-resource#download-package-manifest-nuspec --------- Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
This commit is contained in:
		| @@ -90,29 +90,33 @@ func TestPackageNuGet(t *testing.T) { | ||||
| 	symbolFilename := "test.pdb" | ||||
| 	symbolID := "d910bb6948bd4c6cb40155bcf52c3c94" | ||||
|  | ||||
| 	createPackage := func(id, version string) io.Reader { | ||||
| 	createNuspec := func(id, version string) string { | ||||
| 		return `<?xml version="1.0" encoding="utf-8"?> | ||||
| <package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> | ||||
| 	<metadata> | ||||
| 		<id>` + id + `</id> | ||||
| 		<version>` + version + `</version> | ||||
| 		<authors>` + packageAuthors + `</authors> | ||||
| 		<description>` + packageDescription + `</description> | ||||
| 		<dependencies> | ||||
| 			<group targetFramework=".NETStandard2.0"> | ||||
| 				<dependency id="Microsoft.CSharp" version="4.5.0" /> | ||||
| 			</group> | ||||
| 		</dependencies> | ||||
| 	</metadata> | ||||
| </package>` | ||||
| 	} | ||||
|  | ||||
| 	createPackage := func(id, version string) *bytes.Buffer { | ||||
| 		var buf bytes.Buffer | ||||
| 		archive := zip.NewWriter(&buf) | ||||
| 		w, _ := archive.Create("package.nuspec") | ||||
| 		w.Write([]byte(`<?xml version="1.0" encoding="utf-8"?> | ||||
| 		<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd"> | ||||
| 			<metadata> | ||||
| 				<id>` + id + `</id> | ||||
| 				<version>` + version + `</version> | ||||
| 				<authors>` + packageAuthors + `</authors> | ||||
| 				<description>` + packageDescription + `</description> | ||||
| 				<dependencies> | ||||
| 					<group targetFramework=".NETStandard2.0"> | ||||
| 						<dependency id="Microsoft.CSharp" version="4.5.0" /> | ||||
| 					</group> | ||||
| 				</dependencies> | ||||
| 			</metadata> | ||||
| 		</package>`)) | ||||
| 		w.Write([]byte(createNuspec(id, version))) | ||||
| 		archive.Close() | ||||
| 		return &buf | ||||
| 	} | ||||
|  | ||||
| 	content, _ := io.ReadAll(createPackage(packageName, packageVersion)) | ||||
| 	content := createPackage(packageName, packageVersion).Bytes() | ||||
|  | ||||
| 	url := fmt.Sprintf("/api/packages/%s/nuget", user.Name) | ||||
|  | ||||
| @@ -224,7 +228,7 @@ func TestPackageNuGet(t *testing.T) { | ||||
|  | ||||
| 			pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeNuGet) | ||||
| 			assert.NoError(t, err) | ||||
| 			assert.Len(t, pvs, 1) | ||||
| 			assert.Len(t, pvs, 1, "Should have one version") | ||||
|  | ||||
| 			pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) | ||||
| 			assert.NoError(t, err) | ||||
| @@ -235,13 +239,21 @@ func TestPackageNuGet(t *testing.T) { | ||||
|  | ||||
| 			pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID) | ||||
| 			assert.NoError(t, err) | ||||
| 			assert.Len(t, pfs, 1) | ||||
| 			assert.Equal(t, fmt.Sprintf("%s.%s.nupkg", packageName, packageVersion), pfs[0].Name) | ||||
| 			assert.True(t, pfs[0].IsLead) | ||||
| 			assert.Len(t, pfs, 2, "Should have 2 files: nuget and nuspec") | ||||
| 			for _, pf := range pfs { | ||||
| 				switch pf.Name { | ||||
| 				case fmt.Sprintf("%s.%s.nupkg", packageName, packageVersion): | ||||
| 					assert.True(t, pf.IsLead) | ||||
|  | ||||
| 			pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID) | ||||
| 			assert.NoError(t, err) | ||||
| 			assert.Equal(t, int64(len(content)), pb.Size) | ||||
| 					pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID) | ||||
| 					assert.NoError(t, err) | ||||
| 					assert.Equal(t, int64(len(content)), pb.Size) | ||||
| 				case fmt.Sprintf("%s.nuspec", packageName): | ||||
| 					assert.False(t, pf.IsLead) | ||||
| 				default: | ||||
| 					assert.Fail(t, "unexpected filename: %v", pf.Name) | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			req = NewRequestWithBody(t, "PUT", url, bytes.NewReader(content)). | ||||
| 				AddBasicAuth(user.Name) | ||||
| @@ -302,16 +314,27 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`) | ||||
|  | ||||
| 			pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID) | ||||
| 			assert.NoError(t, err) | ||||
| 			assert.Len(t, pfs, 3) | ||||
| 			assert.Len(t, pfs, 4, "Should have 4 files: nupkg, snupkg, nuspec and pdb") | ||||
| 			for _, pf := range pfs { | ||||
| 				switch pf.Name { | ||||
| 				case fmt.Sprintf("%s.%s.nupkg", packageName, packageVersion): | ||||
| 					assert.True(t, pf.IsLead) | ||||
|  | ||||
| 					pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID) | ||||
| 					assert.NoError(t, err) | ||||
| 					assert.Equal(t, int64(412), pb.Size) | ||||
| 				case fmt.Sprintf("%s.%s.snupkg", packageName, packageVersion): | ||||
| 					assert.False(t, pf.IsLead) | ||||
|  | ||||
| 					pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID) | ||||
| 					assert.NoError(t, err) | ||||
| 					assert.Equal(t, int64(616), pb.Size) | ||||
| 				case fmt.Sprintf("%s.nuspec", packageName): | ||||
| 					assert.False(t, pf.IsLead) | ||||
|  | ||||
| 					pb, err := packages.GetBlobByID(db.DefaultContext, pf.BlobID) | ||||
| 					assert.NoError(t, err) | ||||
| 					assert.Equal(t, int64(427), pb.Size) | ||||
| 				case symbolFilename: | ||||
| 					assert.False(t, pf.IsLead) | ||||
|  | ||||
| @@ -353,6 +376,12 @@ AAAjQmxvYgAAAGm7ENm9SGxMtAFVvPUsPJTF6PbtAAAAAFcVogEJAAAAAQAAAA==`) | ||||
|  | ||||
| 		assert.Equal(t, content, resp.Body.Bytes()) | ||||
|  | ||||
| 		req = NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s.nuspec", url, packageName, packageVersion, packageName)). | ||||
| 			AddBasicAuth(user.Name) | ||||
| 		resp = MakeRequest(t, req, http.StatusOK) | ||||
|  | ||||
| 		assert.Equal(t, createNuspec(packageName, packageVersion), resp.Body.String()) | ||||
|  | ||||
| 		checkDownloadCount(1) | ||||
|  | ||||
| 		req = NewRequest(t, "GET", fmt.Sprintf("%s/package/%s/%s/%s.%s.snupkg", url, packageName, packageVersion, packageName, packageVersion)). | ||||
|   | ||||
		Reference in New Issue
	
	Block a user