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

[PATCH 7/7] tag: don't misreport type of tagged objects in errors

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Mar 8, 2021, 20:04 UTC
Message-ID
<20210308200426.21824-8-avarab@gmail.com>
In-Reply-To
<Pine.LNX.4.21.0506212033590.30848-100000@iabervon.org>

Fix a regression in 89e4202f982 ([PATCH] Parse tags for absent objects, 2005-06-21) (yes, that ancient!) and correctly report an error on a tag like:

    object <a tree hash>
    type commit
As:
    error: object <a tree hash> is tree, not a commit

Instead of our long-standing misbehavior of inverting the two, and reporting:

    error: object <a tree hash> is commit, not a tree

Which, as can be trivially seen with 'git cat-file -t <a tree hash>' is incorrect.

The reason for this misreporting is that in parse_tag_buffer() we end up doing a lookup_{blob,commit,tag,tree}() depending on what we read out of the "type" line.

If we haven't parsed that object before we end up dispatching to the type-specific lookup functions, e.g. this for commit.c in lookup_commit_type():

	struct object *obj = lookup_object(r, oid);
	if (!obj)
		return create_object(r, oid, alloc_commit_node(r));

Its allocation will then set the obj->type according to what the tag told us the type was, but which we've never validated. At this point we've got an object in memory that hasn't been parsed, and whose type is incorrect, since we mistrusted a tag to tell us the type.

Then when we actually load the object with parse_object() we read it and find that it's a "tree". See 8ff226a9d5e (add object_as_type helper for casting objects, 2014-07-13) for that behavior (that's just a refactoring commit, but shows all the code involved).

Which explains why we inverted the error report. Normally when object_as_type() is called it's by the lookup_{blob,commit,tag,tree}() functions via parse_object(). At that point we can trust the obj->type.

In the case of parsing objects we've learned about via a tag with an incorrect type it's the opposite, the obj->type isn't correct and holds the mislabeled type, but we're parsing the object and know for sure what object type we're dealing with.

Hence the non-intuitive solution of adding a lookup_{blob,commit,tag,tree}_type() function. It's to distinguish parse_object_buffer() where we actually know the type from parse_tag_buffer() where we're just guessing about the type.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 blob.c                                 | 16 +++++++++++++++-
 blob.h                                 |  3 +++
 commit.c                               | 14 +++++++++++++-
 commit.h                               |  2 ++
 object.c                               |  8 ++++----
 t/t6102-rev-list-unexpected-objects.sh | 16 ++++++++--------
 tag.c                                  | 14 +++++++++++++-
 tag.h                                  |  2 ++
 tree.c                                 | 14 +++++++++++++-
 tree.h                                 |  2 ++
 10 files changed, 75 insertions(+), 16 deletions(-)
diff --git a/blob.c b/blob.c
index 182718aba9f..b233e0daa2f 100644
--- a/blob.c
+++ b/blob.c
@@ -2,17 +2,31 @@
 #include "blob.h"
 #include "repository.h"
 #include "alloc.h"
+#include "object-store.h"
 
 const char *blob_type = "blob";
 
-struct blob *lookup_blob(struct repository *r, const struct object_id *oid)
+struct blob *lookup_blob_type(struct repository *r,
+			      const struct object_id *oid,
+			      enum object_type type)
 {
 	struct object *obj = lookup_object(r, oid);
 	if (!obj)
 		return create_object(r, oid, alloc_blob_node(r));
+	if (type != OBJ_NONE &&
+	    obj->type != OBJ_NONE) {
+		enum object_type want = OBJ_BLOB;
+		if (oid_is_type_or_error(oid, obj->type, &want))
+			return NULL;
+	}
 	return object_as_type(obj, OBJ_BLOB, 0);
 }
 
