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

[PATCH v4 2/8] test-ref-store: parse symbolic flag constants

From
Han-Wen Nienhuys via GitGitGadget <gitgitgadget@gmail.com>
Date
Dec 7, 2021, 13:38 UTC
Message-ID
<865458bc0cb1c2abbc4c378f9e4e4317a05fa0b9.1638884300.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1147.v4.git.git.1638884300.gitgitgadget@gmail.com>
From: Han-Wen Nienhuys <hanwen@google.com>

This lets tests use REF_XXXX constants instead of hardcoded integers. The flag names should be separated by a ','.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
---
 t/helper/test-ref-store.c | 66 ++++++++++++++++++++++++++++++++++-----
 t/t1405-main-ref-store.sh |  3 +-
 2 files changed, 60 insertions(+), 9 deletions(-)
diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c
index b795a56eedf..abb0ba101ae 100644
--- a/t/helper/test-ref-store.c
+++ b/t/helper/test-ref-store.c
@@ -5,6 +5,48 @@
 #include "object-store.h"
 #include "repository.h"
 
+struct flag_definition {
+	const char *name;
+	uint64_t mask;
+};
+
+#define FLAG_DEF(x)     \
+	{               \
+#x, (x) \
+	}
+
+static unsigned int parse_flags(const char *str, struct flag_definition *defs)
+{
+	struct string_list masks = STRING_LIST_INIT_DUP;
+	int i = 0;
+	unsigned int result = 0;
+
+	if (!strcmp(str, "0"))
+		return 0;
+
+	string_list_split(&masks, str, ',', 64);
+	for (; i < masks.nr; i++) {
+		const char *name = masks.items[i].string;
+		struct flag_definition *def = defs;
+		int found = 0;
+		while (def->name) {
+			if (!strcmp(def->name, name)) {
+				result |= def->mask;
+				found = 1;
+				break;
+			}
+			def++;
+		}
+		if (!found)
+			die("unknown flag \"%s\"", name);
+	}
+
+	string_list_clear(&masks, 0);
+	return result;
+}
+
+static struct flag_definition empty_flags[] = { { NULL, 0 } };
+
 static const char *notnull(const char *arg, const char *name)
 {
 	if (!arg)
@@ -12,9 +54,10 @@ static const char *notnull(const char *arg, const char *name)
 	return arg;
 }
 
-static unsigned int arg_flags(const char *arg, const char *name)
+static unsigned int arg_flags(const char *arg, const char *name,
+			      struct flag_definition *defs)
 {
-	return atoi(notnull(arg, name));
+	return parse_flags(notnull(arg, name), defs);
 }
 
 static const char **get_store(const char **argv, struct ref_store **refs)
@@ -64,10 +107,13 @@ static const char **get_store(const char **argv, struct ref_store **refs)
 	return argv + 1;
 }
 
+static struct flag_definition pack_flags[] = { FLAG_DEF(PACK_REFS_PRUNE),
+					       FLAG_DEF(PACK_REFS_ALL),
+					       { NULL, 0 } };
 
 static int cmd_pack_refs(struct ref_store *refs, const char **argv)
 {
-	unsigned int flags = arg_flags(*argv++, "flags");
+	unsigned int flags = arg_flags(*argv++, "flags", pack_flags);
 
 	return refs_pack_refs(refs, flags);
 }
@@ -81,9 +127,15 @@ static int cmd_create_symref(struct ref_store *refs, const char **argv)
 	return refs_create_symref(refs, refname, target, logmsg);
 }
 
