Merge branch 'jk/http-server-protocol-versions'
Taking advantage of the CGI interface, http-backend has been updated to enable protocol v2 automatically when the other side asks for it. * jk/http-server-protocol-versions: docs/protocol-v2: point readers transport config discussion docs/git: discuss server-side config for GIT_PROTOCOL docs/http-backend: mention v2 protocol http-backend: handle HTTP_GIT_PROTOCOL CGI variable t5551: test v2-to-v0 http protocol fallbackmaint
						commit
						cabb41d0f6
					
				|  | @ -16,7 +16,9 @@ A simple CGI program to serve the contents of a Git repository to Git | ||||||
| clients accessing the repository over http:// and https:// protocols. | clients accessing the repository over http:// and https:// protocols. | ||||||
| The program supports clients fetching using both the smart HTTP protocol | The program supports clients fetching using both the smart HTTP protocol | ||||||
| and the backwards-compatible dumb HTTP protocol, as well as clients | and the backwards-compatible dumb HTTP protocol, as well as clients | ||||||
| pushing using the smart HTTP protocol. | pushing using the smart HTTP protocol. It also supports Git's | ||||||
|  | more-efficient "v2" protocol if properly configured; see the | ||||||
|  | discussion of `GIT_PROTOCOL` in the ENVIRONMENT section below. | ||||||
|  |  | ||||||
| It verifies that the directory has the magic file | It verifies that the directory has the magic file | ||||||
| "git-daemon-export-ok", and it will refuse to export any Git directory | "git-daemon-export-ok", and it will refuse to export any Git directory | ||||||
|  | @ -77,6 +79,18 @@ Apache 2.x:: | ||||||
| SetEnv GIT_PROJECT_ROOT /var/www/git | SetEnv GIT_PROJECT_ROOT /var/www/git | ||||||
| SetEnv GIT_HTTP_EXPORT_ALL | SetEnv GIT_HTTP_EXPORT_ALL | ||||||
| ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ | ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ | ||||||
|  |  | ||||||
|  | # This is not strictly necessary using Apache and a modern version of | ||||||
|  | # git-http-backend, as the webserver will pass along the header in the | ||||||
|  | # environment as HTTP_GIT_PROTOCOL, and http-backend will copy that into | ||||||
|  | # GIT_PROTOCOL. But you may need this line (or something similar if you | ||||||
|  | # are using a different webserver), or if you want to support older Git | ||||||
|  | # versions that did not do that copying. | ||||||
|  | # | ||||||
|  | # Having the webserver set up GIT_PROTOCOL is perfectly fine even with | ||||||
|  | # modern versions (and will take precedence over HTTP_GIT_PROTOCOL, | ||||||
|  | # which means it can be used to override the client's request). | ||||||
|  | SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
| + | + | ||||||
| To enable anonymous read access but authenticated write access, | To enable anonymous read access but authenticated write access, | ||||||
|  | @ -264,6 +278,16 @@ a repository with an extremely large number of refs.  The value can be | ||||||
| specified with a unit (e.g., `100M` for 100 megabytes). The default is | specified with a unit (e.g., `100M` for 100 megabytes). The default is | ||||||
| 10 megabytes. | 10 megabytes. | ||||||
|  |  | ||||||
|  | Clients may probe for optional protocol capabilities (like the v2 | ||||||
|  | protocol) using the `Git-Protocol` HTTP header. In order to support | ||||||
|  | these, the contents of that header must appear in the `GIT_PROTOCOL` | ||||||
|  | environment variable. Most webservers will pass this header to the CGI | ||||||
|  | via the `HTTP_GIT_PROTOCOL` variable, and `git-http-backend` will | ||||||
|  | automatically copy that to `GIT_PROTOCOL`. However, some webservers may | ||||||
|  | be more selective about which headers they'll pass, in which case they | ||||||
|  | need to be configured explicitly (see the mention of `Git-Protocol` in | ||||||
|  | the Apache config from the earlier EXAMPLES section). | ||||||
|  |  | ||||||
| The backend process sets GIT_COMMITTER_NAME to '$REMOTE_USER' and | The backend process sets GIT_COMMITTER_NAME to '$REMOTE_USER' and | ||||||
| GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}', | GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}', | ||||||
| ensuring that any reflogs created by 'git-receive-pack' contain some | ensuring that any reflogs created by 'git-receive-pack' contain some | ||||||
|  |  | ||||||
|  | @ -48,6 +48,14 @@ OPTIONS | ||||||
| <directory>:: | <directory>:: | ||||||
| 	The repository to sync from. | 	The repository to sync from. | ||||||
|  |  | ||||||
|  | ENVIRONMENT | ||||||
|  | ----------- | ||||||
|  |  | ||||||
|  | `GIT_PROTOCOL`:: | ||||||
|  | 	Internal variable used for handshaking the wire protocol. Server | ||||||
|  | 	admins may need to configure some transports to allow this | ||||||
|  | 	variable to be passed. See the discussion in linkgit:git[1]. | ||||||
|  |  | ||||||
| SEE ALSO | SEE ALSO | ||||||
| -------- | -------- | ||||||
| linkgit:gitnamespaces[7] | linkgit:gitnamespaces[7] | ||||||
|  |  | ||||||
|  | @ -894,6 +894,21 @@ for full details. | ||||||
| 	Contains a colon ':' separated list of keys with optional values | 	Contains a colon ':' separated list of keys with optional values | ||||||
| 	'key[=value]'.  Presence of unknown keys and values must be | 	'key[=value]'.  Presence of unknown keys and values must be | ||||||
| 	ignored. | 	ignored. | ||||||
|  | + | ||||||
|  | Note that servers may need to be configured to allow this variable to | ||||||
|  | pass over some transports. It will be propagated automatically when | ||||||
|  | accessing local repositories (i.e., `file://` or a filesystem path), as | ||||||
|  | well as over the `git://` protocol. For git-over-http, it should work | ||||||
|  | automatically in most configurations, but see the discussion in | ||||||
|  | linkgit:git-http-backend[1]. For git-over-ssh, the ssh server may need | ||||||
|  | to be configured to allow clients to pass this variable (e.g., by using | ||||||
|  | `AcceptEnv GIT_PROTOCOL` with OpenSSH). | ||||||
|  | + | ||||||
|  | This configuration is optional. If the variable is not propagated, then | ||||||
|  | clients will fall back to the original "v0" protocol (but may miss out | ||||||
|  | on some performance improvements or features). This variable currently | ||||||
|  | only affects clones and fetches; it is not yet used for pushes (but may | ||||||
|  | be in the future). | ||||||
|  |  | ||||||
| `GIT_OPTIONAL_LOCKS`:: | `GIT_OPTIONAL_LOCKS`:: | ||||||
| 	If set to `0`, Git will complete any requested operation without | 	If set to `0`, Git will complete any requested operation without | ||||||
|  |  | ||||||
|  | @ -42,7 +42,8 @@ Initial Client Request | ||||||
| In general a client can request to speak protocol v2 by sending | In general a client can request to speak protocol v2 by sending | ||||||
| `version=2` through the respective side-channel for the transport being | `version=2` through the respective side-channel for the transport being | ||||||
| used which inevitably sets `GIT_PROTOCOL`.  More information can be | used which inevitably sets `GIT_PROTOCOL`.  More information can be | ||||||
| found in `pack-protocol.txt` and `http-protocol.txt`.  In all cases the | found in `pack-protocol.txt` and `http-protocol.txt`, as well as the | ||||||
|  | `GIT_PROTOCOL` definition in `git.txt`. In all cases the | ||||||
| response from the server is the capability advertisement. | response from the server is the capability advertisement. | ||||||
|  |  | ||||||
| Git Transport | Git Transport | ||||||
|  | @ -58,6 +59,8 @@ SSH and File Transport | ||||||
|  |  | ||||||
| When using either the ssh:// or file:// transport, the GIT_PROTOCOL | When using either the ssh:// or file:// transport, the GIT_PROTOCOL | ||||||
| environment variable must be set explicitly to include "version=2". | environment variable must be set explicitly to include "version=2". | ||||||
|  | The server may need to be configured to allow this environment variable | ||||||
|  | to pass. | ||||||
|  |  | ||||||
| HTTP Transport | HTTP Transport | ||||||
| ~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~ | ||||||
|  | @ -84,6 +87,9 @@ Subsequent requests are then made directly to the service | ||||||
| Uses the `--http-backend-info-refs` option to | Uses the `--http-backend-info-refs` option to | ||||||
| linkgit:git-upload-pack[1]. | linkgit:git-upload-pack[1]. | ||||||
|  |  | ||||||
|  | The server may need to be configured to pass this header's contents via | ||||||
|  | the `GIT_PROTOCOL` variable. See the discussion in `git-http-backend.txt`. | ||||||
|  |  | ||||||
| Capability Advertisement | Capability Advertisement | ||||||
| ------------------------ | ------------------------ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -739,6 +739,7 @@ static int bad_request(struct strbuf *hdr, const struct service_cmd *c) | ||||||
| int cmd_main(int argc, const char **argv) | int cmd_main(int argc, const char **argv) | ||||||
| { | { | ||||||
| 	char *method = getenv("REQUEST_METHOD"); | 	char *method = getenv("REQUEST_METHOD"); | ||||||
|  | 	const char *proto_header; | ||||||
| 	char *dir; | 	char *dir; | ||||||
| 	struct service_cmd *cmd = NULL; | 	struct service_cmd *cmd = NULL; | ||||||
| 	char *cmd_arg = NULL; | 	char *cmd_arg = NULL; | ||||||
|  | @ -789,6 +790,9 @@ int cmd_main(int argc, const char **argv) | ||||||
| 	http_config(); | 	http_config(); | ||||||
| 	max_request_buffer = git_env_ulong("GIT_HTTP_MAX_REQUEST_BUFFER", | 	max_request_buffer = git_env_ulong("GIT_HTTP_MAX_REQUEST_BUFFER", | ||||||
| 					   max_request_buffer); | 					   max_request_buffer); | ||||||
|  | 	proto_header = getenv("HTTP_GIT_PROTOCOL"); | ||||||
|  | 	if (proto_header) | ||||||
|  | 		setenv(GIT_PROTOCOL_ENVIRONMENT, proto_header, 0); | ||||||
|  |  | ||||||
| 	cmd->imp(&hdr, cmd_arg); | 	cmd->imp(&hdr, cmd_arg); | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
|  | @ -81,8 +81,6 @@ PassEnv GIT_TRACE | ||||||
| PassEnv GIT_CONFIG_NOSYSTEM | PassEnv GIT_CONFIG_NOSYSTEM | ||||||
| PassEnv GIT_TEST_SIDEBAND_ALL | PassEnv GIT_TEST_SIDEBAND_ALL | ||||||
|  |  | ||||||
| SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0 |  | ||||||
|  |  | ||||||
| Alias /dumb/ www/ | Alias /dumb/ www/ | ||||||
| Alias /auth/dumb/ www/auth/dumb/ | Alias /auth/dumb/ www/auth/dumb/ | ||||||
|  |  | ||||||
|  | @ -117,6 +115,11 @@ Alias /auth/dumb/ www/auth/dumb/ | ||||||
| 	SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} | 	SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} | ||||||
| 	SetEnv GIT_HTTP_EXPORT_ALL | 	SetEnv GIT_HTTP_EXPORT_ALL | ||||||
| </LocationMatch> | </LocationMatch> | ||||||
|  | <LocationMatch /smart_v0/> | ||||||
|  | 	SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} | ||||||
|  | 	SetEnv GIT_HTTP_EXPORT_ALL | ||||||
|  | 	SetEnv GIT_PROTOCOL | ||||||
|  | </LocationMatch> | ||||||
| ScriptAlias /smart/incomplete_length/git-upload-pack incomplete-length-upload-pack-v2-http.sh/ | ScriptAlias /smart/incomplete_length/git-upload-pack incomplete-length-upload-pack-v2-http.sh/ | ||||||
| ScriptAlias /smart/incomplete_body/git-upload-pack incomplete-body-upload-pack-v2-http.sh/ | ScriptAlias /smart/incomplete_body/git-upload-pack incomplete-body-upload-pack-v2-http.sh/ | ||||||
| ScriptAliasMatch /error_git_upload_pack/(.*)/git-upload-pack error.sh/ | ScriptAliasMatch /error_git_upload_pack/(.*)/git-upload-pack error.sh/ | ||||||
|  |  | ||||||
|  | @ -558,4 +558,13 @@ test_expect_success 'http auth forgets bogus credentials' ' | ||||||
| 	expect_askpass both user@host | 	expect_askpass both user@host | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'client falls back from v2 to v0 to match server' ' | ||||||
|  | 	GIT_TRACE_PACKET=$PWD/trace \ | ||||||
|  | 	GIT_TEST_PROTOCOL_VERSION=2 \ | ||||||
|  | 	git clone $HTTPD_URL/smart_v0/repo.git repo-v0 && | ||||||
|  | 	# check for v0; there the HEAD symref is communicated in the capability | ||||||
|  | 	# line; v2 uses a different syntax on each ref advertisement line | ||||||
|  | 	grep symref=HEAD:refs/heads/ trace | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano