summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Boyd <bebarino@gmail.com>2009-03-22 19:14:01 -0700
committerJunio C Hamano <gitster@pobox.com>2009-03-22 21:32:13 -0700
commit46d164b0cd1d5d254047d7573c53e368e42bf5e5 (patch)
treec382d4a26b5c3c33712063fe4545cc31aa8591e4
parent636991be2d2ce8368cd6735473954b1ebfa989bf (diff)
downloadgit-46d164b0cd1d5d254047d7573c53e368e42bf5e5.tar.gz
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>
-rw-r--r--Documentation/pretty-formats.txt1
-rw-r--r--pretty.c35
2 files changed, 36 insertions, 0 deletions
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index 5c6e678aa3..2a845b1e57 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -121,6 +121,7 @@ The placeholders are:
- '%d': ref names, like the --decorate option of linkgit:git-log[1]
- '%e': encoding
- '%s': subject
+- '%f': sanitized subject line, suitable for a filename
- '%b': body
- '%Cred': switch color to red
- '%Cgreen': switch color to green
diff --git a/pretty.c b/pretty.c
index efa70245f1..c57cef47c9 100644
--- a/pretty.c
+++ b/pretty.c
@@ -493,6 +493,38 @@ static void parse_commit_header(struct format_commit_context *context)
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 *line_separator)
{
@@ -683,6 +715,9 @@ static size_t format_commit_item(struct strbuf *sb, const char *placeholder,
case 's': /* subject */
format_subject(sb, msg + c->subject_off, " ");
return 1;
+ case 'f': /* sanitized subject */
+ format_sanitized_subject(sb, msg + c->subject_off);
+ return 1;
case 'b': /* body */
strbuf_addstr(sb, msg + c->body_off);
return 1;