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

[PATCH 10/26] update-ref.c: Extract a new function, parse_refname()

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Mar 10, 2014, 12:46 UTC
Message-ID
<1394455603-2968-11-git-send-email-mhagger@alum.mit.edu>
In-Reply-To
<1394455603-2968-1-git-send-email-mhagger@alum.mit.edu>

There is no reason to obscure the fact that parse_first_arg() always parses refnames. Form the new function by combining parse_first_arg() and update_store_ref_name().

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 builtin/update-ref.c | 90 ++++++++++++++++++++++++----------------------------
 1 file changed, 41 insertions(+), 49 deletions(-)
diff --git a/builtin/update-ref.c b/builtin/update-ref.c
index 51adf2d..0dc2061 100644
--- a/builtin/update-ref.c
+++ b/builtin/update-ref.c
@@ -35,14 +35,6 @@ static struct ref_update *update_alloc(void)
 	return update;
 }
 
-static void update_store_ref_name(struct ref_update *update,
-				  const char *ref_name)
-{
-	if (check_refname_format(ref_name, REFNAME_ALLOW_ONELEVEL))
-		die("invalid ref format: %s", ref_name);
-	update->ref_name = xstrdup(ref_name);
-}
-
 static void update_store_new_sha1(struct ref_update *update,
 				  const char *newvalue)
 {
@@ -86,23 +78,35 @@ static const char *parse_arg(const char *next, struct strbuf *arg)
 }
 
 /*
- * Parse the argument immediately after "command SP".  If not -z, then
- * handle C-quoting.  Write the argument to arg.  Set *next to point
- * at the character that terminates the argument.  Die if C-quoting is
- * malformed.
+ * Parse the reference name immediately after "command SP".  If not
+ * -z, then handle C-quoting.  Return a pointer to a newly allocated
+ * string containing the name of the reference, or NULL if there was
+ * an error.  Update *next to point at the character that terminates
+ * the argument.  Die if C-quoting is malformed or the reference name
+ * is invalid.
  */
