Skip to content

ref-filter: add %(raw) atom

ZheNing Hu via GitGitGadget git 3 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v2 Latest posting 2/22 patches 7 repliesIn review
  2. v2 posting 1/22 patches 13 repliesSuperseded
  3. v12 patches 22 repliesSuperseded

Patches in v2 posting 2/2 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/2ref-filter: add obj-type check in grab contentsref-filter.c+15 -90 replies
2/2ref-filter: add %(raw) atomDocumentation/git-for-each-ref.txt ref-filter.c t/t6300-for-each-ref.sh+328 -281 reply

Reviews trailers per patch

None of the 2 patches has a Reviewed-by or Acked-by.

PatchChristian CouderHariom VermaJunio C HamanoFelipe ContrerasPhillip WoodOlga Telezhnaya
1/2Mentored-by Mentored-by Helped-by
2/2Mentored-by Mentored-by Helped-by Helped-by Helped-by Based-on-patch-by

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes. Scroll the table sideways for all 6 reviewers.

Read the v2 thread

Cover letter [PATCH v2 0/2] [GSOC] ref-filter: add %(raw) atom

In order to make git cat-file --batch use ref-filter logic, %(raw) atom is adding to ref-filter.

Change from last version:

1. Change --<lang> and --format=%(raw) checkpoint to verify_ref_format(), which make it more scalable.
2. Change grab_sub_body_contents() use struct expand_data *data instread of using obj,buf,buf_size to pass object info which can reduce the delivery of function parameters.

ZheNing Hu (2):
[GSOC] ref-filter: add obj-type check in grab contents [GSOC] ref-filter: add %(raw) atom

 Documentation/git-for-each-ref.txt |   9 ++
 ref-filter.c                       | 164 +++++++++++++++++------
 t/t6300-for-each-ref.sh            | 207 +++++++++++++++++++++++++++++
 3 files changed, 343 insertions(+), 37 deletions(-)

base-commit: 1197f1a46360d3ae96bd9c15908a3a6f8e562207
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-966%2Fadlternative%2Fref-filter-raw-atom-v4-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-966/adlternative/ref-filter-raw-atom-v4-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/966

Range-diff vs v1:

