Message ID | 0e294ff1626ef2b7992e84e8d960f5058bd39bdc.1627270010.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 311d0b8e8e370bc9f6168af1f4e120d2b0975702 |
Headers | show |
Series | ref-filter: add %(raw) and %(rest) atoms | expand |
"ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes: > From: ZheNing Hu <adlternative@gmail.com> > > Only tag and commit objects use `grab_sub_body_contents()` to grab > object contents in the current codebase. We want to teach the > function to also handle blobs and trees to get their raw data, > without parsing a blob (whose contents looks like a commit or a tag) > incorrectly as a commit or a tag. So it's needed to pass a > `struct expand_data *data` instread of only `void *buf` to both > `grab_sub_body_contents()` and `grab_values()` to be able to check > the object type. > > Skip the block of code that is specific to handling commits and tags > early when the given object is of a wrong type to help later > addition to handle other types of objects in this function. > > Reviewed-by: Jacob Keller <jacob.keller@gmail.com> > Mentored-by: Christian Couder <christian.couder@gmail.com> > Mentored-by: Hariom Verma <hariom18599@gmail.com> > Helped-by: Junio C Hamano <gitster@pobox.com> > Signed-off-by: ZheNing Hu <adlternative@gmail.com> It is not a huge deal, but are these trailers given in a sensible order? The order of event happened were that help and mentoring were given, your finished version of the patch came after that to be signed off by you, and then a reviewer gave you a reviewed-by, no?
Junio C Hamano <gitster@pobox.com> 于2021年7月27日周二 上午3:15写道: > > "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes: > > > From: ZheNing Hu <adlternative@gmail.com> > > > > Only tag and commit objects use `grab_sub_body_contents()` to grab > > object contents in the current codebase. We want to teach the > > function to also handle blobs and trees to get their raw data, > > without parsing a blob (whose contents looks like a commit or a tag) > > incorrectly as a commit or a tag. So it's needed to pass a > > `struct expand_data *data` instread of only `void *buf` to both > > `grab_sub_body_contents()` and `grab_values()` to be able to check > > the object type. > > > > Skip the block of code that is specific to handling commits and tags > > early when the given object is of a wrong type to help later > > addition to handle other types of objects in this function. > > > > Reviewed-by: Jacob Keller <jacob.keller@gmail.com> > > Mentored-by: Christian Couder <christian.couder@gmail.com> > > Mentored-by: Hariom Verma <hariom18599@gmail.com> > > Helped-by: Junio C Hamano <gitster@pobox.com> > > Signed-off-by: ZheNing Hu <adlternative@gmail.com> > > It is not a huge deal, but are these trailers given in a sensible > order? The order of event happened were that help and mentoring > were given, your finished version of the patch came after that to be > signed off by you, and then a reviewer gave you a reviewed-by, no? Indeed so. Thanks. -- ZheNing Hu
diff --git a/ref-filter.c b/ref-filter.c index 4db0e40ff4c..5cee6512fba 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -1356,11 +1356,12 @@ static void append_lines(struct strbuf *out, const char *buf, unsigned long size } /* 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, 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]; @@ -1371,10 +1372,13 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, void *buf) continue; if (deref) name++; - if (strcmp(name, "body") && - !starts_with(name, "subject") && - !starts_with(name, "trailers") && - !starts_with(name, "contents")) + + if ((data->type != OBJ_TAG && + data->type != OBJ_COMMIT) || + (strcmp(name, "body") && + !starts_with(name, "subject") && + !starts_with(name, "trailers") && + !starts_with(name, "contents"))) continue; if (!subpos) find_subpos(buf, @@ -1438,17 +1442,19 @@ 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, 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, data); grab_person("author", val, deref, buf); grab_person("committer", val, deref, buf); break; @@ -1678,7 +1684,7 @@ 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);