+struct blob *lookup_blob(struct repository *r, const struct object_id *oid)
+{
+	return lookup_blob_type(r, oid, OBJ_NONE);
+}
+
 int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size)
 {
 	item->object.parsed = 1;
diff --git a/blob.h b/blob.h
index 16648720557..066a2effcbf 100644
--- a/blob.h
+++ b/blob.h
@@ -10,6 +10,9 @@ struct blob {
 };
 
 struct blob *lookup_blob(struct repository *r, const struct object_id *oid);
+struct blob *lookup_blob_type(struct repository *r,
+			      const struct object_id *oid,
+			      enum object_type type);
 
 int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size);
 
diff --git a/commit.c b/commit.c
index 54627b546c3..30cc990d003 100644
--- a/commit.c
+++ b/commit.c
@@ -57,14 +57,26 @@ struct commit *lookup_commit_or_die(const struct object_id *oid, const char *ref
 	return c;
 }
 
-struct commit *lookup_commit(struct repository *r, const struct object_id *oid)
+struct commit *lookup_commit_type(struct repository *r, const struct object_id *oid,
+				  enum object_type type)
 {
 	struct object *obj = lookup_object(r, oid);
 	if (!obj)
 		return create_object(r, oid, alloc_commit_node(r));
+	if (type != OBJ_NONE &&
+	    obj->type != OBJ_NONE) {
+		enum object_type want = OBJ_COMMIT;
+		if (oid_is_type_or_error(oid, obj->type, &want))
+			return NULL;
+	}
 	return object_as_type(obj, OBJ_COMMIT, 0);
 }
 
