From 54d47fd751d275005189278afed1beb8a8f361ec Mon Sep 17 00:00:00 2001 From: TheFox0x7 Date: Fri, 16 Jan 2026 17:42:17 +0100 Subject: [PATCH] add support for archive-upload rpc --- routers/web/githttp.go | 1 + routers/web/repo/githttp.go | 23 +++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/routers/web/githttp.go b/routers/web/githttp.go index ed3c56b07b..4cb573e315 100644 --- a/routers/web/githttp.go +++ b/routers/web/githttp.go @@ -22,5 +22,6 @@ func addOwnerRepoGitHTTPRouters(m *web.Router) { m.Methods("GET,OPTIONS", "/objects/{head:[0-9a-f]{2}}/{hash:[0-9a-f]{38,62}}", repo.GetLooseObject) m.Methods("GET,OPTIONS", "/objects/pack/pack-{file:[0-9a-f]{40,64}}.pack", repo.GetPackFile) m.Methods("GET,OPTIONS", "/objects/pack/pack-{file:[0-9a-f]{40,64}}.idx", repo.GetIdxFile) + m.Post("/git-upload-archive", repo.ServiceUploadArchive) }, repo.HTTPGitEnabledHandler, repo.CorsHandler(), optSignInFromAnyOrigin, context.UserAssignmentWeb()) } diff --git a/routers/web/repo/githttp.go b/routers/web/repo/githttp.go index c7b53dcbfb..5689e6a1b2 100644 --- a/routers/web/repo/githttp.go +++ b/routers/web/repo/githttp.go @@ -387,6 +387,9 @@ func prepareGitCmdWithAllowedService(service string) (*gitcmd.Command, error) { if service == ServiceTypeUploadPack { return gitcmd.NewCommand(ServiceTypeUploadPack), nil } + if service == ServiceTypeUploadArchive { + return gitcmd.NewCommand(ServiceTypeUploadArchive), nil + } return nil, fmt.Errorf("service %q is not allowed", service) } @@ -435,7 +438,10 @@ func serviceRPC(ctx *context.Context, h *serviceHandler, service string) { } var stderr bytes.Buffer - if err := gitrepo.RunCmd(ctx, h.getStorageRepo(), cmd.AddArguments("--stateless-rpc", "."). + if service != ServiceTypeUploadArchive { + cmd.AddArguments("--stateless-rpc") + } + if err := gitrepo.RunCmd(ctx, h.getStorageRepo(), cmd.AddArguments("."). WithEnv(append(os.Environ(), h.environ...)). WithStderr(&stderr). WithStdin(reqBody). @@ -444,13 +450,13 @@ func serviceRPC(ctx *context.Context, h *serviceHandler, service string) { if !git.IsErrCanceledOrKilled(err) { log.Error("Fail to serve RPC(%s) in %s: %v - %s", service, h.getStorageRepo().RelativePath(), err, stderr.String()) } - return } } const ( - ServiceTypeUploadPack = "upload-pack" - ServiceTypeReceivePack = "receive-pack" + ServiceTypeUploadPack = "upload-pack" + ServiceTypeReceivePack = "receive-pack" + ServiceTypeUploadArchive = "upload-archive" ) // ServiceUploadPack implements Git Smart HTTP protocol @@ -461,6 +467,13 @@ func ServiceUploadPack(ctx *context.Context) { } } +func ServiceUploadArchive(ctx *context.Context) { + h := httpBase(ctx) + if h != nil { + serviceRPC(ctx, h, ServiceTypeUploadArchive) + } +} + // ServiceReceivePack implements Git Smart HTTP protocol func ServiceReceivePack(ctx *context.Context) { h := httpBase(ctx) @@ -475,6 +488,8 @@ func getServiceType(ctx *context.Context) string { return ServiceTypeUploadPack case "git-" + ServiceTypeReceivePack: return ServiceTypeReceivePack + case "git-" + ServiceTypeUploadArchive: + return ServiceTypeUploadArchive } return "" }