Continue the process of lib-ifying the autostash code. In a future
commit, this will be used to implement `--autostash` in other builtins.

This patch is best viewed with `--color-moved` and
`--color-moved-ws=allow-indentation-change`.

Signed-off-by: Denton Liu <liu.den...@gmail.com>
---
 autostash.c      | 46 +++++++++++++++++++++++++++++++++++++++++++++
 autostash.h      |  2 ++
 builtin/rebase.c | 49 ++----------------------------------------------
 3 files changed, 50 insertions(+), 47 deletions(-)

diff --git a/autostash.c b/autostash.c
index a6898e0fda..62ec7a7c80 100644
--- a/autostash.c
+++ b/autostash.c
@@ -1,6 +1,8 @@
 #include "git-compat-util.h"
 #include "autostash.h"
+#include "dir.h"
 #include "gettext.h"
+#include "run-command.h"
 #include "strbuf.h"
 
 int read_one(const char *path, struct strbuf *buf)
@@ -10,3 +12,47 @@ int read_one(const char *path, struct strbuf *buf)
        strbuf_trim_trailing_newline(buf);
        return 0;
 }
+
+int apply_autostash(const char *path)
+{
+       struct strbuf autostash = STRBUF_INIT;
+       struct child_process stash_apply = CHILD_PROCESS_INIT;
+
+       if (!file_exists(path))
+               return 0;
+
+       if (read_one(path, &autostash))
+               return error(_("Could not read '%s'"), path);
+       /* Ensure that the hash is not mistaken for a number */
+       strbuf_addstr(&autostash, "^0");
+       argv_array_pushl(&stash_apply.args,
+                        "stash", "apply", autostash.buf, NULL);
+       stash_apply.git_cmd = 1;
+       stash_apply.no_stderr = stash_apply.no_stdout =
+               stash_apply.no_stdin = 1;
+       if (!run_command(&stash_apply))
+               printf(_("Applied autostash.\n"));
+       else {
+               struct argv_array args = ARGV_ARRAY_INIT;
+               int res = 0;
+
+               argv_array_pushl(&args,
+                                "stash", "store", "-m", "autostash", "-q",
+                                autostash.buf, NULL);
+               if (run_command_v_opt(args.argv, RUN_GIT_CMD))
+                       res = error(_("Cannot store %s"), autostash.buf);
+               argv_array_clear(&args);
+               strbuf_release(&autostash);
+               if (res)
+                       return res;
+
+               fprintf(stderr,
+                       _("Applying autostash resulted in conflicts.\n"
+                         "Your changes are safe in the stash.\n"
+                         "You can run \"git stash pop\" or \"git stash drop\" "
+                         "at any time.\n"));
+       }
+
+       strbuf_release(&autostash);
+       return 0;
+}
diff --git a/autostash.h b/autostash.h
index 4a8f504f12..5f4e4bd22c 100644
--- a/autostash.h
+++ b/autostash.h
@@ -6,4 +6,6 @@
 /* Read one file, then strip line endings */
 int read_one(const char *path, struct strbuf *buf);
 
+int apply_autostash(const char *path);
+
 #endif
diff --git a/builtin/rebase.c b/builtin/rebase.c
index 9fd7de6b2f..661928d427 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -682,51 +682,6 @@ static int rebase_write_basic_state(struct rebase_options 
*opts)
        return 0;
 }
 
-static int apply_autostash(struct rebase_options *opts)
-{
-       const char *path = state_dir_path("autostash", opts);
-       struct strbuf autostash = STRBUF_INIT;
-       struct child_process stash_apply = CHILD_PROCESS_INIT;
-
-       if (!file_exists(path))
-               return 0;
-
-       if (read_one(path, &autostash))
-               return error(_("Could not read '%s'"), path);
-       /* Ensure that the hash is not mistaken for a number */
-       strbuf_addstr(&autostash, "^0");
-       argv_array_pushl(&stash_apply.args,
-                        "stash", "apply", autostash.buf, NULL);
-       stash_apply.git_cmd = 1;
-       stash_apply.no_stderr = stash_apply.no_stdout =
-               stash_apply.no_stdin = 1;
-       if (!run_command(&stash_apply))
-               printf(_("Applied autostash.\n"));
-       else {
-               struct argv_array args = ARGV_ARRAY_INIT;
-               int res = 0;
-
-               argv_array_pushl(&args,
-                                "stash", "store", "-m", "autostash", "-q",
-                                autostash.buf, NULL);
-               if (run_command_v_opt(args.argv, RUN_GIT_CMD))
-                       res = error(_("Cannot store %s"), autostash.buf);
-               argv_array_clear(&args);
-               strbuf_release(&autostash);
-               if (res)
-                       return res;
-
-               fprintf(stderr,
-                       _("Applying autostash resulted in conflicts.\n"
-                         "Your changes are safe in the stash.\n"
-                         "You can run \"git stash pop\" or \"git stash drop\" "
-                         "at any time.\n"));
-       }
-
-       strbuf_release(&autostash);
-       return 0;
-}
-
 static int finish_rebase(struct rebase_options *opts)
 {
        struct strbuf dir = STRBUF_INIT;
@@ -734,7 +689,7 @@ static int finish_rebase(struct rebase_options *opts)
        int ret = 0;
 
        delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
-       apply_autostash(opts);
+       apply_autostash(state_dir_path("autostash", opts));
        close_object_store(the_repository->objects);
        /*
         * We ignore errors in 'gc --auto', since the
@@ -1181,7 +1136,7 @@ static int run_specific_rebase(struct rebase_options 
*opts, enum action action)
        } else if (status == 2) {
                struct strbuf dir = STRBUF_INIT;
 
-               apply_autostash(opts);
+               apply_autostash(state_dir_path("autostash", opts));
                strbuf_addstr(&dir, opts->state_dir);
                remove_dir_recursively(&dir, 0);
                strbuf_release(&dir);
-- 
2.23.0.897.g0a19638b1e

Reply via email to