@@ -510,7 +510,8 @@ static void update_one(const char *path)
report("add '%s'", path);
}
-static int apply_index_info(unsigned int mode, struct object_id *oid, int stage,
+static int apply_index_info(unsigned int mode, struct object_id *oid,
+ enum object_type obj_type UNUSED, int stage,
const char *path_name, void *cbdata UNUSED)
{
if (!verify_path(path_name, mode)) {
@@ -18,6 +18,7 @@ int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata,
char *ptr, *tab;
char *path_name;
struct object_id oid;
+ enum object_type obj_type = OBJ_ANY;
unsigned int mode;
unsigned long ul;
int stage;
@@ -51,18 +52,17 @@ int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata,
if (tab[-2] == ' ' && '0' <= tab[-1] && tab[-1] <= '3') {
stage = tab[-1] - '0';
- ptr = tab + 1; /* point at the head of path */
+ path_name = tab + 1; /* point at the head of path */
tab = tab - 2; /* point at tail of sha1 */
} else {
stage = 0;
- ptr = tab + 1; /* point at the head of path */
+ path_name = tab + 1; /* point at the head of path */
}
if (get_oid_hex(tab - hexsz, &oid) ||
tab[-(hexsz + 1)] != ' ')
goto bad_line;
- path_name = ptr;
if (!nul_term_line && path_name[0] == '"') {
strbuf_reset(&uq);
if (unquote_c_style(&uq, path_name, NULL)) {
@@ -72,7 +72,15 @@ int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata,
path_name = uq.buf;
}
- ret = fn(mode, &oid, stage, path_name, cbdata);
+ /* Get the type, if provided */
+ if (tab - hexsz - 1 > ptr + 1) {
+ if (*(tab - hexsz - 1) != ' ')
+ goto bad_line;
+ *(tab - hexsz - 1) = '\0';
+ obj_type = type_from_string(ptr + 1);
+ }
+
+ ret = fn(mode, &oid, obj_type, stage, path_name, cbdata);
if (ret) {
ret = -1;
break;
@@ -2,8 +2,9 @@
#define INDEX_INFO_H
#include "hash.h"
+#include "object.h"
-typedef int (*each_index_info_fn)(unsigned int, struct object_id *, int, const char *, void *);
+typedef int (*each_index_info_fn)(unsigned int, struct object_id *, enum object_type, int, const char *, void *);
#define INDEX_INFO_UNRECOGNIZED_LINE 1
@@ -153,6 +153,11 @@ test_expect_success '--index-info fails on malformed input' '
test_must_fail git update-index --index-info 2>err &&
test_grep "malformed input line" err &&
+ # invalid type
+ printf "100644 bad $EMPTY_BLOB\tA" |
+ test_must_fail git update-index --index-info 2>err &&
+ test_grep "invalid object type" err &&
+
# invalid stage value
printf "100644 $EMPTY_BLOB 5\tA" |
test_must_fail git update-index --index-info 2>err &&