Documentation: add documentation for 'git interpret-trailers'

While at it add git-interpret-trailers to "command-list.txt". Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Christian Couder committed Oct 13, 2014 at 20:16 UTC dfd66ddf5aa9aacc06ed38a9ee2cc15a4f2d4896
2 files changed +315
Documentation/git-interpret-trailers.txt new
+314
@@ -0,0 +1,314 @@
1 +git-interpret-trailers(1)
2 +=========================
3 +
4 +NAME
5 +----
6 +git-interpret-trailers - help add stuctured information into commit messages
7 +
8 +SYNOPSIS
9 +--------
10 +[verse]
11 +'git interpret-trailers' [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...]
12 +
13 +DESCRIPTION
14 +-----------
15 +Help adding 'trailers' lines, that look similar to RFC 822 e-mail
16 +headers, at the end of the otherwise free-form part of a commit
17 +message.
18 +
19 +This command reads some patches or commit messages from either the
20 +<file> arguments or the standard input if no <file> is specified. Then
21 +this command applies the arguments passed using the `--trailer`
22 +option, if any, to the commit message part of each input file. The
23 +result is emitted on the standard output.
24 +
25 +Some configuration variables control the way the `--trailer` arguments
26 +are applied to each commit message and the way any existing trailer in
27 +the commit message is changed. They also make it possible to
28 +automatically add some trailers.
29 +
30 +By default, a '<token>=<value>' or '<token>:<value>' argument given
31 +using `--trailer` will be appended after the existing trailers only if
32 +the last trailer has a different (<token>, <value>) pair (or if there
33 +is no existing trailer). The <token> and <value> parts will be trimmed
34 +to remove starting and trailing whitespace, and the resulting trimmed
35 +<token> and <value> will appear in the message like this:
36 +
37 +------------------------------------------------
38 +token: value
39 +------------------------------------------------
40 +
41 +This means that the trimmed <token> and <value> will be separated by
42 +`': '` (one colon followed by one space).
43 +
44 +By default the new trailer will appear at the end of all the existing
45 +trailers. If there is no existing trailer, the new trailer will appear
46 +after the commit message part of the ouput, and, if there is no line
47 +with only spaces at the end of the commit message part, one blank line
48 +will be added before the new trailer.
49 +
50 +Existing trailers are extracted from the input message by looking for
51 +a group of one or more lines that contain a colon (by default), where
52 +the group is preceded by one or more empty (or whitespace-only) lines.
53 +The group must either be at the end of the message or be the last
54 +non-whitespace lines before a line that starts with '---'. Such three
55 +minus signs start the patch part of the message.
56 +
57 +When reading trailers, there can be whitespaces before and after the
58 +token, the separator and the value. There can also be whitespaces
59 +indide the token and the value.
60 +
61 +Note that 'trailers' do not follow and are not intended to follow many
62 +rules for RFC 822 headers. For example they do not follow the line
63 +folding rules, the encoding rules and probably many other rules.
64 +
65 +OPTIONS
66 +-------
67 +--trim-empty::
68 + If the <value> part of any trailer contains only whitespace,
69 + the whole trailer will be removed from the resulting message.
70 + This apply to existing trailers as well as new trailers.
71 +
72 +--trailer <token>[(=|:)<value>]::
73 + Specify a (<token>, <value>) pair that should be applied as a
74 + trailer to the input messages. See the description of this
75 + command.
76 +
77 +CONFIGURATION VARIABLES
78 +-----------------------
79 +
80 +trailer.separators::
81 + This option tells which characters are recognized as trailer
82 + separators. By default only ':' is recognized as a trailer
83 + separator, except that '=' is always accepted on the command
84 + line for compatibility with other git commands.
85 ++
86 +The first character given by this option will be the default character
87 +used when another separator is not specified in the config for this
88 +trailer.
89 ++
90 +For example, if the value for this option is "%=$", then only lines
91 +using the format '<token><sep><value>' with <sep> containing '%', '='
92 +or '$' and then spaces will be considered trailers. And '%' will be
93 +the default separator used, so by default trailers will appear like:
94 +'<token>% <value>' (one percent sign and one space will appear between
95 +the token and the value).
96 +
97 +trailer.where::
98 + This option tells where a new trailer will be added.
99 ++
100 +This can be `end`, which is the default, `start`, `after` or `before`.
101 ++
102 +If it is `end`, then each new trailer will appear at the end of the
103 +existing trailers.
104 ++
105 +If it is `start`, then each new trailer will appear at the start,
106 +instead of the end, of the existing trailers.
107 ++
108 +If it is `after`, then each new trailer will appear just after the
109 +last trailer with the same <token>.
110 ++
111 +If it is `before`, then each new trailer will appear just before the
112 +first trailer with the same <token>.
113 +
114 +trailer.ifexists::
115 + This option makes it possible to choose what action will be
116 + performed when there is already at least one trailer with the
117 + same <token> in the message.
118 ++
119 +The valid values for this option are: `addIfDifferentNeighbor` (this
120 +is the default), `addIfDifferent`, `add`, `overwrite` or `doNothing`.
121 ++
122 +With `addIfDifferentNeighbor`, a new trailer will be added only if no
123 +trailer with the same (<token>, <value>) pair is above or below the line
124 +where the new trailer will be added.
125 ++
126 +With `addIfDifferent`, a new trailer will be added only if no trailer
127 +with the same (<token>, <value>) pair is already in the message.
128 ++
129 +With `add`, a new trailer will be added, even if some trailers with
130 +the same (<token>, <value>) pair are already in the message.
131 ++
132 +With `replace`, an existing trailer with the same <token> will be
133 +deleted and the new trailer will be added. The deleted trailer will be
134 +the closest one (with the same <token>) to the place where the new one
135 +will be added.
136 ++
137 +With `doNothing`, nothing will be done; that is no new trailer will be
138 +added if there is already one with the same <token> in the message.
139 +
140 +trailer.ifmissing::
141 + This option makes it possible to choose what action will be
142 + performed when there is not yet any trailer with the same
143 + <token> in the message.
144 ++
145 +The valid values for this option are: `add` (this is the default) and
146 +`doNothing`.
147 ++
148 +With `add`, a new trailer will be added.
149 ++
150 +With `doNothing`, nothing will be done.
151 +
152 +trailer.<token>.key::
153 + This `key` will be used instead of <token> in the trailer. At
154 + the end of this key, a separator can appear and then some
155 + space characters. By default the only valid separator is ':',
156 + but this can be changed using the `trailer.separators` config
157 + variable.
158 ++
159 +If there is a separator, then the key will be used instead of both the
160 +<token> and the default separator when adding the trailer.
161 +
162 +trailer.<token>.where::
163 + This option takes the same values as the 'trailer.where'
164 + configuration variable and it overrides what is specified by
165 + that option for trailers with the specified <token>.
166 +
167 +trailer.<token>.ifexist::
168 + This option takes the same values as the 'trailer.ifexist'
169 + configuration variable and it overrides what is specified by
170 + that option for trailers with the specified <token>.
171 +
172 +trailer.<token>.ifmissing::
173 + This option takes the same values as the 'trailer.ifmissing'
174 + configuration variable and it overrides what is specified by
175 + that option for trailers with the specified <token>.
176 +
177 +trailer.<token>.command::
178 + This option can be used to specify a shell command that will
179 + be called to automatically add or modify a trailer with the
180 + specified <token>.
181 ++
182 +When this option is specified, the behavior is as if a special
183 +'<token>=<value>' argument were added at the beginning of the command
184 +line, where <value> is taken to be the standard output of the
185 +specified command with any leading and trailing whitespace trimmed
186 +off.
187 ++
188 +If the command contains the `$ARG` string, this string will be
189 +replaced with the <value> part of an existing trailer with the same
190 +<token>, if any, before the command is launched.
191 ++
192 +If some '<token>=<value>' arguments are also passed on the command
193 +line, when a 'trailer.<token>.command' is configured, the command will
194 +also be executed for each of these arguments. And the <value> part of
195 +these arguments, if any, will be used to replace the `$ARG` string in
196 +the command.
197 +
198 +EXAMPLES
199 +--------
200 +
201 +* Configure a 'sign' trailer with a 'Signed-off-by' key, and then
202 + add two of these trailers to a message:
203 ++
204 +------------
205 +$ git config trailer.sign.key "Signed-off-by"
206 +$ cat msg.txt
207 +subject
208 +
209 +message
210 +$ cat msg.txt | git interpret-trailers --trailer 'sign: Alice <alice@example.com>' --trailer 'sign: Bob <bob@example.com>'
211 +subject
212 +
213 +message
214 +
215 +Signed-off-by: Alice <alice@example.com>
216 +Signed-off-by: Bob <bob@example.com>
217 +------------
218 +
219 +* Extract the last commit as a patch, and add a 'Cc' and a
220 + 'Reviewed-by' trailer to it:
221 ++
222 +------------
223 +$ git format-patch -1
224 +0001-foo.patch
225 +$ git interpret-trailers --trailer 'Cc: Alice <alice@example.com>' --trailer 'Reviewed-by: Bob <bob@example.com>' 0001-foo.patch >0001-bar.patch
226 +------------
227 +
228 +* Configure a 'sign' trailer with a command to automatically add a
229 + 'Signed-off-by: ' with the author information only if there is no
230 + 'Signed-off-by: ' already, and show how it works:
231 ++
232 +------------
233 +$ git config trailer.sign.key "Signed-off-by: "
234 +$ git config trailer.sign.ifmissing add
235 +$ git config trailer.sign.ifexists doNothing
236 +$ git config trailer.sign.command 'echo "$(git config user.name) <$(git config user.email)>"'
237 +$ git interpret-trailers <<EOF
238 +> EOF
239 +
240 +Signed-off-by: Bob <bob@example.com>
241 +$ git interpret-trailers <<EOF
242 +> Signed-off-by: Alice <alice@example.com>
243 +> EOF
244 +
245 +Signed-off-by: Alice <alice@example.com>
246 +------------
247 +
248 +* Configure a 'fix' trailer with a key that contains a '#' and no
249 + space after this character, and show how it works:
250 ++
251 +------------
252 +$ git config trailer.separators ":#"
253 +$ git config trailer.fix.key "Fix #"
254 +$ echo "subject" | git interpret-trailers --trailer fix=42
255 +subject
256 +
257 +Fix #42
258 +------------
259 +
260 +* Configure a 'see' trailer with a command to show the subject of a
261 + commit that is related, and show how it works:
262 ++
263 +------------
264 +$ git config trailer.see.key "See-also: "
265 +$ git config trailer.see.ifExists "replace"
266 +$ git config trailer.see.ifMissing "doNothing"
267 +$ git config trailer.see.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG"
268 +$ git interpret-trailers <<EOF
269 +> subject
270 +>
271 +> message
272 +>
273 +> see: HEAD~2
274 +> EOF
275 +subject
276 +
277 +message
278 +
279 +See-also: fe3187489d69c4 (subject of related commit)
280 +------------
281 +
282 +* Configure a commit template with some trailers with empty values
283 + (using sed to show and keep the trailing spaces at the end of the
284 + trailers), then configure a commit-msg hook that uses
285 + 'git interpret-trailers' to remove trailers with empty values and
286 + to add a 'git-version' trailer:
287 ++
288 +------------
289 +$ sed -e 's/ Z$/ /' >commit_template.txt <<EOF
290 +> ***subject***
291 +>
292 +> ***message***
293 +>
294 +> Fixes: Z
295 +> Cc: Z
296 +> Reviewed-by: Z
297 +> Signed-off-by: Z
298 +> EOF
299 +$ git config commit.template commit_template.txt
300 +$ cat >.git/hooks/commit-msg <<EOF
301 +> #!/bin/sh
302 +> git interpret-trailers --trim-empty --trailer "git-version: \$(git describe)" "\$1" > "\$1.new"
303 +> mv "\$1.new" "\$1"
304 +> EOF
305 +$ chmod +x .git/hooks/commit-msg
306 +------------
307 +
308 +SEE ALSO
309 +--------
310 +linkgit:git-commit[1], linkgit:git-format-patch[1], linkgit:git-config[1]
311 +
312 +GIT
313 +---
314 +Part of the linkgit:git[1] suite
command-list.txt
+1
@@ -62,6 +62,7 @@ git-imap-send foreignscminterface
62 git-index-pack plumbingmanipulators
63 git-init mainporcelain common
64 git-instaweb ancillaryinterrogators
65 +git-interpret-trailers purehelpers
66 gitk mainporcelain
67 git-log mainporcelain common
68 git-ls-files plumbinginterrogators