Browse Source

Teach update-index to read from ls-tree.

git-update-index --index-info can almost be usable to read from ls-tree
output to update the index (and not the working tree file) to HEAD commit,
but not quite.  It was designed to read from git-apply --index-info
output, and does not want " blob " in ls-tree output.  Accept that as well.

This lets us update "git-checkout <ent> <path>" that used to filter the
extra " blob " string out.  Noted by Luben.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 19 years ago
parent
commit
9c20a47067
  1. 1
      git-checkout.sh
  2. 13
      update-index.c

1
git-checkout.sh

@ -82,7 +82,6 @@ then @@ -82,7 +82,6 @@ then
# rescuing paths and is never meant to remove what
# is not in the named tree-ish.
git-ls-tree -r "$new" "$@" |
sed -ne 's/^\([0-7]*\) blob \(.*\)$/\1 \2/p' |
git-update-index --index-info || exit $?
fi
git-checkout-index -f -u -- "$@"

13
update-index.c

@ -338,7 +338,7 @@ static void read_index_info(int line_termination) @@ -338,7 +338,7 @@ static void read_index_info(int line_termination)
struct strbuf buf;
strbuf_init(&buf);
while (1) {
char *ptr;
char *ptr, *tab;
char *path_name;
unsigned char sha1[20];
unsigned int mode;
@ -348,12 +348,15 @@ static void read_index_info(int line_termination) @@ -348,12 +348,15 @@ static void read_index_info(int line_termination)
break;

mode = strtoul(buf.buf, &ptr, 8);
if (ptr == buf.buf || *ptr != ' ' ||
get_sha1_hex(ptr + 1, sha1) ||
ptr[41] != '\t')
if (ptr == buf.buf || *ptr != ' ')
goto bad_line;

ptr += 42;
tab = strchr(ptr, '\t');
if (!tab || tab - ptr < 41)
goto bad_line;
if (get_sha1_hex(tab - 40, sha1) || tab[-41] != ' ')
goto bad_line;
ptr = tab + 1;

if (line_termination && ptr[0] == '"')
path_name = unquote_c_style(ptr, NULL);

Loading…
Cancel
Save