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

[PATCH v5 20/25] sha1_name.c: add support for disambiguating other types

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 3, 2012, 21:37 UTC
Message-ID
<1341351435-31011-21-git-send-email-gitster@pobox.com>
In-Reply-To
<1341351435-31011-1-git-send-email-gitster@pobox.com>

This teaches the revision parser that in "$name:$path" (used for a blob object name), "$name" must be a tree-ish.

There are many more places where we know what types of objects are called for. This patch adds support for "commit", "treeish", "tree", and "blob", which could be used in the following contexts:

 - "git apply --build-fake-ancestor" reads the "index" lines from
   the patch; they must name blob objects (not even "blob-ish");
 - "git commit-tree" reads a tree object name (not "tree-ish"), and
   zero or more commit object names (not "committish");
 - "git reset $rev" wants a committish; "git reset $rev -- $path"
   wants a treeish.
They will come in later patches in the series.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 cache.h                             | 13 ++++++--
 sha1_name.c                         | 66 ++++++++++++++++++++++++++++++++++++-
 t/t1512-rev-parse-disambiguation.sh |  2 +-
 3 files changed, 76 insertions(+), 5 deletions(-)
diff --git a/cache.h b/cache.h
index e947b48..c8d6406 100644
--- a/cache.h
+++ b/cache.h
@@ -811,13 +811,20 @@ struct object_context {
 	unsigned mode;
 };
 
-#define GET_SHA1_QUIETLY 01
-#define GET_SHA1_COMMIT 02
-#define GET_SHA1_COMMITTISH 04
+#define GET_SHA1_QUIETLY        01
+#define GET_SHA1_COMMIT         02
+#define GET_SHA1_COMMITTISH     04
+#define GET_SHA1_TREE          010
+#define GET_SHA1_TREEISH       020
+#define GET_SHA1_BLOB	       040
 #define GET_SHA1_ONLY_TO_DIE 04000
 
 extern int get_sha1(const char *str, unsigned char *sha1);
+extern int get_sha1_commit(const char *str, unsigned char *sha1);
 extern int get_sha1_committish(const char *str, unsigned char *sha1);
+extern int get_sha1_tree(const char *str, unsigned char *sha1);
+extern int get_sha1_treeish(const char *str, unsigned char *sha1);
+extern int get_sha1_blob(const char *str, unsigned char *sha1);
 extern void maybe_die_on_misspelt_object_name(const char *name, const char *prefix);
 extern int get_sha1_with_context(const char *str, unsigned flags, unsigned char *sha1, struct object_context *orc);
 
diff --git a/sha1_name.c b/sha1_name.c
index 9e13d60..18fac92 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -242,6 +242,36 @@ static int disambiguate_committish_only(const unsigned char *sha1, void *cb_data
 	return 0;
 }
 
+static int disambiguate_tree_only(const unsigned char *sha1, void *cb_data_unused)
+{
+	int kind = sha1_object_info(sha1, NULL);
+	return kind == OBJ_TREE;
+}
+
+static int disambiguate_treeish_only(const unsigned char *sha1, void *cb_data_unused)
+{
+	struct object *obj;
+	int kind;
+
+	kind = sha1_object_info(sha1, NULL);
+	if (kind == OBJ_TREE || kind == OBJ_COMMIT)
+		return 1;
+	if (kind != OBJ_TAG)
+		return 0;
+
+	/* We need to do this the hard way... */
+	obj = deref_tag(lookup_object(sha1), NULL, 0);
+	if (obj && (obj->type == OBJ_TREE || obj->type == OBJ_COMMIT))
+		return 1;
+	return 0;
+}
+
+static int disambiguate_blob_only(const unsigned char *sha1, void *cb_data_unused)
+{
+	int kind = sha1_object_info(sha1, NULL);
+	return kind == OBJ_BLOB;
+}
+
 static int get_short_sha1(const char *name, int len, unsigned char *sha1,
 			  unsigned flags)
 {
@@ -281,6 +311,12 @@ static int get_short_sha1(const char *name, int len, unsigned char *sha1,
 		ds.fn = disambiguate_commit_only;
 	else if (flags & GET_SHA1_COMMITTISH)
 		ds.fn = disambiguate_committish_only;
+	else if (flags & GET_SHA1_TREE)
+		ds.fn = disambiguate_tree_only;
+	else if (flags & GET_SHA1_TREEISH)
+		ds.fn = disambiguate_treeish_only;
+	else if (flags & GET_SHA1_BLOB)
+		ds.fn = disambiguate_blob_only;
 
 	find_short_object_filename(len, hex_pfx, &ds);
 	find_short_packed_object(len, bin_pfx, &ds);
@@ -1016,6 +1052,34 @@ int get_sha1_committish(const char *name, unsigned char *sha1)
 				     sha1, &unused);
 }
 
