summaryrefslogtreecommitdiff
path: root/read-cache.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-10-21 13:48:41 -0700
committerJunio C Hamano <gitster@pobox.com>2008-10-21 13:48:41 -0700
commit500ac7f42e7f2ae42e33be3bbb7120b788175b1d (patch)
treeae509ca36de687dd45d3a52532784f00b78daab0 /read-cache.c
parent20341dd970b331fd721225ca630548ec1e90d8a5 (diff)
parentd1a43f2aa4bfb5aef29e9e1fe1fb9bb18c0e8b65 (diff)
downloadgit-500ac7f42e7f2ae42e33be3bbb7120b788175b1d.tar.gz
Merge branch 'jc/maint-reset-remove-unmerged-new'
* jc/maint-reset-remove-unmerged-new: reset --hard/read-tree --reset -u: remove unmerged new paths
Diffstat (limited to 'read-cache.c')
-rw-r--r--read-cache.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/read-cache.c b/read-cache.c
index c229fd4d0d..8160022b25 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -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