mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 03:18:24 +00:00 
			
		
		
		
	Add Go package registry (#24687)
Fixes #7608 This PR adds a Go package registry usable with the Go proxy protocol. 
This commit is contained in:
		| @@ -24,6 +24,7 @@ import ( | ||||
| 	"code.gitea.io/gitea/routers/api/packages/container" | ||||
| 	"code.gitea.io/gitea/routers/api/packages/debian" | ||||
| 	"code.gitea.io/gitea/routers/api/packages/generic" | ||||
| 	"code.gitea.io/gitea/routers/api/packages/goproxy" | ||||
| 	"code.gitea.io/gitea/routers/api/packages/helm" | ||||
| 	"code.gitea.io/gitea/routers/api/packages/maven" | ||||
| 	"code.gitea.io/gitea/routers/api/packages/npm" | ||||
| @@ -312,6 +313,64 @@ func CommonRoutes(ctx gocontext.Context) *web.Route { | ||||
| 				}, reqPackageAccess(perm.AccessModeWrite)) | ||||
| 			}) | ||||
| 		}, reqPackageAccess(perm.AccessModeRead)) | ||||
| 		r.Group("/go", func() { | ||||
| 			r.Put("/upload", reqPackageAccess(perm.AccessModeWrite), goproxy.UploadPackage) | ||||
| 			r.Get("/sumdb/sum.golang.org/supported", func(ctx *context.Context) { | ||||
| 				ctx.Status(http.StatusNotFound) | ||||
| 			}) | ||||
|  | ||||
| 			// Manual mapping of routes because the package name contains slashes which chi does not support | ||||
| 			// https://go.dev/ref/mod#goproxy-protocol | ||||
| 			r.Get("/*", func(ctx *context.Context) { | ||||
| 				path := ctx.Params("*") | ||||
|  | ||||
| 				if strings.HasSuffix(path, "/@latest") { | ||||
| 					ctx.SetParams("name", path[:len(path)-len("/@latest")]) | ||||
| 					ctx.SetParams("version", "latest") | ||||
|  | ||||
| 					goproxy.PackageVersionMetadata(ctx) | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				parts := strings.SplitN(path, "/@v/", 2) | ||||
| 				if len(parts) != 2 { | ||||
| 					ctx.Status(http.StatusNotFound) | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				ctx.SetParams("name", parts[0]) | ||||
|  | ||||
| 				// <package/name>/@v/list | ||||
| 				if parts[1] == "list" { | ||||
| 					goproxy.EnumeratePackageVersions(ctx) | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				// <package/name>/@v/<version>.zip | ||||
| 				if strings.HasSuffix(parts[1], ".zip") { | ||||
| 					ctx.SetParams("version", parts[1][:len(parts[1])-len(".zip")]) | ||||
|  | ||||
| 					goproxy.DownloadPackageFile(ctx) | ||||
| 					return | ||||
| 				} | ||||
| 				// <package/name>/@v/<version>.info | ||||
| 				if strings.HasSuffix(parts[1], ".info") { | ||||
| 					ctx.SetParams("version", parts[1][:len(parts[1])-len(".info")]) | ||||
|  | ||||
| 					goproxy.PackageVersionMetadata(ctx) | ||||
| 					return | ||||
| 				} | ||||
| 				// <package/name>/@v/<version>.mod | ||||
| 				if strings.HasSuffix(parts[1], ".mod") { | ||||
| 					ctx.SetParams("version", parts[1][:len(parts[1])-len(".mod")]) | ||||
|  | ||||
| 					goproxy.PackageVersionGoModContent(ctx) | ||||
| 					return | ||||
| 				} | ||||
|  | ||||
| 				ctx.Status(http.StatusNotFound) | ||||
| 			}) | ||||
| 		}, reqPackageAccess(perm.AccessModeRead)) | ||||
| 		r.Group("/generic", func() { | ||||
| 			r.Group("/{packagename}/{packageversion}", func() { | ||||
| 				r.Delete("", reqPackageAccess(perm.AccessModeWrite), generic.DeletePackage) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user