From: Bryan C. Mills Date: Fri, 5 May 2023 13:13:15 +0000 (-0400) Subject: cmd/go/internal/vcweb: set GIT_PROTOCOL in the git CGI handler X-Git-Tag: go1.22rc1~7 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=6aa482681ca72aa3b18d4491e6db1694ef1be6bc;p=gostls13.git cmd/go/internal/vcweb: set GIT_PROTOCOL in the git CGI handler This works around a bug in 'git http-backend' that was fixed in Git 2.34.0,¹ and will hopefully allow the tests in cmd/go/internal/modfetch/codehost to pass reliably using older Git releases (I tested with 2.30.2). ¹https://github.com/git/git/commit/ff6a37c99e3343633c53f56789afcc8f8165d276 Fixes #56881. Change-Id: Icd2e4d252d5f712685d146f34e11922dd0c41ff0 Reviewed-on: https://go-review.googlesource.com/c/go/+/549795 Reviewed-by: Michael Matloob Auto-Submit: Bryan Mills TryBot-Result: Gopher Robot Run-TryBot: Bryan Mills --- diff --git a/src/cmd/go/internal/modfetch/codehost/git_test.go b/src/cmd/go/internal/modfetch/codehost/git_test.go index 328ab5bf58..dba9935b58 100644 --- a/src/cmd/go/internal/modfetch/codehost/git_test.go +++ b/src/cmd/go/internal/modfetch/codehost/git_test.go @@ -280,9 +280,6 @@ func TestLatest(t *testing.T) { t.Fatal(err) } if !reflect.DeepEqual(info, tt.info) { - if !reflect.DeepEqual(info.Tags, tt.info.Tags) { - testenv.SkipFlaky(t, 56881) - } t.Errorf("Latest: incorrect info\nhave %+v (origin %+v)\nwant %+v (origin %+v)", info, info.Origin, tt.info, tt.info.Origin) } } @@ -661,9 +658,6 @@ func TestStat(t *testing.T) { } info.Origin = nil // TestLatest and ../../../testdata/script/reuse_git.txt test Origin well enough if !reflect.DeepEqual(info, tt.info) { - if !reflect.DeepEqual(info.Tags, tt.info.Tags) { - testenv.SkipFlaky(t, 56881) - } t.Errorf("Stat: incorrect info\nhave %+v\nwant %+v", *info, *tt.info) } } diff --git a/src/cmd/go/internal/vcweb/git.go b/src/cmd/go/internal/vcweb/git.go index 316c2382ba..d1e0563bed 100644 --- a/src/cmd/go/internal/vcweb/git.go +++ b/src/cmd/go/internal/vcweb/git.go @@ -37,16 +37,35 @@ func (h *gitHandler) Handler(dir string, env []string, logger *log.Logger) (http return nil, ServerNotInstalledError{name: "git"} } - handler := &cgi.Handler{ - Path: h.gitPath, - Logger: logger, - Args: []string{"http-backend"}, - Dir: dir, - Env: append(slices.Clip(env), - "GIT_PROJECT_ROOT="+dir, - "GIT_HTTP_EXPORT_ALL=1", - ), - } + baseEnv := append(slices.Clip(env), + "GIT_PROJECT_ROOT="+dir, + "GIT_HTTP_EXPORT_ALL=1", + ) + + handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + // The Git client sends the requested Git protocol version as a + // "Git-Protocol" HTTP request header, which the CGI host then converts + // to an environment variable (HTTP_GIT_PROTOCOL). + // + // However, versions of Git older that 2.34.0 don't recognize the + // HTTP_GIT_PROTOCOL variable, and instead need that value to be set in the + // GIT_PROTOCOL variable. We do so here so that vcweb can work reliably + // with older Git releases. (As of the time of writing, the Go project's + // builders were on Git version 2.30.2.) + env := slices.Clip(baseEnv) + if p := req.Header.Get("Git-Protocol"); p != "" { + env = append(env, "GIT_PROTOCOL="+p) + } + + h := &cgi.Handler{ + Path: h.gitPath, + Logger: logger, + Args: []string{"http-backend"}, + Dir: dir, + Env: env, + } + h.ServeHTTP(w, req) + }) return handler, nil }