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)
}
}
}
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)
}
}
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
}