1: 97955705c22e ! 1: 48d256db5c34 [GSOC] ref-filter: add obj-type check in grab contents

     @@ ref-filter.c: static void append_lines(struct strbuf *out, const char *buf, unsi
       
       /* See grab_values */
      -static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf)
     -+static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf,
     -+				   struct object *obj)
     ++static void grab_sub_body_contents(struct atom_value *val, int deref, struct expand_data *data)
       {
       	int i;
       	const char *subpos = NULL, *bodypos = NULL, *sigpos = NULL;
     + 	size_t sublen = 0, bodylen = 0, nonsiglen = 0, siglen = 0;
     ++	void *buf = data->content;
     + 
     + 	for (i = 0; i < used_atom_cnt; i++) {
     + 		struct used_atom *atom = &used_atom[i];
      @@ ref-filter.c: static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf)
       			continue;
       		if (deref)
     @@ ref-filter.c: static void grab_sub_body_contents(struct atom_value *val, int der
      -		    !starts_with(name, "trailers") &&
      -		    !starts_with(name, "contents"))
      +
     -+		if ((obj->type != OBJ_TAG &&
     -+		     obj->type != OBJ_COMMIT) ||
     ++		if ((data->type != OBJ_TAG &&
     ++		     data->type != OBJ_COMMIT) ||
      +		    (strcmp(name, "body") &&
      +		     !starts_with(name, "subject") &&
      +		     !starts_with(name, "trailers") &&
     @@ ref-filter.c: static void grab_sub_body_contents(struct atom_value *val, int der
       			continue;
       		if (!subpos)
       			find_subpos(buf,
     -@@ ref-filter.c: static void grab_values(struct atom_value *val, int deref, struct object *obj, v
     +@@ ref-filter.c: static void fill_missing_values(struct atom_value *val)
     +  * pointed at by the ref itself; otherwise it is the object the
     +  * ref (which is a tag) refers to.
     +  */
     +-static void grab_values(struct atom_value *val, int deref, struct object *obj, void *buf)
     ++static void grab_values(struct atom_value *val, int deref, struct object *obj, struct expand_data *data)
     + {
     ++	void *buf = data->content;
     ++
       	switch (obj->type) {
       	case OBJ_TAG:
       		grab_tag_values(val, deref, obj);
      -		grab_sub_body_contents(val, deref, buf);
     -+		grab_sub_body_contents(val, deref, buf, obj);
     ++		grab_sub_body_contents(val, deref, data);
       		grab_person("tagger", val, deref, buf);
       		break;
       	case OBJ_COMMIT:
       		grab_commit_values(val, deref, obj);
      -		grab_sub_body_contents(val, deref, buf);
     -+		grab_sub_body_contents(val, deref, buf, obj);
     ++		grab_sub_body_contents(val, deref, data);
       		grab_person("author", val, deref, buf);
       		grab_person("committer", val, deref, buf);
       		break;
     +@@ ref-filter.c: static int get_object(struct ref_array_item *ref, int deref, struct object **obj
     + 			return strbuf_addf_ret(err, -1, _("parse_object_buffer failed on %s for %s"),
     + 					       oid_to_hex(&oi->oid), ref->refname);
     + 		}
     +-		grab_values(ref->value, deref, *obj, oi->content);
     ++		grab_values(ref->value, deref, *obj, oi);
     + 	}
     + 
     + 	grab_common_values(ref->value, deref, oi);

2: 5a94705cdbc1 ! 2: 0efed9435b59 [GSOC] ref-filter: add %(raw) atom
@@ ref-filter.c: static int parse_ref_filter_atom(const struct ref_format *format,
arg = memchr(sp, ':', ep - sp);
atom_len = (arg ? arg : ep) - sp;

-+ if (format->quote_style && !strncmp(sp, "raw", 3) && !arg)
-+ return strbuf_addf_ret(err, -1, _("--format=%.*s cannot be used with"
-+ "--python, --shell, --tcl, --perl"), (int)(ep-atom), atom);
-+
+ /* Do we have the atom already used elsewhere? */
+ for (i = 0; i < used_atom_cnt; i++) {
+ int len = strlen(used_atom[i].name);
@@ ref-filter.c: static int end_atom_handler(struct atom_value *atomv, struct ref_f
strbuf_swap(&current->output, &s);
}
strbuf_release(&s);
-@@ ref-filter.c: static void append_lines(struct strbuf *out, const char *buf, unsigned long size +@@ ref-filter.c: int verify_ref_format(struct ref_format *format)
+ at = parse_ref_filter_atom(format, sp + 2, ep, &err);
+ if (at < 0)
+ die("%s", err.buf);
++ if (format->quote_style && used_atom[at].atom_type == ATOM_RAW &&
++ used_atom[at].u.raw_data.option == RAW_BARE)
++ die(_("--format=%.*s cannot be used with"
++ "--python, --shell, --tcl, --perl"), (int)(ep - sp - 2), sp + 2);
+ cp = ep + 1;

- /* See grab_values */
- static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf,
-- struct object *obj)
-+ unsigned long buf_size, struct object *obj)
- {
- int i;
+ if (skip_prefix(used_atom[at].name, "color:", &color))
+@@ ref-filter.c: static void grab_sub_body_contents(struct atom_value *val, int deref, struct exp
const char *subpos = NULL, *bodypos = NULL, *sigpos = NULL;
-@@ ref-filter.c: static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf,
+ size_t sublen = 0, bodylen = 0, nonsiglen = 0, siglen = 0;
+ void *buf = data->content;
++ unsigned long buf_size = data->size;
+
+ for (i = 0; i < used_atom_cnt; i++) {
struct used_atom *atom = &used_atom[i];
const char *name = atom->name;
struct atom_value *v = &val[i];
@@ ref-filter.c: static void grab_sub_body_contents(struct atom_value *val, int der
+ continue;
+ }
+
- if ((obj->type != OBJ_TAG &&
- obj->type != OBJ_COMMIT) ||
+ if ((data->type != OBJ_TAG &&
+ data->type != OBJ_COMMIT) ||
(strcmp(name, "body") &&
-@@ ref-filter.c: static void fill_missing_values(struct atom_value *val)
- * pointed at by the ref itself; otherwise it is the object the
- * ref (which is a tag) refers to.
- */
--static void grab_values(struct atom_value *val, int deref, struct object *obj, void *buf) -+static void grab_values(struct atom_value *val, int deref, struct object *obj, struct expand_data *data)
- {
-+ void *buf = data->content;
-+ unsigned long buf_size = data->size;
-+
- switch (obj->type) {
- case OBJ_TAG:
- grab_tag_values(val, deref, obj);
-- grab_sub_body_contents(val, deref, buf, obj);
-+ grab_sub_body_contents(val, deref, buf, buf_size, obj);
- grab_person("tagger", val, deref, buf);
- break;
- case OBJ_COMMIT:
- grab_commit_values(val, deref, obj);
-- grab_sub_body_contents(val, deref, buf, obj);
-+ grab_sub_body_contents(val, deref, buf, buf_size, obj);
- grab_person("author", val, deref, buf);
- grab_person("committer", val, deref, buf);
+@@ ref-filter.c: static void grab_values(struct atom_value *val, int deref, struct object *obj, s
break;
case OBJ_TREE:
/* grab_tree_values(val, deref, obj, buf, sz); */
-+ grab_sub_body_contents(val, deref, buf, buf_size, obj);
++ grab_sub_body_contents(val, deref, data);
break;
case OBJ_BLOB:
/* grab_blob_values(val, deref, obj, buf, sz); */
-+ grab_sub_body_contents(val, deref, buf, buf_size, obj);
++ grab_sub_body_contents(val, deref, data);
break;
default:
die("Eh? Object of type %d?", obj->type);
-@@ ref-filter.c: static int get_object(struct ref_array_item *ref, int deref, struct object **obj
- return strbuf_addf_ret(err, -1, _("parse_object_buffer failed on %s for %s"),
- oid_to_hex(&oi->oid), ref->refname);
- }
-- grab_values(ref->value, deref, *obj, oi->content);
-+ grab_values(ref->value, deref, *obj, oi);
- }
-
- grab_common_values(ref->value, deref, oi);
@@ ref-filter.c: static int populate_value(struct ref_array_item *ref, struct strbuf *err)
int deref = 0;
const char *refname;

Signature · 1 line
gitgitgadget