Documentation/remote-helpers: explain capabilities first
The current remote helper documentation is from the perspective of git, so to speak: it presents a full menu of commands for a person invoking a remote helper to choose from. In practice, that's less useful than it could be, since the daunted novice remote-helper author probably just wanted a list of commands needs to implement to get started. So preface the command list with an overview of each capability, its purpose, and what commands it requires. As a side effect, this makes it a little clearer that git doesn't choose arbitrary commands to run, even if the remote helper advertises all capabilities --- instead, there are well defined command sequences for various tasks. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									826603d118
								
							
						
					
					
						commit
						b4fc8d6ac6
					
				|  | @ -24,22 +24,141 @@ output. Because a remote helper runs as an independent process from | ||||||
| git, there is no need to re-link git to add a new helper, nor any | git, there is no need to re-link git to add a new helper, nor any | ||||||
| need to link the helper with the implementation of git. | need to link the helper with the implementation of git. | ||||||
|  |  | ||||||
| Every helper must support the "capabilities" command, which git will | Every helper must support the "capabilities" command, which git | ||||||
| use to determine what other commands the helper will accept.  Other | uses to determine what other commands the helper will accept.  Those | ||||||
| commands generally concern facilities like discovering and updating | other commands can be used to discover and update remote refs, | ||||||
| remote refs, transporting objects between the object database and | transport objects between the object database and the remote repository, | ||||||
| the remote repository, and updating the local object store. | and update the local object store. | ||||||
|  |  | ||||||
| Helpers supporting the 'fetch' capability can discover refs from the |  | ||||||
| remote repository and transfer objects reachable from those refs to |  | ||||||
| the local object store. Helpers supporting the 'push' capability can |  | ||||||
| transfer local objects to the remote repository and update remote refs. |  | ||||||
|  |  | ||||||
| Git comes with a "curl" family of remote helpers, that handle various | Git comes with a "curl" family of remote helpers, that handle various | ||||||
| transport protocols, such as 'git-remote-http', 'git-remote-https', | transport protocols, such as 'git-remote-http', 'git-remote-https', | ||||||
| 'git-remote-ftp' and 'git-remote-ftps'. They implement the capabilities | 'git-remote-ftp' and 'git-remote-ftps'. They implement the capabilities | ||||||
| 'fetch', 'option', and 'push'. | 'fetch', 'option', and 'push'. | ||||||
|  |  | ||||||
|  | INPUT FORMAT | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | Git sends the remote helper a list of commands on standard input, one | ||||||
|  | per line.  The first command is always the 'capabilities' command, in | ||||||
|  | response to which the remote helper must print a list of the | ||||||
|  | capabilities it supports (see below) followed by a blank line.  The | ||||||
|  | response to the capabilities command determines what commands Git uses | ||||||
|  | in the remainder of the command stream. | ||||||
|  |  | ||||||
|  | The command stream is terminated by a blank line.  In some cases | ||||||
|  | (indicated in the documentation of the relevant commands), this blank | ||||||
|  | line is followed by a payload in some other protocol (e.g., the pack | ||||||
|  | protocol), while in others it indicates the end of input. | ||||||
|  |  | ||||||
|  | Capabilities | ||||||
|  | ~~~~~~~~~~~~ | ||||||
|  |  | ||||||
|  | Each remote helper is expected to support only a subset of commands. | ||||||
|  | The operations a helper supports are declared to git in the response | ||||||
|  | to the `capabilities` command (see COMMANDS, below). | ||||||
|  |  | ||||||
|  | 'option':: | ||||||
|  | 	For specifying settings like `verbosity` (how much output to | ||||||
|  | 	write to stderr) and `depth` (how much history is wanted in the | ||||||
|  | 	case of a shallow clone) that affect how other commands are | ||||||
|  | 	carried out. | ||||||
|  |  | ||||||
|  | 'connect':: | ||||||
|  | 	For fetching and pushing using git's native packfile protocol | ||||||
|  | 	that requires a bidirectional, full-duplex connection. | ||||||
|  |  | ||||||
|  | 'push':: | ||||||
|  | 	For listing remote refs and pushing specified objects from the | ||||||
|  | 	local object store to remote refs. | ||||||
|  |  | ||||||
|  | 'fetch':: | ||||||
|  | 	For listing remote refs and fetching the associated history to | ||||||
|  | 	the local object store. | ||||||
|  |  | ||||||
|  | 'import':: | ||||||
|  | 	For listing remote refs and fetching the associated history as | ||||||
|  | 	a fast-import stream. | ||||||
|  |  | ||||||
|  | 'refspec' <refspec>:: | ||||||
|  | 	This modifies the 'import' capability, allowing the produced | ||||||
|  | 	fast-import stream to modify refs in a private namespace | ||||||
|  | 	instead of writing to refs/heads or refs/remotes directly. | ||||||
|  | 	It is recommended that all importers providing the 'import' | ||||||
|  | 	capability use this. | ||||||
|  | + | ||||||
|  | A helper advertising the capability | ||||||
|  | `refspec refs/heads/{asterisk}:refs/svn/origin/branches/{asterisk}` | ||||||
|  | is saying that, when it is asked to `import refs/heads/topic`, the | ||||||
|  | stream it outputs will update the `refs/svn/origin/branches/topic` | ||||||
|  | ref. | ||||||
|  | + | ||||||
|  | This capability can be advertised multiple times.  The first | ||||||
|  | applicable refspec takes precedence.  The left-hand of refspecs | ||||||
|  | advertised with this capability must cover all refs reported by | ||||||
|  | the list command.  If no 'refspec' capability is advertised, | ||||||
|  | there is an implied `refspec {asterisk}:{asterisk}`. | ||||||
|  |  | ||||||
|  | Capabilities for Pushing | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  | 'connect':: | ||||||
|  | 	Can attempt to connect to 'git receive-pack' (for pushing), | ||||||
|  | 	'git upload-pack', etc for communication using the | ||||||
|  | 	packfile protocol. | ||||||
|  | + | ||||||
|  | Supported commands: 'connect'. | ||||||
|  |  | ||||||
|  | 'push':: | ||||||
|  | 	Can discover remote refs and push local commits and the | ||||||
|  | 	history leading up to them to new or existing remote refs. | ||||||
|  | + | ||||||
|  | Supported commands: 'list for-push', 'push'. | ||||||
|  |  | ||||||
|  | If a helper advertises both 'connect' and 'push', git will use | ||||||
|  | 'connect' if possible and fall back to 'push' if the helper requests | ||||||
|  | so when connecting (see the 'connect' command under COMMANDS). | ||||||
|  |  | ||||||
|  | Capabilities for Fetching | ||||||
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
|  | 'connect':: | ||||||
|  | 	Can try to connect to 'git upload-pack' (for fetching), | ||||||
|  | 	'git receive-pack', etc for communication using the | ||||||
|  | 	packfile protocol. | ||||||
|  | + | ||||||
|  | Supported commands: 'connect'. | ||||||
|  |  | ||||||
|  | 'fetch':: | ||||||
|  | 	Can discover remote refs and transfer objects reachable from | ||||||
|  | 	them to the local object store. | ||||||
|  | + | ||||||
|  | Supported commands: 'list', 'fetch'. | ||||||
|  |  | ||||||
|  | 'import':: | ||||||
|  | 	Can discover remote refs and output objects reachable from | ||||||
|  | 	them as a stream in fast-import format. | ||||||
|  | + | ||||||
|  | Supported commands: 'list', 'import'. | ||||||
|  |  | ||||||
|  | If a helper advertises 'connect', git will use it if possible and | ||||||
|  | fall back to another capability if the helper requests so when | ||||||
|  | connecting (see the 'connect' command under COMMANDS). | ||||||
|  | When choosing between 'fetch' and 'import', git prefers 'fetch'. | ||||||
|  | Other frontends may have some other order of preference. | ||||||
|  |  | ||||||
|  | 'refspec' <refspec>:: | ||||||
|  | 	This modifies the 'import' capability. | ||||||
|  | + | ||||||
|  | A helper advertising | ||||||
|  | `refspec refs/heads/{asterisk}:refs/svn/origin/branches/{asterisk}` | ||||||
|  | in its capabilities is saying that, when it handles | ||||||
|  | `import refs/heads/topic`, the stream it outputs will update the | ||||||
|  | `refs/svn/origin/branches/topic` ref. | ||||||
|  | + | ||||||
|  | This capability can be advertised multiple times.  The first | ||||||
|  | applicable refspec takes precedence.  The left-hand of refspecs | ||||||
|  | advertised with this capability must cover all refs reported by | ||||||
|  | the list command.  If no 'refspec' capability is advertised, | ||||||
|  | there is an implied `refspec {asterisk}:{asterisk}`. | ||||||
|  |  | ||||||
| INVOCATION | INVOCATION | ||||||
| ---------- | ---------- | ||||||
|  |  | ||||||
|  | @ -171,26 +290,6 @@ completing a valid response for the current command. | ||||||
| Additional commands may be supported, as may be determined from | Additional commands may be supported, as may be determined from | ||||||
| capabilities reported by the helper. | capabilities reported by the helper. | ||||||
|  |  | ||||||
| CAPABILITIES |  | ||||||
| ------------ |  | ||||||
|  |  | ||||||
| 'fetch':: |  | ||||||
| 'option':: |  | ||||||
| 'push':: |  | ||||||
| 'import':: |  | ||||||
| 'connect':: |  | ||||||
| 	This helper supports the corresponding command with the same name. |  | ||||||
|  |  | ||||||
| 'refspec' 'spec':: |  | ||||||
| 	When using the import command, expect the source ref to have |  | ||||||
| 	been written to the destination ref. The earliest applicable |  | ||||||
| 	refspec takes precedence. For example |  | ||||||
| 	"refs/heads/{asterisk}:refs/svn/origin/branches/{asterisk}" means |  | ||||||
| 	that, after an "import refs/heads/name", the script has written to |  | ||||||
| 	refs/svn/origin/branches/name. If this capability is used at |  | ||||||
| 	all, it must cover all refs reported by the list command; if |  | ||||||
| 	it is not used, it is effectively "{asterisk}:{asterisk}" |  | ||||||
|  |  | ||||||
| REF LIST ATTRIBUTES | REF LIST ATTRIBUTES | ||||||
| ------------------- | ------------------- | ||||||
|  |  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jonathan Nieder
						Jonathan Nieder