diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-09 12:51:01 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-09 12:51:01 -0700 |
commit | 438195ccedce7270cf5ba167a940c90467cb72d7 (patch) | |
tree | 57b0518f32c7f43327e6ccb9bd91dedcceae77d7 | |
parent | 98a96b00b88ee35866cd0b1e94697db76bd5ddf9 (diff) | |
download | git-438195ccedce7270cf5ba167a940c90467cb72d7.tar.gz |
git-read-tree: add "--reset" flag
This is the same as "-m", but it will silently ignore any unmerged
entries, which makes it useful for efficiently forcing a new position
regardless of the state of the current index file.
IOW, to reset to a previous HEAD (in case you have had a failed
merge, for example), you'd just do
git-read-tree -u --reset HEAD
which will also update your working tree to the right state.
NOTE! The "update" will not remove files that may have been added by the
merge. Yet.
-rw-r--r-- | read-tree.c | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/read-tree.c b/read-tree.c index fbd0da0ebd..b3a3c4ab59 100644 --- a/read-tree.c +++ b/read-tree.c @@ -275,13 +275,35 @@ static void merge_cache(struct cache_entry **src, int nr, merge_fn_t fn) check_updates(active_cache, active_nr); } +static int read_cache_unmerged(void) +{ + int i, deleted; + struct cache_entry **dst; + + 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++; + continue; + } + if (deleted) + *dst = ce; + dst++; + } + active_nr -= deleted; + return deleted; +} + static char *read_tree_usage = "git-read-tree (<sha> | -m [-u] <sha1> [<sha2> [<sha3>]])"; static struct cache_file cache_file; int main(int argc, char **argv) { - int i, newfd, merge; + int i, newfd, merge, reset; unsigned char sha1[20]; newfd = hold_index_file_for_update(&cache_file, get_index_file()); @@ -289,6 +311,7 @@ int main(int argc, char **argv) die("unable to create new cachefile"); merge = 0; + reset = 0; for (i = 1; i < argc; i++) { const char *arg = argv[i]; @@ -298,16 +321,22 @@ int main(int argc, char **argv) continue; } + /* This differs from "-m" in that we'll silently ignore unmerged entries */ + if (!strcmp(arg, "--reset")) { + if (stage || merge) + usage(read_tree_usage); + reset = 1; + merge = 1; + stage = 1; + read_cache_unmerged(); + } + /* "-m" stands for "merge", meaning we start in stage 1 */ if (!strcmp(arg, "-m")) { - int i; - if (stage) - die("-m needs to come first"); - read_cache(); - for (i = 0; i < active_nr; i++) { - if (ce_stage(active_cache[i])) - die("you need to resolve your current index first"); - } + if (stage || merge) + usage(read_tree_usage); + if (read_cache_unmerged()) + die("you need to resolve your current index first"); stage = 1; merge = 1; continue; |