summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-06-03 08:49:31 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-06-04 06:57:41 (GMT)
commitb0d6e64629aeba96e837972c0fda5e61eebb7ab1 (patch)
tree757aeb64c42ad07018eceade7cfe4163645678ea
parentbf41bf2db71ac4bb03248bb0fe18cbb718af497a (diff)
downloadgit-b0d6e64629aeba96e837972c0fda5e61eebb7ab1.zip
git-b0d6e64629aeba96e837972c0fda5e61eebb7ab1.tar.gz
git-b0d6e64629aeba96e837972c0fda5e61eebb7ab1.tar.bz2
read-tree --reset: update working tree file for conflicted paths.
The earlier "git reset --hard" simplification stopped removing leftover working tree files from a failed automerge, when switching back to the HEAD version that does not have the paths. This patch, instead of removing the unmerged paths from the index, drops them down to stage#0 but marks them with mode=0 (the same "to be deleted" marker we internally use for paths deleted by the merge). one_way_merge() function and the functions it calls already know what to do with them -- if the tree we are reading has the path the working tree file is overwritten, and if it doesn't the working tree file is removed. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--builtin-read-tree.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/builtin-read-tree.c b/builtin-read-tree.c
index 716f792..21361df 100644
--- a/builtin-read-tree.c
+++ b/builtin-read-tree.c
@@ -751,25 +751,26 @@ static int oneway_merge(struct cache_entry **src)
static int read_cache_unmerged(void)
{
- int i, deleted;
+ int i;
struct cache_entry **dst;
+ struct cache_entry *last = NULL;
read_cache();
dst = active_cache;
- deleted = 0;
for (i = 0; i < active_nr; i++) {
struct cache_entry *ce = active_cache[i];
if (ce_stage(ce)) {
- deleted++;
+ if (last && !strcmp(ce->name, last->name))
+ continue;
invalidate_ce_path(ce);
- continue;
+ last = ce;
+ ce->ce_mode = 0;
+ ce->ce_flags &= ~htons(CE_STAGEMASK);
}
- if (deleted)
- *dst = ce;
- dst++;
+ *dst++ = ce;
}
- active_nr -= deleted;
- return deleted;
+ active_nr = dst - active_cache;
+ return !!last;
}
static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree)
@@ -850,7 +851,10 @@ int cmd_read_tree(int argc, const char **argv, char **envp)
continue;
}
- /* This differs from "-m" in that we'll silently ignore unmerged entries */
+ /* This differs from "-m" in that we'll silently ignore
+ * unmerged entries and overwrite working tree files that
+ * correspond to them.
+ */
if (!strcmp(arg, "--reset")) {
if (stage || merge)
usage(read_tree_usage);