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:
Stephen Boyd 2009-03-22 19:14:01 -07:00 коммит произвёл Junio C Hamano
Родитель 636991be2d
Коммит 46d164b0cd
2 изменённых файлов: 36 добавлений и 0 удалений

Просмотреть файл

@ -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

Просмотреть файл

@ -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;