Skip to content

Commit

Permalink
apply --index-info: fall back to current index for mode changes
Browse files Browse the repository at this point in the history
"git diff" does not record index lines for pure mode changes (i.e. no
lines changed).  Therefore, apply --index-info would call out a bogus
error.

Instead, fall back to reading the info from the current index.

Incidentally, this fixes an error where git-rebase would not rebase a
commit including a pure mode change, and changes requiring a threeway
merge.

Noticed and later tested by Chris Shoemaker.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
dscho authored and gitster committed Sep 17, 2007
1 parent f3caeb9 commit ece7b74
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
26 changes: 24 additions & 2 deletions builtin-apply.c
Expand Up @@ -2227,6 +2227,20 @@ static int check_patch_list(struct patch *patch)
return err;
}

/* This function tries to read the sha1 from the current index */
static int get_current_sha1(const char *path, unsigned char *sha1)
{
int pos;

if (read_cache() < 0)
return -1;
pos = cache_name_pos(path, strlen(path));
if (pos < 0)
return -1;
hashcpy(sha1, active_cache[pos]->sha1);
return 0;
}

static void show_index_list(struct patch *list)
{
struct patch *patch;
Expand All @@ -2243,8 +2257,16 @@ static void show_index_list(struct patch *list)
if (0 < patch->is_new)
sha1_ptr = null_sha1;
else if (get_sha1(patch->old_sha1_prefix, sha1))
die("sha1 information is lacking or useless (%s).",
name);
/* git diff has no index line for mode/type changes */
if (!patch->lines_added && !patch->lines_deleted) {
if (get_current_sha1(patch->new_name, sha1) ||
get_current_sha1(patch->old_name, sha1))
die("mode change for %s, which is not "
"in current HEAD", name);
sha1_ptr = sha1;
} else
die("sha1 information is lacking or useless "
"(%s).", name);
else
sha1_ptr = sha1;

Expand Down
15 changes: 15 additions & 0 deletions t/t3400-rebase.sh
Expand Up @@ -68,4 +68,19 @@ test_expect_success \
test 3 = $(git rev-list master.. | wc -l)
'

test_expect_success 'rebase a single mode change' '
git checkout master &&
echo 1 > X &&
git add X &&
test_tick &&
git commit -m prepare &&
git checkout -b modechange HEAD^ &&
echo 1 > X &&
git add X &&
chmod a+x A &&
test_tick &&
git commit -m modechange A X &&
GIT_TRACE=1 git rebase master
'

test_done

0 comments on commit ece7b74

Please sign in to comment.