---
 builtin/checkout.c | 40 +++-------------------------------------
 builtin/merge.c    | 29 +++++++----------------------
 unpack-trees.c     | 33 +++++++++++++++++++++++++++++++++
 unpack-trees.h     |  4 ++++
 4 files changed, 47 insertions(+), 59 deletions(-)

diff --git a/builtin/checkout.c b/builtin/checkout.c
index a9c1b5a..93b18ad 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -362,40 +362,6 @@ static void describe_detached_head(const char *msg, struct 
commit *commit)
        strbuf_release(&sb);
 }
 
-static int reset_tree(struct tree *tree, const struct checkout_opts *o,
-                     int worktree, int *writeout_error)
-{
-       struct unpack_trees_options opts;
-       struct tree_desc tree_desc;
-
-       memset(&opts, 0, sizeof(opts));
-       opts.head_idx = -1;
-       opts.update = worktree;
-       opts.skip_unmerged = !worktree;
-       opts.reset = 1;
-       opts.merge = 1;
-       opts.fn = oneway_merge;
-       opts.verbose_update = !o->quiet && isatty(2);
-       opts.src_index = &the_index;
-       opts.dst_index = &the_index;
-       parse_tree(tree);
-       init_tree_desc(&tree_desc, tree->buffer, tree->size);
-       switch (unpack_trees(1, &tree_desc, &opts)) {
-       case -2:
-               *writeout_error = 1;
-               /*
-                * We return 0 nevertheless, as the index is all right
-                * and more importantly we have made best efforts to
-                * update paths in the work tree, and we cannot revert
-                * them.
-                */
-       case 0:
-               return 0;
-       default:
-               return 128;
-       }
-}
-
 struct branch_info {
        const char *name; /* The short name used */
        const char *path; /* The full name of a real branch */
@@ -427,7 +393,7 @@ static int merge_working_tree(const struct checkout_opts 
*opts,
 
        resolve_undo_clear();
        if (opts->force) {
-               ret = reset_tree(new->commit->tree, opts, 1, writeout_error);
+               ret = reset_tree(new->commit->tree, opts->quiet, 1, 
writeout_error);
                if (ret)
                        return ret;
        } else {
@@ -513,7 +479,7 @@ static int merge_working_tree(const struct checkout_opts 
*opts,
                        o.verbosity = 0;
                        work = write_tree_from_memory(&o);
 
-                       ret = reset_tree(new->commit->tree, opts, 1,
+                       ret = reset_tree(new->commit->tree, opts->quiet, 1,
                                         writeout_error);
                        if (ret)
                                return ret;
@@ -522,7 +488,7 @@ static int merge_working_tree(const struct checkout_opts 
*opts,
                        o.branch2 = "local";
                        merge_trees(&o, new->commit->tree, work,
                                old->commit->tree, &result);
-                       ret = reset_tree(new->commit->tree, opts, 0,
+                       ret = reset_tree(new->commit->tree, opts->quiet, 0,
                                         writeout_error);
                        if (ret)
                                return ret;
diff --git a/builtin/merge.c b/builtin/merge.c
index 6babf39..c51e4f5 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -269,33 +269,18 @@ static void read_empty(unsigned const char *sha1, int 
verbose)
                die(_("read-tree failed"));
 }
 
-static void reset_hard(unsigned const char *sha1, int verbose)
-{
-       int i = 0;
-       const char *args[6];
-
-       args[i++] = "read-tree";
-       if (verbose)
-               args[i++] = "-v";
-       args[i++] = "--reset";
-       args[i++] = "-u";
-       args[i++] = sha1_to_hex(sha1);
-       args[i] = NULL;
-
-       if (run_command_v_opt(args, RUN_GIT_CMD))
-               die(_("read-tree failed"));
-}
-
-static void restore_state(const unsigned char *head,
+static void restore_state(struct commit *head_commit,
                          const unsigned char *stash)
 {
        struct strbuf sb = STRBUF_INIT;
        const char *args[] = { "stash", "apply", NULL, NULL };
+       int error = 0;
 
        if (is_null_sha1(stash))
                return;
 
-       reset_hard(head, 1);
+       if (reset_tree(head_commit->tree, 0, 1, &error) || error)
+               die(_("read-tree failed"));
 
        args[2] = sha1_to_hex(stash);
 
@@ -1409,7 +1394,7 @@ int cmd_merge(int argc, const char **argv, const char 
*prefix)
                int ret;
                if (i) {
                        printf(_("Rewinding the tree to pristine...\n"));
-                       restore_state(head_commit->object.sha1, stash);
+                       restore_state(head_commit, stash);
                }
                if (use_strategies_nr != 1)
                        printf(_("Trying merge strategy %s...\n"),
@@ -1475,7 +1460,7 @@ int cmd_merge(int argc, const char **argv, const char 
*prefix)
         * it up.
         */
        if (!best_strategy) {
-               restore_state(head_commit->object.sha1, stash);
+               restore_state(head_commit, stash);
                if (use_strategies_nr > 1)
                        fprintf(stderr,
                                _("No merge strategy handled the merge.\n"));
@@ -1488,7 +1473,7 @@ int cmd_merge(int argc, const char **argv, const char 
*prefix)
                ; /* We already have its result in the working tree. */
        else {
                printf(_("Rewinding the tree to pristine...\n"));
-               restore_state(head_commit->object.sha1, stash);
+               restore_state(head_commit, stash);
                printf(_("Using the %s to prepare resolving by hand.\n"),
                        best_strategy);
                try_merge_strategy(best_strategy, common, remoteheads,
diff --git a/unpack-trees.c b/unpack-trees.c
index 0e1a196..3c24a4d 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -1847,3 +1847,36 @@ int oneway_merge(struct cache_entry **src, struct 
unpack_trees_options *o)
        }
        return merged_entry(a, old, o);
 }
+
+int reset_tree(struct tree *tree, int quiet, int worktree, int *writeout_error)
+{
+       struct unpack_trees_options opts;
+       struct tree_desc tree_desc;
+
+       memset(&opts, 0, sizeof(opts));
+       opts.head_idx = -1;
+       opts.update = worktree;
+       opts.skip_unmerged = !worktree;
+       opts.reset = 1;
+       opts.merge = 1;
+       opts.fn = oneway_merge;
+       opts.verbose_update = !quiet && isatty(2);
+       opts.src_index = &the_index;
+       opts.dst_index = &the_index;
+       parse_tree(tree);
+       init_tree_desc(&tree_desc, tree->buffer, tree->size);
+       switch (unpack_trees(1, &tree_desc, &opts)) {
+       case -2:
+               *writeout_error = 1;
+               /*
+                * We return 0 nevertheless, as the index is all right
+                * and more importantly we have made best efforts to
+                * update paths in the work tree, and we cannot revert
+                * them.
+                */
+       case 0:
+               return 0;
+       default:
+               return 128;
+       }
+}
diff --git a/unpack-trees.h b/unpack-trees.h
index ec74a9f..f0850bb 100644
--- a/unpack-trees.h
+++ b/unpack-trees.h
@@ -83,4 +83,8 @@ int twoway_merge(struct cache_entry **src, struct 
unpack_trees_options *o);
 int bind_merge(struct cache_entry **src, struct unpack_trees_options *o);
 int oneway_merge(struct cache_entry **src, struct unpack_trees_options *o);
 
+
+struct tree;
+extern int reset_tree(struct tree *tree, int quiet,
+                     int worktree, int *writeout_error);
 #endif
-- 
2.3.0.rc1.137.g477eb31

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to