Merge branch 'mh/release-commit-memory-fix'
[gitweb.git] / builtin / stash.c
index e0528d4cc82d1395b4a41379681440417ae23031..b5a301f24d7a5f8b0a5f7d51703ca4cf38e2109c 100644 (file)
@@ -1,3 +1,4 @@
+#define USE_THE_INDEX_COMPATIBILITY_MACROS
 #include "builtin.h"
 #include "config.h"
 #include "parse-options.h"
@@ -432,7 +433,7 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
        if (info->has_u && restore_untracked(&info->u_tree))
                return error(_("could not restore untracked files from stash"));
 
-       init_merge_options(&o);
+       init_merge_options(&o, the_repository);
 
        o.branch1 = "Updated upstream";
        o.branch2 = "Stashed changes";
@@ -527,7 +528,7 @@ static int apply_stash(int argc, const char **argv, const char *prefix)
        return ret;
 }
 
-static int do_drop_stash(const char *prefix, struct stash_info *info, int quiet)
+static int do_drop_stash(struct stash_info *info, int quiet)
 {
        int ret;
        struct child_process cp_reflog = CHILD_PROCESS_INIT;
@@ -597,7 +598,7 @@ static int drop_stash(int argc, const char **argv, const char *prefix)
 
        assert_stash_ref(&info);
 
-       ret = do_drop_stash(prefix, &info, quiet);
+       ret = do_drop_stash(&info, quiet);
        free_stash_info(&info);
        return ret;
 }
@@ -626,7 +627,7 @@ static int pop_stash(int argc, const char **argv, const char *prefix)
                printf_ln(_("The stash entry is kept in case "
                            "you need it again."));
        else
-               ret = do_drop_stash(prefix, &info, quiet);
+               ret = do_drop_stash(&info, quiet);
 
        free_stash_info(&info);
        return ret;
@@ -663,7 +664,7 @@ static int branch_stash(int argc, const char **argv, const char *prefix)
        if (!ret)
                ret = do_apply_stash(prefix, &info, 1, 0);
        if (!ret && info.is_stash_ref)
-               ret = do_drop_stash(prefix, &info, 0);
+               ret = do_drop_stash(&info, 0);
 
        free_stash_info(&info);
 
@@ -712,11 +713,11 @@ static int git_stash_config(const char *var, const char *value, void *cb)
 static int show_stash(int argc, const char **argv, const char *prefix)
 {
        int i;
-       int opts = 0;
        int ret = 0;
        struct stash_info info;
        struct rev_info rev;
        struct argv_array stash_args = ARGV_ARRAY_INIT;
+       struct argv_array revision_args = ARGV_ARRAY_INIT;
        struct option options[] = {
                OPT_END()
        };
@@ -725,11 +726,12 @@ static int show_stash(int argc, const char **argv, const char *prefix)
        git_config(git_diff_ui_config, NULL);
        init_revisions(&rev, prefix);
 
+       argv_array_push(&revision_args, argv[0]);
        for (i = 1; i < argc; i++) {
                if (argv[i][0] != '-')
                        argv_array_push(&stash_args, argv[i]);
                else
-                       opts++;
+                       argv_array_push(&revision_args, argv[i]);
        }
 
        ret = get_stash_info(&info, stash_args.argc, stash_args.argv);
@@ -741,7 +743,7 @@ static int show_stash(int argc, const char **argv, const char *prefix)
         * The config settings are applied only if there are not passed
         * any options.
         */
-       if (!opts) {
+       if (revision_args.argc == 1) {
                git_config(git_stash_config, NULL);
                if (show_stat)
                        rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT;
@@ -755,11 +757,15 @@ static int show_stash(int argc, const char **argv, const char *prefix)
                }
        }
 
-       argc = setup_revisions(argc, argv, &rev, NULL);
+       argc = setup_revisions(revision_args.argc, revision_args.argv, &rev, NULL);
        if (argc > 1) {
                free_stash_info(&info);
                usage_with_options(git_stash_show_usage, options);
        }
+       if (!rev.diffopt.output_format) {
+               rev.diffopt.output_format = DIFF_FORMAT_PATCH;
+               diff_setup_done(&rev.diffopt);
+       }
 
        rev.diffopt.flags.recursive = 1;
        setup_diff_pager(&rev.diffopt);
@@ -814,7 +820,8 @@ static int store_stash(int argc, const char **argv, const char *prefix)
                return -1;
        }
 
-       if (get_oid_with_context(argv[0], quiet ? GET_OID_QUIETLY : 0, &obj,
+       if (get_oid_with_context(the_repository,
+                                argv[0], quiet ? GET_OID_QUIETLY : 0, &obj,
                                 &dummy)) {
                if (!quiet)
                        fprintf_ln(stderr, _("Cannot update %s with %s"),
@@ -1274,7 +1281,7 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
                        ce_path_match(&the_index, active_cache[i], ps,
                                      ps_matched);
 
-               if (report_path_error(ps_matched, ps, NULL)) {
+               if (report_path_error(ps_matched, ps)) {
                        fprintf_ln(stderr, _("Did you forget to 'git add'?"));
                        ret = -1;
                        free(ps_matched);
@@ -1384,30 +1391,16 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
                }
 
                if (keep_index == 1 && !is_null_oid(&info.i_tree)) {
-                       struct child_process cp_ls = CHILD_PROCESS_INIT;
-                       struct child_process cp_checkout = CHILD_PROCESS_INIT;
-                       struct strbuf out = STRBUF_INIT;
-
-                       if (reset_tree(&info.i_tree, 0, 1)) {
-                               ret = -1;
-                               goto done;
-                       }
-
-                       cp_ls.git_cmd = 1;
-                       argv_array_pushl(&cp_ls.args, "ls-files", "-z",
-                                        "--modified", "--", NULL);
-
-                       add_pathspecs(&cp_ls.args, ps);
-                       if (pipe_command(&cp_ls, NULL, 0, &out, 0, NULL, 0)) {
-                               ret = -1;
-                               goto done;
-                       }
+                       struct child_process cp = CHILD_PROCESS_INIT;
 
-                       cp_checkout.git_cmd = 1;
-                       argv_array_pushl(&cp_checkout.args, "checkout-index",
-                                        "-z", "--force", "--stdin", NULL);
-                       if (pipe_command(&cp_checkout, out.buf, out.len, NULL,
-                                        0, NULL, 0)) {
+                       cp.git_cmd = 1;
+                       argv_array_pushl(&cp.args, "checkout", "--no-overlay",
+                                        oid_to_hex(&info.i_tree), "--", NULL);
+                       if (!ps->nr)
+                               argv_array_push(&cp.args, ":/");
+                       else
+                               add_pathspecs(&cp.args, ps);
+                       if (run_command(&cp)) {
                                ret = -1;
                                goto done;
                        }