+struct commit *lookup_commit(struct repository *r, const struct object_id *oid)
+{
+	return lookup_commit_type(r, oid, OBJ_NONE);
+}
+
 struct commit *lookup_commit_reference_by_name(const char *name)
 {
 	struct object_id oid;
diff --git a/commit.h b/commit.h
index 49c0f503964..9b92f661836 100644
--- a/commit.h
+++ b/commit.h
@@ -64,6 +64,8 @@ void add_name_decoration(enum decoration_type type, const char *name, struct obj
 const struct name_decoration *get_name_decoration(const struct object *obj);
 
 struct commit *lookup_commit(struct repository *r, const struct object_id *oid);
+struct commit *lookup_commit_type(struct repository *r, const struct object_id *oid,
+				  enum object_type type);
 struct commit *lookup_commit_reference(struct repository *r,
 				       const struct object_id *oid);
 struct commit *lookup_commit_reference_gently(struct repository *r,
diff --git a/object.c b/object.c
index 819ee0faa26..1a45b149e08 100644
--- a/object.c
+++ b/object.c
@@ -227,14 +227,14 @@ struct object *parse_object_buffer(struct repository *r, const struct object_id
 
 	obj = NULL;
 	if (type == OBJ_BLOB) {
-		struct blob *blob = lookup_blob(r, oid);
+		struct blob *blob = lookup_blob_type(r, oid, type);
 		if (blob) {
 			if (parse_blob_buffer(blob, buffer, size))
 				return NULL;
 			obj = &blob->object;
 		}
 	} else if (type == OBJ_TREE) {
-		struct tree *tree = lookup_tree(r, oid);
+		struct tree *tree = lookup_tree_type(r, oid, type);
 		if (tree) {
 			obj = &tree->object;
 			if (!tree->buffer)
@@ -246,7 +246,7 @@ struct object *parse_object_buffer(struct repository *r, const struct object_id
 			}
 		}
 	} else if (type == OBJ_COMMIT) {
-		struct commit *commit = lookup_commit(r, oid);
+		struct commit *commit = lookup_commit_type(r, oid, type);
 		if (commit) {
 			if (parse_commit_buffer(r, commit, buffer, size, 1))
 				return NULL;
@@ -257,7 +257,7 @@ struct object *parse_object_buffer(struct repository *r, const struct object_id
 			obj = &commit->object;
 		}
 	} else if (type == OBJ_TAG) {
-		struct tag *tag = lookup_tag(r, oid);
+		struct tag *tag = lookup_tag_type(r, oid, type);
 		if (tag) {
 			if (parse_tag_buffer(r, tag, buffer, size))
 			       return NULL;
diff --git a/t/t6102-rev-list-unexpected-objects.sh b/t/t6102-rev-list-unexpected-objects.sh
index 2ea1982b9ed..4a6b3cc3b01 100755
--- a/t/t6102-rev-list-unexpected-objects.sh
+++ b/t/t6102-rev-list-unexpected-objects.sh
@@ -156,14 +156,14 @@ test_expect_success 'setup unexpected non-tag tag' '
 test_expect_success 'traverse unexpected incorrectly typed tag (to commit & tag)' '
 	test_must_fail git rev-list --objects $tag_tag_commit 2>err &&
 	cat >expected <<-EOF &&
-	error: object $commit is a tag, not a commit
+	error: object $commit is a commit, not a tag
 	fatal: bad object $commit
 	EOF
 	test_cmp expected err &&
 
 	test_must_fail git rev-list --objects $commit_tag_tag 2>err &&
 	cat >expected <<-EOF &&
-	error: object $tag_commit is a commit, not a tag
+	error: object $tag_commit is a tag, not a commit
 	fatal: bad object $tag_commit
 	EOF
 	test_cmp expected err
@@ -172,14 +172,14 @@ test_expect_success 'traverse unexpected incorrectly typed tag (to commit & tag)
 test_expect_success 'traverse unexpected incorrectly typed tag (to tree)' '
 	test_must_fail git rev-list --objects $tag_tag_tree 2>err &&
 	cat >expected <<-EOF &&
-	error: object $tree is a tag, not a tree
+	error: object $tree is a tree, not a tag
 	fatal: bad object $tree
 	EOF
 	test_cmp expected err &&
 
 	test_must_fail git rev-list --objects $commit_tag_tree 2>err &&
 	cat >expected <<-EOF &&
-	error: object $tree is a commit, not a tree
+	error: object $tree is a tree, not a commit
 	fatal: bad object $tree
 	EOF
 	test_cmp expected err
@@ -188,14 +188,14 @@ test_expect_success 'traverse unexpected incorrectly typed tag (to tree)' '
 test_expect_success 'traverse unexpected incorrectly typed tag (to blob)' '
 	test_must_fail git rev-list --objects $tag_tag_blob 2>err &&
 	cat >expected <<-EOF &&
-	error: object $blob is a tag, not a blob
+	error: object $blob is a blob, not a tag
 	fatal: bad object $blob
 	EOF
 	test_cmp expected err &&
 
 	test_must_fail git rev-list --objects $commit_tag_blob 2>err &&
 	cat >expected <<-EOF &&
-	error: object $blob is a commit, not a blob
+	error: object $blob is a blob, not a commit
 	fatal: bad object $blob
 	EOF
 	test_cmp expected err
@@ -204,14 +204,14 @@ test_expect_success 'traverse unexpected incorrectly typed tag (to blob)' '
 test_expect_success 'traverse unexpected non-tag tag (tree seen to blob)' '
 	test_must_fail git rev-list --objects $tree $commit_tag_blob 2>err &&
 	cat >expected <<-EOF &&
-	error: object $blob is a commit, not a blob
+	error: object $blob is a blob, not a commit
 	fatal: bad object $blob
 	EOF
 	test_cmp expected err &&
 
 	test_must_fail git rev-list --objects $tree $tag_tag_blob 2>err &&
 	cat >expected <<-EOF &&
-	error: object $blob is a tag, not a blob
+	error: object $blob is a blob, not a tag
 	fatal: bad object $blob
 	EOF
 	test_cmp expected err
diff --git a/tag.c b/tag.c
index 3e18a418414..0ef87897b29 100644
--- a/tag.c
+++ b/tag.c
@@ -99,14 +99,26 @@ struct object *deref_tag_noverify(struct object *o)
 	return o;
 }
 
-struct tag *lookup_tag(struct repository *r, const struct object_id *oid)
+struct tag *lookup_tag_type(struct repository *r, const struct object_id *oid,
+			    enum object_type type)
 {
 	struct object *obj = lookup_object(r, oid);
 	if (!obj)
 		return create_object(r, oid, alloc_tag_node(r));
+	if (type != OBJ_NONE &&
+	    obj->type != OBJ_NONE) {
+		enum object_type want = OBJ_TAG;
+		if (oid_is_type_or_error(oid, obj->type, &want))
+			return NULL;
+	}
 	return object_as_type(obj, OBJ_TAG, 0);
 }
 
+struct tag *lookup_tag(struct repository *r, const struct object_id *oid)
+{
+	return lookup_tag_type(r, oid, OBJ_NONE);
+}
+
 static timestamp_t parse_tag_date(const char *buf, const char *tail)
 {
 	const char *dateptr;
diff --git a/tag.h b/tag.h
index 3ce8e721924..42bd3e64011 100644
--- a/tag.h
+++ b/tag.h
@@ -12,6 +12,8 @@ struct tag {
 	timestamp_t date;
 };
 struct tag *lookup_tag(struct repository *r, const struct object_id *oid);
+struct tag *lookup_tag_type(struct repository *r, const struct object_id *oid,
+			    enum object_type type);
 int parse_tag_buffer(struct repository *r, struct tag *item, const void *data, unsigned long size);
 int parse_tag(struct tag *item);
 void release_tag_memory(struct tag *t);
diff --git a/tree.c b/tree.c
index d9b1c70b28a..895c66420e8 100644
--- a/tree.c
+++ b/tree.c
@@ -195,14 +195,26 @@ int read_tree(struct repository *r, struct tree *tree, int stage,
 	return 0;
 }
 
-struct tree *lookup_tree(struct repository *r, const struct object_id *oid)
+struct tree *lookup_tree_type(struct repository *r, const struct object_id *oid,
+			      enum object_type type)
 {
 	struct object *obj = lookup_object(r, oid);
 	if (!obj)
 		return create_object(r, oid, alloc_tree_node(r));
+	if (type != OBJ_NONE &&
+	    obj->type != OBJ_NONE) {
+		enum object_type want = OBJ_TREE;
+		if (oid_is_type_or_error(oid, obj->type, &want))
+			return NULL;
+	}
 	return object_as_type(obj, OBJ_TREE, 0);
 }
 
+struct tree *lookup_tree(struct repository *r, const struct object_id *oid)
+{
+	return lookup_tree_type(r, oid, OBJ_NONE);
+}
+
 int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size)
 {
 	if (item->object.parsed)
diff --git a/tree.h b/tree.h
index 3eb0484cbf2..49bd44f79b3 100644
--- a/tree.h
+++ b/tree.h
@@ -15,6 +15,8 @@ struct tree {
 extern const char *tree_type;
 
 struct tree *lookup_tree(struct repository *r, const struct object_id *oid);
+struct tree *lookup_tree_type(struct repository *r, const struct object_id *oid,
+			      enum object_type type);
 
 int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size);
 
-- 
2.31.0.rc1.210.g0f8085a843c
Previous: Jeff KingNext: Daniel Barkalow
Message 141 of 142 in “Pull objects of various types”
  1. 0/2 Pull objects of various typesDaniel Barkalow, Jun 22, 2005
  2. 1/2 Parse tags for absent objectsDaniel Barkalow, Jun 22, 2005
  3. 2/7 object.c: make type_from_string() return "enum object_type"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  4. Taylor BlauMar 8, 2021
  5. Junio C HamanoMar 8, 2021
  6. 0/7 improve reporting of unexpected objectsÆvar Arnfjörð Bjarmason, Mar 8, 2021
  7. 00/10 improve reporting of unexpected objectsÆvar Arnfjörð Bjarmason, Mar 28, 2021
  8. 03/10 object.c: make type_from_string() return "enum object_type"Ævar Arnfjörð Bjarmason, Mar 28, 2021
  9. 01/10 object.c: stop supporting len == -1 in type_from_string_gently()Ævar Arnfjörð Bjarmason, Mar 28, 2021
  10. Junio C HamanoMar 28, 2021
  11. Ævar Arnfjörð BjarmasonMar 28, 2021
  12. Junio C HamanoMar 28, 2021
  13. Felipe ContrerasApr 22, 2021
  14. 04/10 object-file.c: make oid_object_info() return "enum object_type"Ævar Arnfjörð Bjarmason, Mar 28, 2021
  15. 06/10 tree.c: fix misindentation in parse_tree_gently()Ævar Arnfjörð Bjarmason, Mar 28, 2021
  16. 05/10 object-name.c: make dependency on object_type order more obviousÆvar Arnfjörð Bjarmason, Mar 28, 2021
  17. 07/10 object.c: add a utility function for "expected type X, got Y"Ævar Arnfjörð Bjarmason, Mar 28, 2021
  18. 02/10 object.c: refactor type_from_string_gently()Ævar Arnfjörð Bjarmason, Mar 28, 2021
  19. 08/10 object.c: add and use oid_is_type_or_die_msg() functionÆvar Arnfjörð Bjarmason, Mar 28, 2021
  20. 10/10 tag: don't misreport type of tagged objects in errorsÆvar Arnfjörð Bjarmason, Mar 28, 2021
  21. Junio C HamanoMar 30, 2021
  22. Jeff KingMar 31, 2021
  23. Junio C HamanoMar 31, 2021
  24. Ævar Arnfjörð BjarmasonMar 31, 2021
  25. Jeff KingMar 31, 2021
  26. Ævar Arnfjörð BjarmasonMar 31, 2021
  27. Jeff KingApr 1, 2021
  28. ref-filter: fix NULL check for parse object failureJeff King, Apr 1, 2021
  29. 0/5 mktag tests & fix for-each-ref segfaultÆvar Arnfjörð Bjarmason, Apr 1, 2021
  30. 5/5 ref-filter: fix NULL check for parse object failureÆvar Arnfjörð Bjarmason, Apr 1, 2021
  31. Ramsay JonesApr 1, 2021
  32. 4/5 mktag tests: test for maybe segfaulting for-each-refÆvar Arnfjörð Bjarmason, Apr 1, 2021
  33. 2/5 mktag tests: invert --no-strict testÆvar Arnfjörð Bjarmason, Apr 1, 2021
  34. 1/5 mktag tests: parse out options in helperÆvar Arnfjörð Bjarmason, Apr 1, 2021
  35. 3/5 mktag tests: do fsck on failureÆvar Arnfjörð Bjarmason, Apr 1, 2021
  36. Junio C HamanoApr 1, 2021
  37. Ævar Arnfjörð BjarmasonApr 2, 2021
  38. Junio C HamanoApr 2, 2021
  39. Junio C HamanoApr 1, 2021
  40. Junio C HamanoMar 31, 2021
  41. Jeff KingMar 31, 2021
  42. 09/10 object tests: add test for unexpected objects in tagsÆvar Arnfjörð Bjarmason, Mar 28, 2021
  43. Jeff KingMar 28, 2021
  44. Ævar Arnfjörð BjarmasonMar 29, 2021
  45. Jeff KingMar 31, 2021
  46. 0/2 blob/object.c: trivial readability improvementsÆvar Arnfjörð Bjarmason, Apr 9, 2021
  47. 1/2 blob.c: remove buffer & size arguments to parse_blob_buffer()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  48. Jeff KingApr 9, 2021
  49. Junio C HamanoApr 9, 2021
  50. Ævar Arnfjörð BjarmasonApr 10, 2021
  51. Ævar Arnfjörð BjarmasonApr 10, 2021
  52. Jeff KingApr 13, 2021
  53. 2/2 object.c: initialize automatic variable in lookup_object()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  54. Jeff KingApr 9, 2021
  55. Junio C HamanoApr 9, 2021
  56. 0/6 {tag,object}*.c: refactorings + prep for a larger changeÆvar Arnfjörð Bjarmason, Apr 9, 2021
  57. 1/6 object.c: stop supporting len == -1 in type_from_string_gently()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  58. Jeff KingApr 9, 2021
  59. Jeff KingApr 9, 2021
  60. 3/6 object.c: make type_from_string() return "enum object_type"Ævar Arnfjörð Bjarmason, Apr 9, 2021
  61. Jeff KingApr 9, 2021
  62. Ævar Arnfjörð BjarmasonApr 9, 2021
  63. Jeff KingApr 9, 2021
  64. 2/6 object.c: remove "gently" argument to type_from_string_gently()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  65. Jeff KingApr 9, 2021
  66. 4/6 object-file.c: make oid_object_info() return "enum object_type"Ævar Arnfjörð Bjarmason, Apr 9, 2021
  67. Jeff KingApr 9, 2021
  68. 6/6 tag.c: use type_from_string_gently() when parsing tagsÆvar Arnfjörð Bjarmason, Apr 9, 2021
  69. Jeff KingApr 9, 2021
  70. 5/6 object-name.c: make dependency on object_type order more obviousÆvar Arnfjörð Bjarmason, Apr 9, 2021
  71. Jeff KingApr 9, 2021
  72. 0/7 object.c: add and use "is expected" utility function + object_as_type() useÆvar Arnfjörð Bjarmason, Apr 9, 2021
  73. 2/7 object.c: add a utility function for "expected type X, got Y"Ævar Arnfjörð Bjarmason, Apr 9, 2021
  74. 1/7 tree.c: fix misindentation in parse_tree_gently()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  75. 3/7 object.c: add and use oid_is_type_or_die_msg() functionÆvar Arnfjörð Bjarmason, Apr 9, 2021
  76. 4/7 commit-graph: use obj->type, not object_as_type()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  77. 5/7 commit.c: don't use deref_tag() -> object_as_type()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  78. 6/7 object.c: normalize brace style in object_as_type()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  79. 7/7 object.c: remove "quiet" parameter from object_as_type()Ævar Arnfjörð Bjarmason, Apr 9, 2021
  80. 0/8 object.c: add and use "is expected" utility function + object_as_type() useÆvar Arnfjörð Bjarmason, Apr 20, 2021
  81. 1/8 tree.c: fix misindentation in parse_tree_gently()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  82. 2/8 object.c: add a utility function for "expected type X, got Y"Ævar Arnfjörð Bjarmason, Apr 20, 2021
  83. Jonathan TanApr 21, 2021
  84. Ævar Arnfjörð BjarmasonApr 22, 2021
  85. 3/8 object.c: add and use oid_is_type_or_die_msg() functionÆvar Arnfjörð Bjarmason, Apr 20, 2021
  86. Jonathan TanApr 21, 2021
  87. Josh SteadmonApr 21, 2021
  88. Junio C HamanoApr 28, 2021
  89. 4/8 commit-graph: use obj->type, not object_as_type()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  90. 5/8 branch tests: assert lookup_commit_reference_gently() errorÆvar Arnfjörð Bjarmason, Apr 20, 2021
  91. 6/8 commit.c: don't use deref_tag() -> object_as_type()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  92. Jonathan TanApr 21, 2021
  93. 7/8 object.c: normalize brace style in object_as_type()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  94. 8/8 object.c: remove "quiet" parameter from object_as_type()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  95. 00/10 {tag,object}*.c: refactorings + prep for a larger changeÆvar Arnfjörð Bjarmason, Apr 20, 2021
  96. 01/10 object.c: stop supporting len == -1 in type_from_string_gently()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  97. 02/10 object.c: remove "gently" argument to type_from_string_gently()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  98. 03/10 object.c: make type_from_string() return "enum object_type"Ævar Arnfjörð Bjarmason, Apr 20, 2021
  99. 04/10 object-file.c: make oid_object_info() return "enum object_type"Ævar Arnfjörð Bjarmason, Apr 20, 2021
  100. 05/10 object-name.c: make dependency on object_type order more obviousÆvar Arnfjörð Bjarmason, Apr 20, 2021
  101. 06/10 tag.c: use type_from_string_gently() when parsing tagsÆvar Arnfjörð Bjarmason, Apr 20, 2021
  102. 07/10 hash-object: pass along type length to object.cÆvar Arnfjörð Bjarmason, Apr 20, 2021
  103. 09/10 hash-object: show usage on invalid --typeÆvar Arnfjörð Bjarmason, Apr 20, 2021
  104. 08/10 hash-object: refactor nested else/if/if into else if/else ifÆvar Arnfjörð Bjarmason, Apr 20, 2021
  105. 10/10 object.c: move type_from_string() code to its last userÆvar Arnfjörð Bjarmason, Apr 20, 2021
  106. 00/10 object.c et al: tests, small bug fixes etc.Ævar Arnfjörð Bjarmason, Apr 20, 2021
  107. 01/10 cat-file tests: test for bogus type name handlingÆvar Arnfjörð Bjarmason, Apr 20, 2021
  108. Junio C HamanoApr 29, 2021
  109. 03/10 mktree tests: add test for invalid object typeÆvar Arnfjörð Bjarmason, Apr 20, 2021
  110. 04/10 object-file.c: take type id, not string, in read_object_with_reference()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  111. Junio C HamanoApr 29, 2021
  112. 05/10 {commit,tree,blob,tag}.c: add a create_{commit,tree,blob,tag}()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  113. Junio C HamanoApr 29, 2021
  114. Ævar Arnfjörð BjarmasonApr 29, 2021
  115. 02/10 hash-object tests: more detailed test for invalid typeÆvar Arnfjörð Bjarmason, Apr 20, 2021
  116. 06/10 blob.c: remove parse_blob_buffer()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  117. Junio C HamanoApr 29, 2021
  118. 08/10 object.c: don't go past "len" under die() in type_from_string_gently()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  119. Junio C HamanoApr 29, 2021
  120. 07/10 object.c: simplify return semantic of parse_object_buffer()Ævar Arnfjörð Bjarmason, Apr 20, 2021
  121. 09/10 mktree: stop setting *ntr++ to NILÆvar Arnfjörð Bjarmason, Apr 20, 2021
  122. Junio C HamanoApr 29, 2021
  123. 10/10 mktree: emit a more detailed error when the <type> is invalidÆvar Arnfjörð Bjarmason, Apr 20, 2021
  124. 3/7 oid_object_info(): return "enum object_type"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  125. Junio C HamanoMar 8, 2021
  126. Junio C HamanoMar 8, 2021
  127. Jeff KingMar 9, 2021
  128. 4/7 tree.c: fix misindentation in parse_tree_gently()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  129. 5/7 object.c: add a utility function for "expected type X, got Y"Ævar Arnfjörð Bjarmason, Mar 8, 2021
  130. Taylor BlauMar 8, 2021
  131. Junio C HamanoMar 8, 2021
  132. 1/7 object.c: refactor type_from_string_gently()Ævar Arnfjörð Bjarmason, Mar 8, 2021
  133. Taylor BlauMar 8, 2021
  134. Jeff KingMar 9, 2021
  135. 6/7 object tests: add test for unexpected objects in tagsÆvar Arnfjörð Bjarmason, Mar 8, 2021
  136. Jeff KingMar 9, 2021
  137. Ævar Arnfjörð BjarmasonMar 28, 2021
  138. Jeff KingMar 28, 2021
  139. Ævar Arnfjörð BjarmasonMar 28, 2021
  140. Jeff KingMar 29, 2021
  141. 7/7 tag: don't misreport type of tagged objects in errorsÆvar Arnfjörð Bjarmason, Mar 8, 2021
  142. 2/2 Pull misc objectsDaniel Barkalow, Jun 22, 2005

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.