From: Junio C Hamano Date: Thu, 7 Mar 2019 00:59:52 +0000 (+0900) Subject: Merge branch 'aw/pretty-trailers' X-Git-Tag: v2.22.0-rc0~179 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/42977bf5c7306e4c2dded5353f39cf087cf23a1f Merge branch 'aw/pretty-trailers' The %(trailers) formatter in "git log --format=..." now allows to optionally pick trailers selectively by keyword, show only values, etc. * aw/pretty-trailers: pretty: add support for separator option in %(trailers) strbuf: separate callback for strbuf_expand:ing literals pretty: add support for "valueonly" option in %(trailers) pretty: allow showing specific trailers pretty: single return path in %(trailers) handling pretty: allow %(trailers) options with explicit value doc: group pretty-format.txt placeholders descriptions --- 42977bf5c7306e4c2dded5353f39cf087cf23a1f diff --cc Documentation/pretty-formats.txt index 7bfffae765,4cfea4c9d6..079598307a --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@@ -102,120 -102,158 +102,160 @@@ The title was >>t4119: test autocomputi + The placeholders are: - - '%H': commit hash - - '%h': abbreviated commit hash - - '%T': tree hash - - '%t': abbreviated tree hash - - '%P': parent hashes - - '%p': abbreviated parent hashes - - '%an': author name - - '%aN': author name (respecting .mailmap, see linkgit:git-shortlog[1] - or linkgit:git-blame[1]) - - '%ae': author email - - '%aE': author email (respecting .mailmap, see - linkgit:git-shortlog[1] or linkgit:git-blame[1]) - - '%ad': author date (format respects --date= option) - - '%aD': author date, RFC2822 style - - '%ar': author date, relative - - '%at': author date, UNIX timestamp - - '%ai': author date, ISO 8601-like format - - '%aI': author date, strict ISO 8601 format - - '%cn': committer name - - '%cN': committer name (respecting .mailmap, see - linkgit:git-shortlog[1] or linkgit:git-blame[1]) - - '%ce': committer email - - '%cE': committer email (respecting .mailmap, see - linkgit:git-shortlog[1] or linkgit:git-blame[1]) - - '%cd': committer date (format respects --date= option) - - '%cD': committer date, RFC2822 style - - '%cr': committer date, relative - - '%ct': committer date, UNIX timestamp - - '%ci': committer date, ISO 8601-like format - - '%cI': committer date, strict ISO 8601 format - - '%d': ref names, like the --decorate option of linkgit:git-log[1] - - '%D': ref names without the " (", ")" wrapping. - - '%S': ref name given on the command line by which the commit was reached - (like `git log --source`), only works with `git log` - - '%e': encoding - - '%s': subject - - '%f': sanitized subject line, suitable for a filename - - '%b': body - - '%B': raw body (unwrapped subject and body) + - Placeholders that expand to a single literal character: + '%n':: newline + '%%':: a raw '%' + '%x00':: print a byte from a hex code + + - Placeholders that affect formatting of later placeholders: + '%Cred':: switch color to red + '%Cgreen':: switch color to green + '%Cblue':: switch color to blue + '%Creset':: reset color + '%C(...)':: color specification, as described under Values in the + "CONFIGURATION FILE" section of linkgit:git-config[1]. By + default, colors are shown only when enabled for log output + (by `color.diff`, `color.ui`, or `--color`, and respecting + the `auto` settings of the former if we are going to a + terminal). `%C(auto,...)` is accepted as a historical + synonym for the default (e.g., `%C(auto,red)`). Specifying - `%C(always,...) will show the colors even when color is ++ `%C(always,...)` will show the colors even when color is + not otherwise enabled (though consider just using + `--color=always` to enable color for the whole output, + including this format and anything else git might color). + `auto` alone (i.e. `%C(auto)`) will turn on auto coloring + on the next placeholders until the color is switched + again. + '%m':: left (`<`), right (`>`) or boundary (`-`) mark + '%w([[,[,]]])':: switch line wrapping, like the -w option of + linkgit:git-shortlog[1]. + '%<([,trunc|ltrunc|mtrunc])':: make the next placeholder take at + least N columns, padding spaces on + the right if necessary. Optionally + truncate at the beginning (ltrunc), + the middle (mtrunc) or the end + (trunc) if the output is longer than + N columns. Note that truncating + only works correctly with N >= 2. + '%<|()':: make the next placeholder take at least until Nth + columns, padding spaces on the right if necessary + '%>()', '%>|()':: similar to '%<()', '%<|()' respectively, + but padding spaces on the left + '%>>()', '%>>|()':: similar to '%>()', '%>|()' + respectively, except that if the next + placeholder takes more spaces than given and + there are spaces on its left, use those + spaces + '%><()', '%><|()':: similar to '%<()', '%<|()' + respectively, but padding both sides + (i.e. the text is centered) + + - Placeholders that expand to information extracted from the commit: + '%H':: commit hash + '%h':: abbreviated commit hash + '%T':: tree hash + '%t':: abbreviated tree hash + '%P':: parent hashes + '%p':: abbreviated parent hashes + '%an':: author name + '%aN':: author name (respecting .mailmap, see linkgit:git-shortlog[1] + or linkgit:git-blame[1]) + '%ae':: author email + '%aE':: author email (respecting .mailmap, see linkgit:git-shortlog[1] + or linkgit:git-blame[1]) + '%ad':: author date (format respects --date= option) + '%aD':: author date, RFC2822 style + '%ar':: author date, relative + '%at':: author date, UNIX timestamp + '%ai':: author date, ISO 8601-like format + '%aI':: author date, strict ISO 8601 format + '%cn':: committer name + '%cN':: committer name (respecting .mailmap, see + linkgit:git-shortlog[1] or linkgit:git-blame[1]) + '%ce':: committer email + '%cE':: committer email (respecting .mailmap, see + linkgit:git-shortlog[1] or linkgit:git-blame[1]) + '%cd':: committer date (format respects --date= option) + '%cD':: committer date, RFC2822 style + '%cr':: committer date, relative + '%ct':: committer date, UNIX timestamp + '%ci':: committer date, ISO 8601-like format + '%cI':: committer date, strict ISO 8601 format + '%d':: ref names, like the --decorate option of linkgit:git-log[1] + '%D':: ref names without the " (", ")" wrapping. ++'%S':: ref name given on the command line by which the commit was reached ++ (like `git log --source`), only works with `git log` + '%e':: encoding + '%s':: subject + '%f':: sanitized subject line, suitable for a filename + '%b':: body + '%B':: raw body (unwrapped subject and body) ifndef::git-rev-list[] - - '%N': commit notes + '%N':: commit notes endif::git-rev-list[] - - '%GG': raw verification message from GPG for a signed commit - - '%G?': show "G" for a good (valid) signature, - "B" for a bad signature, - "U" for a good signature with unknown validity, - "X" for a good signature that has expired, - "Y" for a good signature made by an expired key, - "R" for a good signature made by a revoked key, - "E" if the signature cannot be checked (e.g. missing key) - and "N" for no signature - - '%GS': show the name of the signer for a signed commit - - '%GK': show the key used to sign a signed commit - - '%GF': show the fingerprint of the key used to sign a signed commit - - '%GP': show the fingerprint of the primary key whose subkey was used - to sign a signed commit - - '%gD': reflog selector, e.g., `refs/stash@{1}` or - `refs/stash@{2 minutes ago`}; the format follows the rules described - for the `-g` option. The portion before the `@` is the refname as - given on the command line (so `git log -g refs/heads/master` would - yield `refs/heads/master@{0}`). - - '%gd': shortened reflog selector; same as `%gD`, but the refname - portion is shortened for human readability (so `refs/heads/master` - becomes just `master`). - - '%gn': reflog identity name - - '%gN': reflog identity name (respecting .mailmap, see - linkgit:git-shortlog[1] or linkgit:git-blame[1]) - - '%ge': reflog identity email - - '%gE': reflog identity email (respecting .mailmap, see - linkgit:git-shortlog[1] or linkgit:git-blame[1]) - - '%gs': reflog subject - - '%Cred': switch color to red - - '%Cgreen': switch color to green - - '%Cblue': switch color to blue - - '%Creset': reset color - - '%C(...)': color specification, as described under Values in the - "CONFIGURATION FILE" section of linkgit:git-config[1]. - By default, colors are shown only when enabled for log output (by - `color.diff`, `color.ui`, or `--color`, and respecting the `auto` - settings of the former if we are going to a terminal). `%C(auto,...)` - is accepted as a historical synonym for the default (e.g., - `%C(auto,red)`). Specifying `%C(always,...)` will show the colors - even when color is not otherwise enabled (though consider - just using `--color=always` to enable color for the whole output, - including this format and anything else git might color). `auto` - alone (i.e. `%C(auto)`) will turn on auto coloring on the next - placeholders until the color is switched again. - - '%m': left (`<`), right (`>`) or boundary (`-`) mark - - '%n': newline - - '%%': a raw '%' - - '%x00': print a byte from a hex code - - '%w([[,[,]]])': switch line wrapping, like the -w option of - linkgit:git-shortlog[1]. - - '%<([,trunc|ltrunc|mtrunc])': make the next placeholder take at - least N columns, padding spaces on the right if necessary. - Optionally truncate at the beginning (ltrunc), the middle (mtrunc) - or the end (trunc) if the output is longer than N columns. - Note that truncating only works correctly with N >= 2. - - '%<|()': make the next placeholder take at least until Nth - columns, padding spaces on the right if necessary - - '%>()', '%>|()': similar to '%<()', '%<|()' - respectively, but padding spaces on the left - - '%>>()', '%>>|()': similar to '%>()', '%>|()' - respectively, except that if the next placeholder takes more spaces - than given and there are spaces on its left, use those spaces - - '%><()', '%><|()': similar to '%<()', '%<|()' - respectively, but padding both sides (i.e. the text is centered) - - %(trailers[:options]): display the trailers of the body as interpreted - by linkgit:git-interpret-trailers[1]. The `trailers` string may be - followed by a colon and zero or more comma-separated options. If the - `only` option is given, omit non-trailer lines from the trailer block. - If the `unfold` option is given, behave as if interpret-trailer's - `--unfold` option was given. E.g., `%(trailers:only,unfold)` to do - both. + '%GG':: raw verification message from GPG for a signed commit + '%G?':: show "G" for a good (valid) signature, + "B" for a bad signature, + "U" for a good signature with unknown validity, + "X" for a good signature that has expired, + "Y" for a good signature made by an expired key, + "R" for a good signature made by a revoked key, + "E" if the signature cannot be checked (e.g. missing key) + and "N" for no signature + '%GS':: show the name of the signer for a signed commit + '%GK':: show the key used to sign a signed commit + '%GF':: show the fingerprint of the key used to sign a signed commit + '%GP':: show the fingerprint of the primary key whose subkey was used + to sign a signed commit + '%gD':: reflog selector, e.g., `refs/stash@{1}` or `refs/stash@{2 + minutes ago`}; the format follows the rules described for the + `-g` option. The portion before the `@` is the refname as + given on the command line (so `git log -g refs/heads/master` + would yield `refs/heads/master@{0}`). + '%gd':: shortened reflog selector; same as `%gD`, but the refname + portion is shortened for human readability (so + `refs/heads/master` becomes just `master`). + '%gn':: reflog identity name + '%gN':: reflog identity name (respecting .mailmap, see + linkgit:git-shortlog[1] or linkgit:git-blame[1]) + '%ge':: reflog identity email + '%gE':: reflog identity email (respecting .mailmap, see + linkgit:git-shortlog[1] or linkgit:git-blame[1]) + '%gs':: reflog subject + '%(trailers[:options])':: display the trailers of the body as + interpreted by + linkgit:git-interpret-trailers[1]. The + `trailers` string may be followed by a colon + and zero or more comma-separated options: + ** 'key=': only show trailers with specified key. Matching is done + case-insensitively and trailing colon is optional. If option is + given multiple times trailer lines matching any of the keys are + shown. This option automatically enables the `only` option so that + non-trailer lines in the trailer block are hidden. If that is not + desired it can be disabled with `only=false`. E.g., + `%(trailers:key=Reviewed-by)` shows trailer lines with key + `Reviewed-by`. + ** 'only[=val]': select whether non-trailer lines from the trailer + block should be included. The `only` keyword may optionally be + followed by an equal sign and one of `true`, `on`, `yes` to omit or + `false`, `off`, `no` to show the non-trailer lines. If option is + given without value it is enabled. If given multiple times the last + value is used. + ** 'separator=': specify a separator inserted between trailer + lines. When this option is not given each trailer line is + terminated with a line feed character. The string SEP may contain + the literal formatting codes described above. To use comma as + separator one must use `%x2C` as it would otherwise be parsed as + next option. If separator option is given multiple times only the + last one is used. E.g., `%(trailers:key=Ticket,separator=%x2C )` + shows all trailer lines whose key is "Ticket" separated by a comma + and a space. + ** 'unfold[=val]': make it behave as if interpret-trailer's `--unfold` + option was given. In same way as to for `only` it can be followed + by an equal sign and explicit value. E.g., + `%(trailers:only,unfold=true)` unfolds and shows all trailer lines. + ** 'valueonly[=val]': skip over the key part of the trailer line and only + show the value part. Also this optionally allows explicit value. NOTE: Some placeholders may depend on other options given to the revision traversal engine. For example, the `%g*` reflog options will diff --cc pretty.c index 0ab45d10d7,6d58b21aff..d2995b13ed --- a/pretty.c +++ b/pretty.c @@@ -1084,10 -1137,13 +1138,14 @@@ static size_t format_commit_one(struct const char *msg = c->message; struct commit_list *p; const char *arg; - int ch; + size_t res; + char **slot; /* these are independent of the commit */ + res = strbuf_expand_literal_cb(sb, placeholder, NULL); + if (res) + return res; + switch (placeholder[0]) { case 'C': if (starts_with(placeholder + 1, "(auto)")) {