git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH RFC v2 02/25] ref-filter: add return value to some functions

From
Olga Telezhnaya <olyatelezhnaya@gmail.com>
Date
Feb 5, 2018, 11:27 UTC
Message-ID
<0102016165b8b41c-79ff8d08-8681-4bd2-b0a8-13580048c543-000000@eu-west-1.amazonses.com>
In-Reply-To
<0102016165b8b3c4-54efe4c4-6d19-435d-b5b9-6c727771353b-000000@eu-west-1.amazonses.com>

Add return flag to format_ref_array_item(), show_ref_array_item(), get_ref_array_info() and populate_value() for further using. Need it to handle situations when item is broken but we can not invoke die() because we are in batch mode and all items need to be processed.

Signed-off-by: Olga Telezhnaia <olyatelezhnaya@gmail.com>
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored by: Jeff King <peff@peff.net>
---
 ref-filter.c | 37 ++++++++++++++++++++++++-------------
 ref-filter.h | 14 ++++++++++----
 2 files changed, 34 insertions(+), 17 deletions(-)
diff --git a/ref-filter.c b/ref-filter.c
index d04295e33448e..9ed5e66066a7a 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -1356,8 +1356,9 @@ static const char *get_refname(struct used_atom *atom, struct ref_array_item *re
 
 /*
  * Parse the object referred by ref, and grab needed value.
+ * Return 0 if everything was successful, -1 otherwise.
  */
-static void populate_value(struct ref_array_item *ref)
+static int populate_value(struct ref_array_item *ref)
 {
 	void *buf;
 	struct object *obj;
@@ -1482,7 +1483,7 @@ static void populate_value(struct ref_array_item *ref)
 		}
 	}
 	if (used_atom_cnt <= i)
-		return;
+		return 0;
 
 	buf = get_obj(&ref->objectname, &obj, &size, &eaten);
 	if (!buf)
@@ -1501,7 +1502,7 @@ static void populate_value(struct ref_array_item *ref)
 	 * object, we are done.
 	 */
 	if (!need_tagged || (obj->type != OBJ_TAG))
-		return;
+		return 0;
 
 	/*
 	 * If it is a tag object, see if we use a value that derefs
@@ -1525,19 +1526,24 @@ static void populate_value(struct ref_array_item *ref)
 	grab_values(ref->value, 1, obj, buf, size);
 	if (!eaten)
 		free(buf);
+
+	return 0;
 }
 
 /*
  * Given a ref, return the value for the atom.  This lazily gets value
  * out of the object by calling populate value.
+ * Return 0 if everything was successful, -1 otherwise.
  */
-static void get_ref_atom_value(struct ref_array_item *ref, int atom, struct atom_value **v)
+static int get_ref_atom_value(struct ref_array_item *ref, int atom, struct atom_value **v)
 {
+	int retval = 0;
 	if (!ref->value) {
-		populate_value(ref);
+		retval = populate_value(ref);
 		fill_missing_values(ref->value);
 	}
 	*v = &ref->value[atom];
+	return retval;
 }
 
 /*
@@ -2122,7 +2128,7 @@ static void append_literal(const char *cp, const char *ep, struct ref_formatting
 	}
 }
 
-void format_ref_array_item(struct ref_array_item *info,
+int format_ref_array_item(struct ref_array_item *info,
 			   const struct ref_format *format,
 			   struct strbuf *final_buf)
 {
@@ -2138,9 +2144,10 @@ void format_ref_array_item(struct ref_array_item *info,
 		ep = strchr(sp, ')');
 		if (cp < sp)
 			append_literal(cp, sp, &state);
-		get_ref_atom_value(info,
-				   parse_ref_filter_atom(format, sp + 2, ep),
-				   &atomv);
+		if (get_ref_atom_value(info,
+				       parse_ref_filter_atom(format, sp + 2, ep),
+				       &atomv))
+			return -1;
 		atomv->handler(atomv, &state);
 	}
 	if (*cp) {
@@ -2156,17 +2163,21 @@ void format_ref_array_item(struct ref_array_item *info,
 		die(_("format: %%(end) atom missing"));
 	strbuf_addbuf(final_buf, &state.stack->output);
 	pop_stack_element(&state.stack);
+	return 0;
 }
 
-void show_ref_array_item(struct ref_array_item *info,
+int show_ref_array_item(struct ref_array_item *info,
 			 const struct ref_format *format)
 {
 	struct strbuf final_buf = STRBUF_INIT;
+	int retval = format_ref_array_item(info, format, &final_buf);
 
-	format_ref_array_item(info, format, &final_buf);
-	fwrite(final_buf.buf, 1, final_buf.len, stdout);
+	if (!retval) {
+		fwrite(final_buf.buf, 1, final_buf.len, stdout);
+		putchar('\n');
+	}
 	strbuf_release(&final_buf);
-	putchar('\n');
+	return retval;
 }
 
 void pretty_print_ref(const char *name, const unsigned char *sha1,
diff --git a/ref-filter.h b/ref-filter.h
index 0d98342b34319..b75c8ac45248e 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -109,12 +109,18 @@ void ref_array_clear(struct ref_array *array);
 int verify_ref_format(struct ref_format *format);
 /*  Sort the given ref_array as per the ref_sorting provided */
 void ref_array_sort(struct ref_sorting *sort, struct ref_array *array);
