зеркало из https://github.com/microsoft/git.git
pretty.c: add %f format specifier to format_commit_message()
This specifier represents the sanitized and filename friendly subject line of a commit. No checks are made against the length of the string, so users may need to trim the result to the desired length if using as a filename. This is commonly used by format-patch to massage commit subjects into filenames and output patches to files. Signed-off-by: Stephen Boyd <bebarino@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
636991be2d
Коммит
46d164b0cd
|
@ -121,6 +121,7 @@ The placeholders are:
|
||||||
- '%d': ref names, like the --decorate option of linkgit:git-log[1]
|
- '%d': ref names, like the --decorate option of linkgit:git-log[1]
|
||||||
- '%e': encoding
|
- '%e': encoding
|
||||||
- '%s': subject
|
- '%s': subject
|
||||||
|
- '%f': sanitized subject line, suitable for a filename
|
||||||
- '%b': body
|
- '%b': body
|
||||||
- '%Cred': switch color to red
|
- '%Cred': switch color to red
|
||||||
- '%Cgreen': switch color to green
|
- '%Cgreen': switch color to green
|
||||||
|
|
35
pretty.c
35
pretty.c
|
@ -493,6 +493,38 @@ static void parse_commit_header(struct format_commit_context *context)
|
||||||
context->commit_header_parsed = 1;
|
context->commit_header_parsed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int istitlechar(char c)
|
||||||
|
{
|
||||||
|
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
|
||||||
|
(c >= '0' && c <= '9') || c == '.' || c == '_';
|
||||||
|
}
|
||||||
|
|
||||||
|
static void format_sanitized_subject(struct strbuf *sb, const char *msg)
|
||||||
|
{
|
||||||
|
size_t trimlen;
|
||||||
|
int space = 2;
|
||||||
|
|
||||||
|
for (; *msg && *msg != '\n'; msg++) {
|
||||||
|
if (istitlechar(*msg)) {
|
||||||
|
if (space == 1)
|
||||||
|
strbuf_addch(sb, '-');
|
||||||
|
space = 0;
|
||||||
|
strbuf_addch(sb, *msg);
|
||||||
|
if (*msg == '.')
|
||||||
|
while (*(msg+1) == '.')
|
||||||
|
msg++;
|
||||||
|
} else
|
||||||
|
space |= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* trim any trailing '.' or '-' characters */
|
||||||
|
trimlen = 0;
|
||||||
|
while (sb->buf[sb->len - 1 - trimlen] == '.'
|
||||||
|
|| sb->buf[sb->len - 1 - trimlen] == '-')
|
||||||
|
trimlen++;
|
||||||
|
strbuf_remove(sb, sb->len - trimlen, trimlen);
|
||||||
|
}
|
||||||
|
|
||||||
const char *format_subject(struct strbuf *sb, const char *msg,
|
const char *format_subject(struct strbuf *sb, const char *msg,
|
||||||
const char *line_separator)
|
const char *line_separator)
|
||||||
{
|
{
|
||||||
|
@ -683,6 +715,9 @@ static size_t format_commit_item(struct strbuf *sb, const char *placeholder,
|
||||||
case 's': /* subject */
|
case 's': /* subject */
|
||||||
format_subject(sb, msg + c->subject_off, " ");
|
format_subject(sb, msg + c->subject_off, " ");
|
||||||
return 1;
|
return 1;
|
||||||
|
case 'f': /* sanitized subject */
|
||||||
|
format_sanitized_subject(sb, msg + c->subject_off);
|
||||||
|
return 1;
|
||||||
case 'b': /* body */
|
case 'b': /* body */
|
||||||
strbuf_addstr(sb, msg + c->body_off);
|
strbuf_addstr(sb, msg + c->body_off);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче