aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2023-05-05 09:13:15 -0400
committerGopher Robot <gobot@golang.org>2023-12-14 19:46:23 +0000
commit6aa482681ca72aa3b18d4491e6db1694ef1be6bc (patch)
treed0b78d9cd30f1a684c33704adf4e00f55c2d5465
parent23fee06a140ea6e5ac184e255786900479ca52ca (diff)
downloadgo-6aa482681ca72aa3b18d4491e6db1694ef1be6bc.tar.gz
go-6aa482681ca72aa3b18d4491e6db1694ef1be6bc.zip
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 <matloob@golang.org> Auto-Submit: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Bryan Mills <bcmills@google.com>
-rw-r--r--src/cmd/go/internal/modfetch/codehost/git_test.go6
-rw-r--r--src/cmd/go/internal/vcweb/git.go39
2 files changed, 29 insertions, 16 deletions
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
}