diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-01-13 11:58:56 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-01-13 11:58:56 -0800 |
commit | dc96c5ee703fb7265619b1ecb2b5f2c5ab3ef40d (patch) | |
tree | 2d81a990aa60381e5ab751e1c88a7e7e6e2142ae /builtin-reset.c | |
parent | 73d66323ac78c750ba42fef23b1cb8fd2110e023 (diff) | |
parent | d7eed8cbef2d15e87e9002f5e3ce08830b40b292 (diff) | |
download | git-dc96c5ee703fb7265619b1ecb2b5f2c5ab3ef40d.tar.gz |
Merge branch 'cc/reset-more'
* cc/reset-more:
t7111: check that reset options work as described in the tables
Documentation: reset: add some missing tables
Fix bit assignment for CE_CONFLICTED
"reset --merge": fix unmerged case
reset: use "unpack_trees()" directly instead of "git read-tree"
reset: add a few tests for "git reset --merge"
Documentation: reset: add some tables to describe the different options
reset: improve mixed reset error message when in a bare repo
Diffstat (limited to 'builtin-reset.c')
-rw-r--r-- | builtin-reset.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/builtin-reset.c b/builtin-reset.c index 5b647422d6..0f5022eed2 100644 --- a/builtin-reset.c +++ b/builtin-reset.c @@ -18,6 +18,8 @@ #include "tree.h" #include "branch.h" #include "parse-options.h" +#include "unpack-trees.h" +#include "cache-tree.h" static const char * const git_reset_usage[] = { "git reset [--mixed | --soft | --hard | --merge] [-q] [<commit>]", @@ -54,27 +56,44 @@ static inline int is_merge(void) static int reset_index_file(const unsigned char *sha1, int reset_type, int quiet) { - int i = 0; - const char *args[6]; + int nr = 1; + int newfd; + struct tree_desc desc[2]; + struct unpack_trees_options opts; + struct lock_file *lock = xcalloc(1, sizeof(struct lock_file)); - args[i++] = "read-tree"; + memset(&opts, 0, sizeof(opts)); + opts.head_idx = 1; + opts.src_index = &the_index; + opts.dst_index = &the_index; + opts.fn = oneway_merge; + opts.merge = 1; if (!quiet) - args[i++] = "-v"; + opts.verbose_update = 1; switch (reset_type) { case MERGE: - args[i++] = "-u"; - args[i++] = "-m"; + opts.update = 1; break; case HARD: - args[i++] = "-u"; + opts.update = 1; /* fallthrough */ default: - args[i++] = "--reset"; + opts.reset = 1; } - args[i++] = sha1_to_hex(sha1); - args[i] = NULL; - return run_command_v_opt(args, RUN_GIT_CMD); + newfd = hold_locked_index(lock, 1); + + read_cache_unmerged(); + + if (!fill_tree_descriptor(desc + nr - 1, sha1)) + return error("Failed to find tree of %s.", sha1_to_hex(sha1)); + if (unpack_trees(nr, desc, &opts)) + return -1; + if (write_cache(newfd, active_cache, active_nr) || + commit_locked_index(lock)) + return error("Could not write new index file."); + + return 0; } static void print_new_head_line(struct commit *commit) @@ -288,6 +307,10 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (reset_type == HARD || reset_type == MERGE) setup_work_tree(); + if (reset_type == MIXED && is_bare_repository()) + die("%s reset is not allowed in a bare repository", + reset_type_names[reset_type]); + /* Soft reset does not touch the index file nor the working tree * at all, but requires them in a good order. Other resets reset * the index file to the tree object we are switching to. */ |