|  | From: Eric S. Raymond <esr@thyrsus.com> | 
|  | Abstract: This is how-to documentation for people who want to add extension | 
|  | commands to Git.  It should be read alongside builtin.h. | 
|  | Content-type: text/asciidoc | 
|  |  | 
|  | How to integrate new subcommands | 
|  | ================================ | 
|  |  | 
|  | This is how-to documentation for people who want to add extension | 
|  | commands to Git.  It should be read alongside builtin.h. | 
|  |  | 
|  | Runtime environment | 
|  | ------------------- | 
|  |  | 
|  | Git subcommands are standalone executables that live in the Git exec | 
|  | path, normally /usr/lib/git-core.  The git executable itself is a | 
|  | thin wrapper that knows where the subcommands live, and runs them by | 
|  | passing command-line arguments to them. | 
|  |  | 
|  | (If "git foo" is not found in the Git exec path, the wrapper | 
|  | will look in the rest of your $PATH for it.  Thus, it's possible | 
|  | to write local Git extensions that don't live in system space.) | 
|  |  | 
|  | Implementation languages | 
|  | ------------------------ | 
|  |  | 
|  | Most subcommands are written in C or shell.  A few are written in | 
|  | Perl. | 
|  |  | 
|  | While we strongly encourage coding in portable C for portability, | 
|  | these specific scripting languages are also acceptable.  We won't | 
|  | accept more without a very strong technical case, as we don't want | 
|  | to broaden the Git suite's required dependencies.  Import utilities, | 
|  | surgical tools, remote helpers and other code at the edges of the | 
|  | Git suite are more lenient and we allow Python (and even Tcl/tk), | 
|  | but they should not be used for core functions. | 
|  |  | 
|  | This may change in the future.  Especially Python is not allowed in | 
|  | core because we need better Python integration in the Git Windows | 
|  | installer before we can be confident people in that environment | 
|  | won't experience an unacceptably large loss of capability. | 
|  |  | 
|  | C commands are normally written as single modules, named after the | 
|  | command, that link a collection of functions called libgit.  Thus, | 
|  | your command 'git-foo' would normally be implemented as a single | 
|  | "git-foo.c" (or "builtin/foo.c" if it is to be linked to the main | 
|  | binary); this organization makes it easy for people reading the code | 
|  | to find things. | 
|  |  | 
|  | See the CodingGuidelines document for other guidance on what we consider | 
|  | good practice in C and shell, and builtin.h for the support | 
|  | functions available to built-in commands written in C. | 
|  |  | 
|  | What every extension command needs | 
|  | ---------------------------------- | 
|  |  | 
|  | You must have a man page, written in asciidoc (this is what Git help | 
|  | followed by your subcommand name will display).  Be aware that there is | 
|  | a local asciidoc configuration and macros which you should use.  It's | 
|  | often helpful to start by cloning an existing page and replacing the | 
|  | text content. | 
|  |  | 
|  | You must have a test, written to report in TAP (Test Anything Protocol). | 
|  | Tests are executables (usually shell scripts) that live in the 't' | 
|  | subdirectory of the tree.  Each test name begins with 't' and a sequence | 
|  | number that controls where in the test sequence it will be executed; | 
|  | conventionally the rest of the name stem is that of the command | 
|  | being tested. | 
|  |  | 
|  | Read the file t/README to learn more about the conventions to be used | 
|  | in writing tests, and the test support library. | 
|  |  | 
|  | Integrating a command | 
|  | --------------------- | 
|  |  | 
|  | Here are the things you need to do when you want to merge a new | 
|  | subcommand into the Git tree. | 
|  |  | 
|  | 1. Don't forget to sign off your patch! | 
|  |  | 
|  | 2. Append your command name to one of the variables BUILTIN_OBJS, | 
|  | EXTRA_PROGRAMS, SCRIPT_SH, SCRIPT_PERL or SCRIPT_PYTHON. | 
|  |  | 
|  | 3. Drop its test in the t directory. | 
|  |  | 
|  | 4. If your command is implemented in an interpreted language with a | 
|  | p-code intermediate form, make sure .gitignore in the main directory | 
|  | includes a pattern entry that ignores such files.  Python .pyc and | 
|  | .pyo files will already be covered. | 
|  |  | 
|  | 5. If your command has any dependency on a particular version of | 
|  | your language, document it in the INSTALL file. | 
|  |  | 
|  | 6. There is a file command-list.txt in the distribution main directory | 
|  | that categorizes commands by type, so they can be listed in appropriate | 
|  | subsections in the documentation's summary command list.  Add an entry | 
|  | for yours.  To understand the categories, look at command-list.txt | 
|  | in the main directory.  If the new command is part of the typical Git | 
|  | workflow and you believe it common enough to be mentioned in 'git help', | 
|  | map this command to a common group in the column [common]. | 
|  |  | 
|  | 7. Give the maintainer one paragraph to include in the RelNotes file | 
|  | to describe the new feature; a good place to do so is in the cover | 
|  | letter [PATCH 0/n]. | 
|  |  | 
|  | That's all there is to it. |