@@ -217,8 +217,8 @@ static int mark_link(struct object *obj, int type, void *data, struct fsck_optio
if (!obj)
return -1;
- if (type != OBJ_ANY && obj->type != type)
- die(_("object type mismatch at %s"), oid_to_hex(&obj->oid));
+ if (type != OBJ_ANY)
+ oid_is_type_or_die(&obj->oid, obj->type, &type);
obj->flags |= FLAG_LINK;
return 0;
@@ -240,10 +240,7 @@ static unsigned check_object(struct object *obj)
if (type <= 0)
die(_("did not receive expected object %s"),
oid_to_hex(&obj->oid));
- if (type != obj->type)
- die(_("object %s: expected type %s, found %s"),
- oid_to_hex(&obj->oid),
- type_name(obj->type), type_name(type));
+ oid_is_type_or_die(&obj->oid, obj->type, &type);
obj->flags |= FLAG_CHECKED;
return 1;
}
@@ -333,8 +333,7 @@ static char *grab_blob(struct repository *r,
free_filespec(df);
} else {
blob = read_object_file(oid, &type, size);
- if (type != OBJ_BLOB)
- die("object '%s' is not a blob!", oid_to_hex(oid));
+ oid_is_type_or_die(oid, OBJ_BLOB, &type);
}
return blob;
}
@@ -299,9 +299,7 @@ const void *repo_get_commit_buffer(struct repository *r,
if (!ret)
die("cannot read commit object %s",
oid_to_hex(&commit->object.oid));
- if (type != OBJ_COMMIT)
- die("expected commit for %s, got %s",
- oid_to_hex(&commit->object.oid), type_name(type));
+ oid_is_type_or_die(&commit->object.oid, OBJ_COMMIT, &type);
if (sizep)
*sizep = size;
}
@@ -489,10 +487,10 @@ int repo_parse_commit_internal(struct repository *r,
return quiet_on_missing ? -1 :
error("Could not read %s",
oid_to_hex(&item->object.oid));
- if (type != OBJ_COMMIT) {
+ ret = oid_is_type_or_error(&item->object.oid, OBJ_COMMIT, &type);
+ if (ret) {
free(buffer);
- return error("Object %s not a commit",
- oid_to_hex(&item->object.oid));
+ return ret;
}
ret = parse_commit_buffer(r, item, buffer, size, 0);
@@ -2971,6 +2971,7 @@ static int read_oid_strbuf(struct merge_options *opt,
if (!buf)
return err(opt, _("cannot read object %s"), oid_to_hex(oid));
if (type != OBJ_BLOB) {
+ const char* msg = oid_is_type_or_die_msg(oid, OBJ_BLOB, &type);
free(buf);
return err(opt, _("object %s is not a blob"), oid_to_hex(oid));
}
@@ -159,6 +159,29 @@ void *create_object(struct repository *r, const struct object_id *oid, void *o)
return obj;
}
+static const char *object_type_mismatch_msg = N_("object %s is a %s, not a %s");
+
+void oid_is_type_or_die(const struct object_id *oid,
+ enum object_type want,
+ enum object_type *type)
+{
+ if (want == *type)
+ return;
+ die(_(object_type_mismatch_msg), oid_to_hex(oid),
+ type_name(*type), type_name(want));
+}
+
+int oid_is_type_or_error(const struct object_id *oid,
+ enum object_type want,
+ enum object_type *type)
+{
+ if (want == *type)
+ return 0;
+ return error(_(object_type_mismatch_msg),
+ oid_to_hex(oid), type_name(*type),
+ type_name(want));
+}
+
void *object_as_type(struct object *obj, enum object_type type, int quiet)
{
if (obj->type == type)
@@ -172,7 +195,7 @@ void *object_as_type(struct object *obj, enum object_type type, int quiet)
}
else {
if (!quiet)
- error(_("object %s is a %s, not a %s"),
+ error(_(object_type_mismatch_msg),
oid_to_hex(&obj->oid),
type_name(obj->type), type_name(type));
return NULL;
@@ -124,6 +124,11 @@ void *create_object(struct repository *r, const struct object_id *oid, void *obj
void *object_as_type(struct object *obj, enum object_type type, int quiet);
+void oid_is_type_or_die(const struct object_id *oid, enum object_type want,
+ enum object_type *type);
+int oid_is_type_or_error(const struct object_id *oid, enum object_type want,
+ enum object_type *type);
+
/*
* Returns the object, having parsed it to find out what it is.
*
@@ -219,6 +219,7 @@ int parse_tree_gently(struct tree *item, int quiet_on_missing)
enum object_type type;
void *buffer;
unsigned long size;
+ int ret;
if (item->object.parsed)
return 0;
@@ -227,10 +228,10 @@ int parse_tree_gently(struct tree *item, int quiet_on_missing)
return quiet_on_missing ? -1 :
error("Could not read %s",
oid_to_hex(&item->object.oid));
- if (type != OBJ_TREE) {
+ ret = oid_is_type_or_error(&item->object.oid, OBJ_TREE, &type);
+ if (ret) {
free(buffer);
- return error("Object %s not a tree",
- oid_to_hex(&item->object.oid));
+ return ret;
}
return parse_tree_buffer(item, buffer, size);
}
Refactor various "Object X is not Y" error messages so that they use the same message as the long-standing object_as_type() error message. Now we'll consistently report e.g. that we got a commit when we expected a tag, not just that the object is not a tag. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> --- builtin/index-pack.c | 9 +++------ combine-diff.c | 3 +-- commit.c | 10 ++++------ merge-recursive.c | 1 + object.c | 25 ++++++++++++++++++++++++- object.h | 5 +++++ tree.c | 7 ++++--- 7 files changed, 42 insertions(+), 18 deletions(-)