]> git.ipfire.org Git - thirdparty/git.git/blobdiff - ref-filter.c
Fourteenth batch
[thirdparty/git.git] / ref-filter.c
index 066975b306429d5c67800480fddb6dc8fd9c269a..110bcd741a9414bd90262b8e1ae9933e3198ca1c 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;
 }
 
@@ -348,9 +351,11 @@ static int contents_atom_parser(const struct ref_format *format, struct used_ato
                atom->u.contents.option = C_SIG;
        else if (!strcmp(arg, "subject"))
                atom->u.contents.option = C_SUB;
-       else if (skip_prefix(arg, "trailers", &arg)) {
-               skip_prefix(arg, ":", &arg);
-               if (trailers_atom_parser(format, atom, *arg ? arg : NULL, err))
+       else if (!strcmp(arg, "trailers")) {
+               if (trailers_atom_parser(format, atom, NULL, err))
+                       return -1;
+       } else if (skip_prefix(arg, "trailers:", &arg)) {
+               if (trailers_atom_parser(format, atom, arg, err))
                        return -1;
        } else if (skip_prefix(arg, "lines=", &arg)) {
                atom->u.contents.option = C_LINES;
@@ -497,8 +502,8 @@ static struct {
        { "objectsize", SOURCE_OTHER, FIELD_ULONG, objectsize_atom_parser },
        { "objectname", SOURCE_OTHER, FIELD_STR, oid_atom_parser },
        { "deltabase", SOURCE_OTHER, FIELD_STR, deltabase_atom_parser },
-       { "tree", SOURCE_OBJ },
-       { "parent", SOURCE_OBJ },
+       { "tree", SOURCE_OBJ, FIELD_STR, oid_atom_parser },
+       { "parent", SOURCE_OBJ, FIELD_STR, oid_atom_parser },
        { "numparent", SOURCE_OBJ, FIELD_ULONG },
        { "object", SOURCE_OBJ },
        { "type", SOURCE_OBJ },
@@ -1005,21 +1010,20 @@ static void grab_commit_values(struct atom_value *val, int deref, struct object
                        continue;
                if (deref)
                        name++;
-               if (!strcmp(name, "tree")) {
-                       v->s = xstrdup(oid_to_hex(get_commit_tree_oid(commit)));
-               }
-               else if (!strcmp(name, "numparent")) {
+               if (grab_oid(name, "tree", get_commit_tree_oid(commit), v, &used_atom[i]))
+                       continue;
+               if (!strcmp(name, "numparent")) {
                        v->value = commit_list_count(commit->parents);
                        v->s = xstrfmt("%lu", (unsigned long)v->value);
                }
-               else if (!strcmp(name, "parent")) {
+               else if (starts_with(name, "parent")) {
                        struct commit_list *parents;
                        struct strbuf s = STRBUF_INIT;
                        for (parents = commit->parents; parents; parents = parents->next) {
-                               struct commit *parent = parents->item;
+                               struct object_id *oid = &parents->item->object.oid;
                                if (parents != commit->parents)
                                        strbuf_addch(&s, ' ');
-                               strbuf_addstr(&s, oid_to_hex(&parent->object.oid));
+                               strbuf_addstr(&s, do_grab_oid("parent", oid, &used_atom[i]));
                        }
                        v->s = strbuf_detach(&s, NULL);
                }
@@ -1283,8 +1287,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;
@@ -1296,7 +1300,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));