-static void parse_first_arg(struct strbuf *input, const char **next,
-			    struct strbuf *arg)
+static char *parse_refname(struct strbuf *input, const char **next)
 {
-	strbuf_reset(arg);
+	struct strbuf ref = STRBUF_INIT;
+
 	if (line_termination) {
 		/* Without -z, use the next argument */
-		*next = parse_arg(*next, arg);
+		*next = parse_arg(*next, &ref);
 	} else {
 		/* With -z, use everything up to the next NUL */
-		strbuf_addstr(arg, *next);
-		*next += arg->len;
+		strbuf_addstr(&ref, *next);
+		*next += ref.len;
+	}
+
+	if (!ref.len) {
+		strbuf_release(&ref);
+		return NULL;
 	}
+
+	if (check_refname_format(ref.buf, REFNAME_ALLOW_ONELEVEL))
+		die("invalid ref format: %s", ref.buf);
+
+	return strbuf_detach(&ref, NULL);
 }
 
 /*
@@ -150,111 +154,99 @@ static int parse_next_arg(struct strbuf *input, const char **next,
 
 static const char *parse_cmd_update(struct strbuf *input, const char *next)
 {
-	struct strbuf ref = STRBUF_INIT;
 	struct strbuf newvalue = STRBUF_INIT;
 	struct strbuf oldvalue = STRBUF_INIT;
 	struct ref_update *update;
 
 	update = update_alloc();
 
-	parse_first_arg(input, &next, &ref);
-	if (ref.buf[0])
-		update_store_ref_name(update, ref.buf);
-	else
+	update->ref_name = parse_refname(input, &next);
+	if (!update->ref_name)
 		die("update line missing <ref>");
 
 	if (!parse_next_arg(input, &next, &newvalue))
 		update_store_new_sha1(update, newvalue.buf);
 	else
-		die("update %s missing <newvalue>", ref.buf);
+		die("update %s missing <newvalue>", update->ref_name);
 
 	if (!parse_next_arg(input, &next, &oldvalue)) {
 		update_store_old_sha1(update, oldvalue.buf);
 		if (*next != line_termination)
-			die("update %s has extra input: %s", ref.buf, next);
+			die("update %s has extra input: %s", update->ref_name, next);
 	} else if (!line_termination)
-		die("update %s missing [<oldvalue>] NUL", ref.buf);
+		die("update %s missing [<oldvalue>] NUL", update->ref_name);
 
 	return next;
 }
 
 static const char *parse_cmd_create(struct strbuf *input, const char *next)
 {
-	struct strbuf ref = STRBUF_INIT;
 	struct strbuf newvalue = STRBUF_INIT;
 	struct ref_update *update;
 
 	update = update_alloc();
 
-	parse_first_arg(input, &next, &ref);
-	if (ref.buf[0])
-		update_store_ref_name(update, ref.buf);
-	else
+	update->ref_name = parse_refname(input, &next);
+	if (!update->ref_name)
 		die("create line missing <ref>");
 
 	if (!parse_next_arg(input, &next, &newvalue))
 		update_store_new_sha1(update, newvalue.buf);
 	else
-		die("create %s missing <newvalue>", ref.buf);
+		die("create %s missing <newvalue>", update->ref_name);
 
 	if (is_null_sha1(update->new_sha1))
-		die("create %s given zero new value", ref.buf);
+		die("create %s given zero new value", update->ref_name);
 
 	if (*next != line_termination)
-		die("create %s has extra input: %s", ref.buf, next);
+		die("create %s has extra input: %s", update->ref_name, next);
 
 	return next;
 }
 
 static const char *parse_cmd_delete(struct strbuf *input, const char *next)
 {
-	struct strbuf ref = STRBUF_INIT;
 	struct strbuf oldvalue = STRBUF_INIT;
 	struct ref_update *update;
 
 	update = update_alloc();
 
-	parse_first_arg(input, &next, &ref);
-	if (ref.buf[0])
-		update_store_ref_name(update, ref.buf);
-	else
+	update->ref_name = parse_refname(input, &next);
+	if (!update->ref_name)
 		die("delete line missing <ref>");
 
 	if (!parse_next_arg(input, &next, &oldvalue)) {
 		update_store_old_sha1(update, oldvalue.buf);
 		if (update->have_old && is_null_sha1(update->old_sha1))
-			die("delete %s given zero old value", ref.buf);
+			die("delete %s given zero old value", update->ref_name);
 	} else if (!line_termination)
-		die("delete %s missing [<oldvalue>] NUL", ref.buf);
+		die("delete %s missing [<oldvalue>] NUL", update->ref_name);
 
 	if (*next != line_termination)
-		die("delete %s has extra input: %s", ref.buf, next);
+		die("delete %s has extra input: %s", update->ref_name, next);
 
 	return next;
 }
 
 static const char *parse_cmd_verify(struct strbuf *input, const char *next)
 {
-	struct strbuf ref = STRBUF_INIT;
 	struct strbuf value = STRBUF_INIT;
 	struct ref_update *update;
 
 	update = update_alloc();
 
-	parse_first_arg(input, &next, &ref);
-	if (ref.buf[0])
-		update_store_ref_name(update, ref.buf);
-	else
+	update->ref_name = parse_refname(input, &next);
+	if (!update->ref_name)
 		die("verify line missing <ref>");
 
 	if (!parse_next_arg(input, &next, &value)) {
 		update_store_old_sha1(update, value.buf);
 		hashcpy(update->new_sha1, update->old_sha1);
 	} else if (!line_termination)
-		die("verify %s missing [<oldvalue>] NUL", ref.buf);
+		die("verify %s missing [<oldvalue>] NUL", update->ref_name);
 
 	if (*next != line_termination)
-		die("verify %s has extra input: %s", ref.buf, next);
+		die("verify %s has extra input: %s", update->ref_name, next);
 
 	return next;
 }
-- 
1.9.0
Previous: Michael HaggertyNext: Michael Haggerty
Message 18 of 38 in “Clean up update-refs --stdin and implement ref_transaction”
  1. 00/26 Clean up update-refs --stdin and implement ref_transactionMichael Haggerty, Mar 10, 2014
  2. 01/26 t1400: Fix name and expected result of one testMichael Haggerty, Mar 10, 2014
  3. 02/26 t1400: Provide sensible input to the commandMichael Haggerty, Mar 10, 2014
  4. 03/26 t1400: Pass a legitimate <newvalue> to update commandMichael Haggerty, Mar 10, 2014
  5. Brad KingMar 10, 2014
  6. Michael HaggertyMar 10, 2014
  7. Brad KingMar 11, 2014
  8. Junio C HamanoMar 11, 2014
  9. Brad KingMar 11, 2014
  10. Michael HaggertyMar 20, 2014
  11. 04/26 parse_arg(): Really test that argument is properly terminatedMichael Haggerty, Mar 10, 2014
  12. 05/26 t1400: Add some more tests involving quoted argumentsMichael Haggerty, Mar 10, 2014
  13. Johan HerlandMar 10, 2014
  14. 06/26 refs.h: Rename the action_on_err constantsMichael Haggerty, Mar 10, 2014
  15. 07/26 update_refs(): Fix constnessMichael Haggerty, Mar 10, 2014
  16. 08/26 update-ref --stdin: Read the whole input at onceMichael Haggerty, Mar 10, 2014
  17. 09/26 parse_cmd_verify(): Copy old_sha1 instead of evaluating <oldvalue> twiceMichael Haggerty, Mar 10, 2014
  18. 10/26 update-ref.c: Extract a new function, parse_refname()Michael Haggerty, Mar 10, 2014
  19. 11/26 update-ref --stdin: Improve error messages for invalid valuesMichael Haggerty, Mar 10, 2014
  20. 12/26 update-ref --stdin: Make error messages more consistentMichael Haggerty, Mar 10, 2014
  21. 13/26 update-ref --stdin: Simplify error messages for missing oldvaluesMichael Haggerty, Mar 10, 2014
  22. Brad KingMar 10, 2014
  23. Brad KingMar 10, 2014
  24. 14/26 update-ref.c: Extract a new function, parse_next_sha1()Michael Haggerty, Mar 10, 2014
  25. 15/26 update-ref --stdin: Improve the error message for unexpected EOFMichael Haggerty, Mar 10, 2014
  26. 16/26 update-ref --stdin: Harmonize error messagesMichael Haggerty, Mar 10, 2014
  27. 17/26 refs: Add a concept of a reference transactionMichael Haggerty, Mar 10, 2014
  28. 18/26 update-ref --stdin: Reimplement using reference transactionsMichael Haggerty, Mar 10, 2014
  29. 19/26 refs: Remove API function update_refs()Michael Haggerty, Mar 10, 2014
  30. 20/26 struct ref_update: Rename field "ref_name" to "refname"Michael Haggerty, Mar 10, 2014
  31. 21/26 struct ref_update: Store refname as a FLEX_ARRAY.Michael Haggerty, Mar 10, 2014
  32. 22/26 commit_ref_transaction(): Introduce temporary variablesMichael Haggerty, Mar 10, 2014
  33. 23/26 struct ref_update: Add a lock memberMichael Haggerty, Mar 10, 2014
  34. 24/26 struct ref_update: Add type fieldMichael Haggerty, Mar 10, 2014
  35. 25/26 commit_ref_transaction(): Also free the ref_transactionMichael Haggerty, Mar 10, 2014
  36. 26/26 commit_ref_transaction(): Work with transaction->updates in placeMichael Haggerty, Mar 10, 2014
  37. Brad KingMar 10, 2014
  38. Michael HaggertyMar 10, 2014

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.