106 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
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 api-builtin.txt.
 | 
						|
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 api-builtin.txt.
 | 
						|
 | 
						|
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 api-builtin.txt 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.
 |