]> git.ipfire.org Git - thirdparty/git.git/commitdiff
ref-filter: add `sanitize` option for 'subject' atom
authorHariom Verma <hariom18599@gmail.com>
Fri, 21 Aug 2020 21:41:50 +0000 (21:41 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 28 Aug 2020 20:52:51 +0000 (13:52 -0700)
Currently, subject does not take any arguments. This commit introduce
`sanitize` formatting option to 'subject' atom.

`subject:sanitize` - print sanitized subject line, suitable for a filename.

e.g.
%(subject): "the subject line"
%(subject:sanitize): "the-subject-line"

Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Heba Waly <heba.waly@gmail.com>
Signed-off-by: Hariom Verma <hariom18599@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-for-each-ref.txt
ref-filter.c
t/t6300-for-each-ref.sh

index dd09763e7df1331ab538ddfcce66d49dacfa3f88..616ce460872f0f93ff5944a36bb0b0a20920485d 100644 (file)
@@ -247,6 +247,9 @@ contents:subject::
        The first paragraph of the message, which typically is a
        single line, is taken as the "subject" of the commit or the
        tag message.
+       Instead of `contents:subject`, field `subject` can also be used to
+       obtain same results. `:sanitize` can be appended to `subject` for
+       subject line suitable for filename.
 
 contents:body::
        The remainder of the commit or the tag message that follows
index c7d81088e4d3d8281de1e41adbdd00f4890f1122..12bb78ce06d8f5ea221483f66a28050a8a0cc29c 100644 (file)
@@ -127,8 +127,8 @@ static struct used_atom {
                        unsigned int nobracket : 1, push : 1, push_remote : 1;
                } remote_ref;
                struct {
-                       enum { C_BARE, C_BODY, C_BODY_DEP, C_LENGTH,
-                              C_LINES, C_SIG, C_SUB, C_TRAILERS } option;
+                       enum { C_BARE, C_BODY, C_BODY_DEP, C_LENGTH, C_LINES,
+                              C_SIG, C_SUB, C_SUB_SANITIZE, C_TRAILERS } option;
                        struct process_trailer_options trailer_opts;
                        unsigned int nlines;
                } contents;
@@ -301,9 +301,12 @@ static int body_atom_parser(const struct ref_format *format, struct used_atom *a
 static int subject_atom_parser(const struct ref_format *format, struct used_atom *atom,
                               const char *arg, struct strbuf *err)
 {
-       if (arg)
-               return strbuf_addf_ret(err, -1, _("%%(subject) does not take arguments"));
-       atom->u.contents.option = C_SUB;
+       if (!arg)
+               atom->u.contents.option = C_SUB;
+       else if (!strcmp(arg, "sanitize"))
+               atom->u.contents.option = C_SUB_SANITIZE;
+       else
+               return strbuf_addf_ret(err, -1, _("unrecognized %%(subject) argument: %s"), arg);
        return 0;
 }
 
@@ -1282,8 +1285,8 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf)
                        continue;
                if (deref)
                        name++;
-               if (strcmp(name, "subject") &&
-                   strcmp(name, "body") &&
+               if (strcmp(name, "body") &&
+                   !starts_with(name, "subject") &&
                    !starts_with(name, "trailers") &&
                    !starts_with(name, "contents"))
                        continue;
@@ -1295,7 +1298,11 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf)
 
                if (atom->u.contents.option == C_SUB)
                        v->s = copy_subject(subpos, sublen);
-               else if (atom->u.contents.option == C_BODY_DEP)
+               else if (atom->u.contents.option == C_SUB_SANITIZE) {
+                       struct strbuf sb = STRBUF_INIT;
+                       format_sanitized_subject(&sb, subpos, sublen);
+                       v->s = strbuf_detach(&sb, NULL);
+               } else if (atom->u.contents.option == C_BODY_DEP)
                        v->s = xmemdupz(bodypos, bodylen);
                else if (atom->u.contents.option == C_LENGTH)
                        v->s = xstrfmt("%"PRIuMAX, (uintmax_t)strlen(subpos));
index 79d5b293872ac90397a5001bddeb72d8d4ebae93..220ff5c3c2eb2f4669161cfd554402d392bc27a0 100755 (executable)
@@ -150,6 +150,7 @@ test_atom head taggerdate ''
 test_atom head creator 'C O Mitter <committer@example.com> 1151968723 +0200'
 test_atom head creatordate 'Tue Jul 4 01:18:43 2006 +0200'
 test_atom head subject 'Initial'
+test_atom head subject:sanitize 'Initial'
 test_atom head contents:subject 'Initial'
 test_atom head body ''
 test_atom head contents:body ''
@@ -207,6 +208,7 @@ test_atom tag taggerdate 'Tue Jul 4 01:18:45 2006 +0200'
 test_atom tag creator 'C O Mitter <committer@example.com> 1151968725 +0200'
 test_atom tag creatordate 'Tue Jul 4 01:18:45 2006 +0200'
 test_atom tag subject 'Tagging at 1151968727'
+test_atom tag subject:sanitize 'Tagging-at-1151968727'
 test_atom tag contents:subject 'Tagging at 1151968727'
 test_atom tag body ''
 test_atom tag contents:body ''
@@ -619,6 +621,7 @@ test_expect_success 'create tag with subject and body content' '
        git tag -F msg subject-body
 '
 test_atom refs/tags/subject-body subject 'the subject line'
+test_atom refs/tags/subject-body subject:sanitize 'the-subject-line'
 test_atom refs/tags/subject-body body 'first body line
 second body line
 '
@@ -639,6 +642,7 @@ test_expect_success 'create tag with multiline subject' '
        git tag -F msg multiline
 '
 test_atom refs/tags/multiline subject 'first subject line second subject line'
+test_atom refs/tags/multiline subject:sanitize 'first-subject-line-second-subject-line'
 test_atom refs/tags/multiline contents:subject 'first subject line second subject line'
 test_atom refs/tags/multiline body 'first body line
 second body line
@@ -671,6 +675,7 @@ sig='-----BEGIN PGP SIGNATURE-----
 
 PREREQ=GPG
 test_atom refs/tags/signed-empty subject ''
+test_atom refs/tags/signed-empty subject:sanitize ''
 test_atom refs/tags/signed-empty contents:subject ''
 test_atom refs/tags/signed-empty body "$sig"
 test_atom refs/tags/signed-empty contents:body ''
@@ -678,6 +683,7 @@ test_atom refs/tags/signed-empty contents:signature "$sig"
 test_atom refs/tags/signed-empty contents "$sig"
 
 test_atom refs/tags/signed-short subject 'subject line'
+test_atom refs/tags/signed-short subject:sanitize 'subject-line'
 test_atom refs/tags/signed-short contents:subject 'subject line'
 test_atom refs/tags/signed-short body "$sig"
 test_atom refs/tags/signed-short contents:body ''
@@ -686,6 +692,7 @@ test_atom refs/tags/signed-short contents "subject line
 $sig"
 
 test_atom refs/tags/signed-long subject 'subject line'
+test_atom refs/tags/signed-long subject:sanitize 'subject-line'
 test_atom refs/tags/signed-long contents:subject 'subject line'
 test_atom refs/tags/signed-long body "body contents
 $sig"