Skip to content

Commit

Permalink
Merge branch 'jc/maint-reset-remove-unmerged-new'
Browse files Browse the repository at this point in the history
* jc/maint-reset-remove-unmerged-new:
  reset --hard/read-tree --reset -u: remove unmerged new paths
  • Loading branch information
Junio C Hamano committed Oct 21, 2008
2 parents 20341dd + d1a43f2 commit 500ac7f
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 13 deletions.
31 changes: 18 additions & 13 deletions read-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -1489,25 +1489,30 @@ int write_index(const struct index_state *istate, int newfd)
int read_index_unmerged(struct index_state *istate)
{
int i;
struct cache_entry **dst;
struct cache_entry *last = NULL;
int unmerged = 0;

read_index(istate);
dst = istate->cache;
for (i = 0; i < istate->cache_nr; i++) {
struct cache_entry *ce = istate->cache[i];
if (ce_stage(ce)) {
remove_name_hash(ce);
if (last && !strcmp(ce->name, last->name))
continue;
cache_tree_invalidate_path(istate->cache_tree, ce->name);
last = ce;
struct cache_entry *new_ce;
int size, len;

if (!ce_stage(ce))
continue;
}
*dst++ = ce;
unmerged = 1;
len = strlen(ce->name);
size = cache_entry_size(len);
new_ce = xcalloc(1, size);
hashcpy(new_ce->sha1, ce->sha1);
memcpy(new_ce->name, ce->name, len);
new_ce->ce_flags = create_ce_flags(len, 0);
new_ce->ce_mode = ce->ce_mode;
if (add_index_entry(istate, new_ce, 0))
return error("%s: cannot drop to stage #0",
ce->name);
i = index_name_pos(istate, new_ce->name, len);
}
istate->cache_nr = dst - istate->cache;
return !!last;
return unmerged;
}

struct update_callback_data
Expand Down
60 changes: 60 additions & 0 deletions t/t1005-read-tree-reset.sh
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,64 @@ test_expect_success 'reset should work' '
test_cmp expect actual
'

test_expect_success 'reset should remove remnants from a failed merge' '
git read-tree --reset -u HEAD &&
git ls-files -s >expect &&
sha1=$(git rev-parse :new) &&
(
echo "100644 $sha1 1 old"
echo "100644 $sha1 3 old"
) | git update-index --index-info &&
>old &&
git ls-files -s &&
git read-tree --reset -u HEAD &&
git ls-files -s >actual &&
! test -f old
'

test_expect_success 'Porcelain reset should remove remnants too' '
git read-tree --reset -u HEAD &&
git ls-files -s >expect &&
sha1=$(git rev-parse :new) &&
(
echo "100644 $sha1 1 old"
echo "100644 $sha1 3 old"
) | git update-index --index-info &&
>old &&
git ls-files -s &&
git reset --hard &&
git ls-files -s >actual &&
! test -f old
'

test_expect_success 'Porcelain checkout -f should remove remnants too' '
git read-tree --reset -u HEAD &&
git ls-files -s >expect &&
sha1=$(git rev-parse :new) &&
(
echo "100644 $sha1 1 old"
echo "100644 $sha1 3 old"
) | git update-index --index-info &&
>old &&
git ls-files -s &&
git checkout -f &&
git ls-files -s >actual &&
! test -f old
'

test_expect_success 'Porcelain checkout -f HEAD should remove remnants too' '
git read-tree --reset -u HEAD &&
git ls-files -s >expect &&
sha1=$(git rev-parse :new) &&
(
echo "100644 $sha1 1 old"
echo "100644 $sha1 3 old"
) | git update-index --index-info &&
>old &&
git ls-files -s &&
git checkout -f HEAD &&
git ls-files -s >actual &&
! test -f old
'

test_done

0 comments on commit 500ac7f

Please sign in to comment.