From: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Christian Couder <christian.couder@gmail.com>,
Hariom Verma <hariom18599@gmail.com>,
ZheNing Hu <adlternative@gmail.com>,
ZheNing Hu <adlternative@gmail.com>
Subject: [PATCH 5/6] [GSOC] ref-filter: teach grab_sub_body_contents() return value and err
Date: Sat, 05 Jun 2021 09:13:33 +0000 [thread overview]
Message-ID: <1b74d4cb85ae197f1e1ab648f6db2fe516a42436.1622884415.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.972.git.1622884415.gitgitgadget@gmail.com>
From: ZheNing Hu <adlternative@gmail.com>
Teach grab_sub_body_contents() return value and err can help us
report more useful error messages when when add %(raw:textconv)
and %(raw:filter) later.
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
ref-filter.c | 43 ++++++++++++++++++++++++++++---------------
1 file changed, 28 insertions(+), 15 deletions(-)
diff --git a/ref-filter.c b/ref-filter.c
index 695f6f55e3e3..a859a94aa8e0 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -1403,7 +1403,8 @@ 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, struct expand_data *data)
+static int grab_sub_body_contents(struct atom_value *val, int deref, struct expand_data *data,
+ struct strbuf *err)
{
int i;
const char *subpos = NULL, *bodypos = NULL, *sigpos = NULL;
@@ -1478,6 +1479,7 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct exp
}
free((void *)sigpos);
+ return 0;
}
/*
@@ -1501,33 +1503,39 @@ 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, struct expand_data *data)
+static int grab_values(struct atom_value *val, int deref, struct object *obj, struct expand_data *data, struct strbuf *err)
{
void *buf = data->content;
+ int ret = 0;
switch (obj->type) {
case OBJ_TAG:
grab_tag_values(val, deref, obj);
- grab_sub_body_contents(val, deref, data);
+ if ((ret = grab_sub_body_contents(val, deref, data, err)))
+ return ret;
grab_person("tagger", val, deref, buf);
break;
case OBJ_COMMIT:
grab_commit_values(val, deref, obj);
- grab_sub_body_contents(val, deref, data);
+ if ((ret = grab_sub_body_contents(val, deref, data, err)))
+ return ret;
grab_person("author", val, deref, buf);
grab_person("committer", val, deref, buf);
break;
case OBJ_TREE:
/* grab_tree_values(val, deref, obj, buf, sz); */
- grab_sub_body_contents(val, deref, data);
+ if ((ret = grab_sub_body_contents(val, deref, data, err)))
+ return ret;
break;
case OBJ_BLOB:
/* grab_blob_values(val, deref, obj, buf, sz); */
- grab_sub_body_contents(val, deref, data);
+ if ((ret = grab_sub_body_contents(val, deref, data, err)))
+ return ret;
break;
default:
die("Eh? Object of type %d?", obj->type);
}
+ return ret;
}
static inline char *copy_advance(char *dst, const char *src)
@@ -1725,6 +1733,8 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj
{
/* parse_object_buffer() will set eaten to 0 if free() will be needed */
int eaten = 1;
+ int ret = 0;
+
if (oi->info.contentp) {
/* We need to know that to use parse_object_buffer properly */
oi->info.sizep = &oi->size;
@@ -1745,13 +1755,13 @@ 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);
+ ret = grab_values(ref->value, deref, *obj, oi, err);
}
grab_common_values(ref->value, deref, oi);
if (!eaten)
free(oi->content);
- return 0;
+ return ret;
}
static void populate_worktree_map(struct hashmap *map, struct worktree **worktrees)
@@ -1805,7 +1815,7 @@ static char *get_worktree_path(const struct used_atom *atom, const struct ref_ar
static int populate_value(struct ref_array_item *ref, struct strbuf *err)
{
struct object *obj;
- int i;
+ int i, ret = 0;
struct object_info empty = OBJECT_INFO_INIT;
CALLOC_ARRAY(ref->value, used_atom_cnt);
@@ -1961,8 +1971,8 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
oi.oid = ref->objectname;
- if (get_object(ref, 0, &obj, &oi, err))
- return -1;
+ if ((ret = get_object(ref, 0, &obj, &oi, err)))
+ return ret;
/*
* If there is no atom that wants to know about tagged
@@ -1993,9 +2003,11 @@ static int populate_value(struct ref_array_item *ref, struct strbuf *err)
static int get_ref_atom_value(struct ref_array_item *ref, int atom,
struct atom_value **v, struct strbuf *err)
{
+ int ret = 0;
+
if (!ref->value) {
- if (populate_value(ref, err))
- return -1;
+ if ((ret = populate_value(ref, err)))
+ return ret;
fill_missing_values(ref->value);
}
*v = &ref->value[atom];
@@ -2568,6 +2580,7 @@ int format_ref_array_item(struct ref_array_item *info,
struct strbuf *error_buf)
{
const char *cp, *sp, *ep;
+ int ret = 0;
struct ref_formatting_state state = REF_FORMATTING_STATE_INIT;
state.quote_style = format->quote_style;
@@ -2581,10 +2594,10 @@ int format_ref_array_item(struct ref_array_item *info,
if (cp < sp)
append_literal(cp, sp, &state);
pos = parse_ref_filter_atom(format, sp + 2, ep, error_buf);
- if (pos < 0 || get_ref_atom_value(info, pos, &atomv, error_buf) ||
+ if (pos < 0 || ((ret = get_ref_atom_value(info, pos, &atomv, error_buf))) ||
atomv->handler(atomv, &state, error_buf)) {
pop_stack_element(&state.stack);
- return -1;
+ return ret ? ret : -1;
}
}
if (*cp) {
--
gitgitgadget
next prev parent reply other threads:[~2021-06-05 9:13 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-05 9:13 [PATCH 0/6] [GSOC][RFC] ref-filter: add %(raw:textconv) and %(raw:filters) ZheNing Hu via GitGitGadget
2021-06-05 9:13 ` [PATCH 1/6] [GSOC] ref-filter: add obj-type check in grab contents ZheNing Hu via GitGitGadget
2021-06-05 9:13 ` [PATCH 2/6] [GSOC] ref-filter: add %(raw) atom ZheNing Hu via GitGitGadget
2021-06-08 5:07 ` Junio C Hamano
2021-06-08 6:10 ` ZheNing Hu
2021-06-05 9:13 ` [PATCH 3/6] [GSOC] ref-filter: use non-const ref_format in *_atom_parser() ZheNing Hu via GitGitGadget
2021-06-05 9:13 ` [PATCH 4/6] [GSOC] ref-filter: add %(rest) atom and --rest option ZheNing Hu via GitGitGadget
2021-06-05 15:20 ` Hariom verma
2021-06-06 4:58 ` ZheNing Hu
2021-06-07 5:52 ` Junio C Hamano
2021-06-07 13:02 ` ZheNing Hu
2021-06-07 13:18 ` ZheNing Hu
2021-06-08 6:16 ` ZheNing Hu
2021-06-08 6:59 ` Junio C Hamano
2021-06-08 12:39 ` ZheNing Hu
2021-06-09 7:00 ` Junio C Hamano
2021-06-09 12:47 ` ZheNing Hu
2021-06-08 6:50 ` Junio C Hamano
2021-06-08 12:32 ` ZheNing Hu
2021-06-05 9:13 ` ZheNing Hu via GitGitGadget [this message]
2021-06-05 9:13 ` [PATCH 6/6] [GSOC] ref-filter: add %(raw:textconv) and %(raw:filters) ZheNing Hu via GitGitGadget
2021-06-05 10:29 ` [PATCH 0/6] [GSOC][RFC] " Bagas Sanjaya
2021-06-05 13:19 ` ZheNing Hu
2021-06-07 5:55 ` Junio C Hamano
2021-06-07 13:06 ` ZheNing Hu
2021-06-08 6:42 ` Junio C Hamano
2021-06-08 12:52 ` ZheNing Hu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1b74d4cb85ae197f1e1ab648f6db2fe516a42436.1622884415.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=adlternative@gmail.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hariom18599@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).