+int get_sha1_treeish(const char *name, unsigned char *sha1)
+{
+	struct object_context unused;
+	return get_sha1_with_context(name, GET_SHA1_TREEISH,
+				     sha1, &unused);
+}
+
+int get_sha1_commit(const char *name, unsigned char *sha1)
+{
+	struct object_context unused;
+	return get_sha1_with_context(name, GET_SHA1_COMMIT,
+				     sha1, &unused);
+}
+
+int get_sha1_tree(const char *name, unsigned char *sha1)
+{
+	struct object_context unused;
+	return get_sha1_with_context(name, GET_SHA1_TREE,
+				     sha1, &unused);
+}
+
+int get_sha1_blob(const char *name, unsigned char *sha1)
+{
+	struct object_context unused;
+	return get_sha1_with_context(name, GET_SHA1_BLOB,
+				     sha1, &unused);
+}
+
 /* Must be called only when object_name:filename doesn't exist. */
 static void diagnose_invalid_sha1_path(const char *prefix,
 				       const char *filename,
@@ -1221,7 +1285,7 @@ static int get_sha1_with_context_1(const char *name,
 			strncpy(object_name, name, cp-name);
 			object_name[cp-name] = '\0';
 		}
-		if (!get_sha1_1(name, cp-name, tree_sha1, 0)) {
+		if (!get_sha1_1(name, cp-name, tree_sha1, GET_SHA1_TREEISH)) {
 			const char *filename = cp+1;
 			char *new_filename = NULL;
 
diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh
index 417b436..4851a5f 100755
--- a/t/t1512-rev-parse-disambiguation.sh
+++ b/t/t1512-rev-parse-disambiguation.sh
@@ -44,7 +44,7 @@ test_expect_success 'warn ambiguity when no candidate matches type hint' '
 	grep "short SHA1 11021982 is ambiguous" actual
 '
 
-test_expect_failure 'disambiguate tree-ish' '
+test_expect_success 'disambiguate tree-ish' '
 	# feed tree-ish in an unambiguous way
 	git rev-parse --verify 1102198206:bz01t33 &&
 
-- 
1.7.11.1.229.g706c98f
Previous: Junio C HamanoNext: Junio C Hamano
Message 21 of 26 in “Extending the shelf-life of "git describe" output”
  1. 00/25 Extending the shelf-life of "git describe" outputJunio C Hamano, Jul 3, 2012
  2. 01/25 sha1_name.c: indentation fixJunio C Hamano, Jul 3, 2012
  3. 02/25 sha1_name.c: hide get_sha1_with_context_1() uglinessJunio C Hamano, Jul 3, 2012
  4. 03/25 sha1_name.c: get rid of get_sha1_with_mode_1()Junio C Hamano, Jul 3, 2012
  5. 04/25 sha1_name.c: get rid of get_sha1_with_mode()Junio C Hamano, Jul 3, 2012
  6. 05/25 sha1_name.c: clarify what "fake" is for in find_short_object_filename()Junio C Hamano, Jul 3, 2012
  7. 06/25 sha1_name.c: rename "now" to "current"Junio C Hamano, Jul 3, 2012
  8. 07/25 sha1_name.c: refactor find_short_packed_object()Junio C Hamano, Jul 3, 2012
  9. 08/25 sha1_name.c: correct misnamed "canonical" and "res"Junio C Hamano, Jul 3, 2012
  10. 09/25 sha1_name.c: restructure disambiguation of short namesJunio C Hamano, Jul 3, 2012
  11. 10/25 get_sha1(): fix error status regressionJunio C Hamano, Jul 3, 2012
  12. 11/25 sha1_name.c: allow get_short_sha1() to take other flagsJunio C Hamano, Jul 3, 2012
  13. 12/25 sha1_name.c: teach get_short_sha1() a commit-only optionJunio C Hamano, Jul 3, 2012
  14. 13/25 sha1_name.c: get_describe_name() by definition groks only commitsJunio C Hamano, Jul 3, 2012
  15. 14/25 sha1_name.c: get_sha1_1() takes lookup flagsJunio C Hamano, Jul 3, 2012
  16. 15/25 sha1_name.c: many short names can only be committishJunio C Hamano, Jul 3, 2012
  17. 16/25 sha1_name.c: teach lookup context to get_sha1_with_context()Junio C Hamano, Jul 3, 2012
  18. 17/25 sha1_name.c: introduce get_sha1_committish()Junio C Hamano, Jul 3, 2012
  19. 18/25 revision.c: allow handle_revision_arg() to take other flagsJunio C Hamano, Jul 3, 2012
  20. 19/25 revision.c: the "log" family, except for "show", takes committishJunio C Hamano, Jul 3, 2012
  21. 20/25 sha1_name.c: add support for disambiguating other typesJunio C Hamano, Jul 3, 2012
  22. 21/25 apply: --build-fake-ancestor expects blobsJunio C Hamano, Jul 3, 2012
  23. 22/25 commit-tree: the command wants a tree and commitsJunio C Hamano, Jul 3, 2012
  24. 23/25 reset: the command takes committishJunio C Hamano, Jul 3, 2012
  25. 24/25 rev-parse: A and B in "rev-parse A..B" refer to committishJunio C Hamano, Jul 3, 2012
  26. 25/25 rev-parse --disambiguate=<prefix>Junio C Hamano, Jul 3, 2012

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.