+static struct flag_definition transaction_flags[] = {
+	FLAG_DEF(REF_NO_DEREF),
+	FLAG_DEF(REF_FORCE_CREATE_REFLOG),
+	{ NULL, 0 }
+};
+
 static int cmd_delete_refs(struct ref_store *refs, const char **argv)
 {
-	unsigned int flags = arg_flags(*argv++, "flags");
+	unsigned int flags = arg_flags(*argv++, "flags", transaction_flags);
 	const char *msg = *argv++;
 	struct string_list refnames = STRING_LIST_INIT_NODUP;
 
@@ -120,7 +172,7 @@ static int cmd_resolve_ref(struct ref_store *refs, const char **argv)
 {
 	struct object_id oid = *null_oid();
 	const char *refname = notnull(*argv++, "refname");
-	int resolve_flags = arg_flags(*argv++, "resolve-flags");
+	int resolve_flags = arg_flags(*argv++, "resolve-flags", empty_flags);
 	int flags;
 	const char *ref;
 	int ignore_errno;
@@ -209,7 +261,7 @@ static int cmd_delete_ref(struct ref_store *refs, const char **argv)
 	const char *msg = notnull(*argv++, "msg");
 	const char *refname = notnull(*argv++, "refname");
 	const char *sha1_buf = notnull(*argv++, "old-sha1");
-	unsigned int flags = arg_flags(*argv++, "flags");
+	unsigned int flags = arg_flags(*argv++, "flags", transaction_flags);
 	struct object_id old_oid;
 
 	if (get_oid_hex(sha1_buf, &old_oid))
@@ -224,7 +276,7 @@ static int cmd_update_ref(struct ref_store *refs, const char **argv)
 	const char *refname = notnull(*argv++, "refname");
 	const char *new_sha1_buf = notnull(*argv++, "new-sha1");
 	const char *old_sha1_buf = notnull(*argv++, "old-sha1");
-	unsigned int flags = arg_flags(*argv++, "flags");
+	unsigned int flags = arg_flags(*argv++, "flags", transaction_flags);
 	struct object_id old_oid;
 	struct object_id new_oid;
 
diff --git a/t/t1405-main-ref-store.sh b/t/t1405-main-ref-store.sh
index 5e0f7073286..63e0ae82bdf 100755
--- a/t/t1405-main-ref-store.sh
+++ b/t/t1405-main-ref-store.sh
@@ -17,8 +17,7 @@ test_expect_success 'setup' '
 test_expect_success REFFILES 'pack_refs(PACK_REFS_ALL | PACK_REFS_PRUNE)' '
 	N=`find .git/refs -type f | wc -l` &&
 	test "$N" != 0 &&
-	ALL_OR_PRUNE_FLAG=3 &&
-	$RUN pack-refs ${ALL_OR_PRUNE_FLAG} &&
+	$RUN pack-refs PACK_REFS_PRUNE,PACK_REFS_ALL &&
 	N=`find .git/refs -type f` &&
 	test -z "$N"
 '
-- 
gitgitgadget
Previous: Han-Wen Nienhuys via GitGitGadgetNext: Han-Wen Nienhuys via GitGitGadget
Message 35 of 42 in “Allow writing invalid OIDs into refs for testing purposes”
  1. 0/2 Allow writing invalid OIDs into refs for testing purposesHan-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  2. 1/2 refs: update comment.Han-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  3. 2/2 refs: allow skipping OID verificationHan-Wen Nienhuys via GitGitGadget, Nov 25, 2021
  4. Junio C HamanoNov 26, 2021
  5. 0/6 Allow writing invalid OIDs into refs for testing purposesHan-Wen Nienhuys via GitGitGadget, Nov 29, 2021
  6. 4/6 refs: add REF_SKIP_REFNAME_VERIFICATION flagHan-Wen Nienhuys via GitGitGadget, Nov 29, 2021
  7. Junio C HamanoNov 29, 2021
  8. Junio C HamanoNov 29, 2021
  9. Han-Wen NienhuysNov 30, 2021
  10. Junio C HamanoDec 1, 2021
  11. Jeff KingDec 1, 2021
  12. Han-Wen NienhuysDec 2, 2021
  13. Junio C HamanoDec 2, 2021
  14. 6/6 t1430: create valid symrefs using test-helperHan-Wen Nienhuys via GitGitGadget, Nov 29, 2021
  15. 5/6 t1430: remove refs using test-toolHan-Wen Nienhuys via GitGitGadget, Nov 29, 2021
  16. 1/6 test-ref-store: plug memory leak in cmd_delete_refsHan-Wen Nienhuys via GitGitGadget, Nov 29, 2021
  17. Junio C HamanoNov 29, 2021
  18. 3/6 refs: allow skipping OID verificationHan-Wen Nienhuys via GitGitGadget, Nov 29, 2021
  19. Junio C HamanoNov 29, 2021
  20. 2/6 refs: update comment.Han-Wen Nienhuys via GitGitGadget, Nov 29, 2021
  21. Junio C HamanoNov 29, 2021
  22. Junio C HamanoNov 29, 2021
  23. 0/8 Allow writing invalid OIDs into refs for testing purposesHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  24. 1/8 test-ref-store: remove force-create argument for create-reflogHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  25. 2/8 test-ref-store: parse symbolic flag constantsHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  26. Jeff KingDec 3, 2021
  27. 3/8 test-ref-store: plug memory leak in cmd_delete_refsHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  28. 4/8 refs: update comment.Han-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  29. 5/8 refs: introduce REF_SKIP_OID_VERIFICATION flagHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  30. 6/8 refs: introduce REF_SKIP_REFNAME_VERIFICATION flagHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  31. 7/8 t1430: remove refs using test-toolHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  32. 8/8 t1430: create valid symrefs using test-helperHan-Wen Nienhuys via GitGitGadget, Dec 2, 2021
  33. 0/8 Allow writing invalid OIDs into refs for testing purposesHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  34. 1/8 test-ref-store: remove force-create argument for create-reflogHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  35. 2/8 test-ref-store: parse symbolic flag constantsHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  36. 3/8 test-ref-store: plug memory leak in cmd_delete_refsHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  37. 4/8 refs: update comment.Han-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  38. 5/8 refs: introduce REF_SKIP_OID_VERIFICATION flagHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  39. 6/8 refs: introduce REF_SKIP_REFNAME_VERIFICATION flagHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  40. 7/8 t1430: remove refs using test-toolHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  41. 8/8 t1430: create valid symrefs using test-helperHan-Wen Nienhuys via GitGitGadget, Dec 7, 2021
  42. Junio C HamanoDec 7, 2021

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.