X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=builtin-read-tree.c;h=23a8d92a4b77e7436069c976bc5fa0ec162a9324;hb=6ece0d3030ae2dc5b49fcfcc83df4966a52e0d0b;hp=0c6ba3d8a5b8227ab3edde15f704383cda73ce94;hpb=b9d301bca767c9c26b8514fb326dd237cb269fbb;p=git.git diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 0c6ba3d8a..23a8d92a4 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -31,8 +31,7 @@ static int merge_size = 0; static struct object_list *trees = NULL; -static struct cache_entry df_conflict_entry = { -}; +static struct cache_entry df_conflict_entry; struct tree_entry_list { struct tree_entry_list *next; @@ -377,6 +376,7 @@ static void check_updates(struct cache_entry **src, int nr) fprintf(stderr, "%4u%% (%u/%u) done\r", percent, cnt, total); last_percent = percent; + progress_update = 0; } } } @@ -799,10 +799,8 @@ static int oneway_merge(struct cache_entry **src) return error("Cannot do a oneway merge of %d trees", merge_size); - if (!a) { - invalidate_ce_path(old); + if (!a) return deleted_entry(old, old); - } if (old && same(old, a)) { if (reset) { struct stat st; @@ -817,25 +815,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) @@ -877,7 +876,7 @@ static void prime_cache_tree(void) static const char read_tree_usage[] = "git-read-tree ( | [[-m [--aggressive] | --reset | --prefix=] [-u | -i]] [ []])"; -static struct cache_file cache_file; +static struct lock_file lock_file; int cmd_read_tree(int argc, const char **argv, char **envp) { @@ -888,9 +887,9 @@ int cmd_read_tree(int argc, const char **argv, char **envp) setup_git_directory(); git_config(git_default_config); - newfd = hold_index_file_for_update(&cache_file, get_index_file()); + newfd = hold_lock_file_for_update(&lock_file, get_index_file()); if (newfd < 0) - die("unable to create new cachefile"); + die("unable to create new index file"); git_config(git_default_config); @@ -935,7 +934,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 || prefix) usage(read_tree_usage); @@ -1030,13 +1032,13 @@ int cmd_read_tree(int argc, const char **argv, char **envp) * valid cache-tree because the index must match exactly * what came from the tree. */ - if (trees && trees->item && (!merge || (stage == 2))) { + if (trees && trees->item && !prefix && (!merge || (stage == 2))) { cache_tree_free(&active_cache_tree); prime_cache_tree(); } if (write_cache(newfd, active_cache, active_nr) || - commit_index_file(&cache_file)) + close(newfd) || commit_lock_file(&lock_file)) die("unable to write new index file"); return 0; }