-/*  Based on the given format and quote_style, fill the strbuf */
-void format_ref_array_item(struct ref_array_item *info,
+/*
+ * Based on the given format and quote_style, fill the strbuf.
+ * Return 0 if everything was successful, -1 otherwise (and strbuf remains empty)
+ */
+int format_ref_array_item(struct ref_array_item *info,
 			   const struct ref_format *format,
 			   struct strbuf *final_buf);
-/*  Print the ref using the given format and quote_style */
-void show_ref_array_item(struct ref_array_item *info, const struct ref_format *format);
+/*
+ * Print the ref using the given format and quote_style.
+ * Return 0 if everything was successful, -1 otherwise.
+ */
+int show_ref_array_item(struct ref_array_item *info, const struct ref_format *format);
 /*  Parse a single sort specifier and add it to the list */
 void parse_ref_sorting(struct ref_sorting **sorting_tail, const char *atom);
 /*  Callback function for parsing the sort option */

--
https://github.com/git/git/pull/452
Previous: Olga TelezhnayaNext: Olga Telezhnaya
Message 16 of 26 in “ref-filter: get rid of goto”
  1. 01/25 ref-filter: get rid of gotoOlga Telezhnaya, Feb 5, 2018
  2. 08/25 ref-filter: reuse parse_ref_filter_atom()Olga Telezhnaya, Feb 5, 2018
  3. 05/25 cat-file: move struct expand_data into ref-filterOlga Telezhnaya, Feb 5, 2018
  4. 22/25 ref-filter: work with objectsize:diskOlga Telezhnaya, Feb 5, 2018
  5. 13/25 ref-filter: get rid of mark_atom_in_object_info()Olga Telezhnaya, Feb 5, 2018
  6. 06/25 cat-file: split expand_atom() into 2 functionsOlga Telezhnaya, Feb 5, 2018
  7. 16/25 cat-file: move skip_object_info into ref-filterOlga Telezhnaya, Feb 5, 2018
  8. 11/25 ref-filter: rename field in ref_array_item stuctOlga Telezhnaya, Feb 5, 2018
  9. 04/25 ref-filter: make valid_atom as function parameterOlga Telezhnaya, Feb 5, 2018
  10. 03/25 cat-file: reuse struct ref_formatOlga Telezhnaya, Feb 5, 2018
  11. 25/25 cat-file: update of docsOlga Telezhnaya, Feb 5, 2018
  12. 24/25 cat-file: tests for new atoms addedOlga Telezhnaya, Feb 5, 2018
  13. 15/25 ref_filter: add is_atom_used functionOlga Telezhnaya, Feb 5, 2018
  14. 10/25 ref-filter: make populate_value() globalOlga Telezhnaya, Feb 5, 2018
  15. 18/25 ref-filter: make valid_atom general againOlga Telezhnaya, Feb 5, 2018
  16. 02/25 ref-filter: add return value to some functionsOlga Telezhnaya, Feb 5, 2018
  17. 20/25 ref-filter: make populate_value() internal againOlga Telezhnaya, Feb 5, 2018
  18. 19/25 cat-file: reuse printing logic from ref-filterOlga Telezhnaya, Feb 5, 2018
  19. 12/25 cat-file: start reusing populate_value()Olga Telezhnaya, Feb 5, 2018
  20. 14/25 ref-filter: add is_cat flagOlga Telezhnaya, Feb 5, 2018
  21. Junio C HamanoFeb 5, 2018
  22. 21/25 ref-filter: unifying formatting of cat-file optsOlga Telezhnaya, Feb 5, 2018
  23. 09/25 cat-file: start use ref_array_item structOlga Telezhnaya, Feb 5, 2018
  24. 17/25 ref-filter: make cat_file_info independentOlga Telezhnaya, Feb 5, 2018
  25. 23/25 for-each-ref: tests for new atoms addedOlga Telezhnaya, Feb 5, 2018
  26. 07/25 cat-file: start migrating formatting to ref-filterOlga Telezhnaya, Feb 5, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.