]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sequencer: extract perform_autostash() from rebase
authorDenton Liu <liu.denton@gmail.com>
Tue, 7 Apr 2020 14:28:03 +0000 (10:28 -0400)
committerJunio C Hamano <gitster@pobox.com>
Fri, 10 Apr 2020 16:28:02 +0000 (09:28 -0700)
Lib-ify the autostash code by extracting perform_autostash() from rebase
into sequencer. In a future commit, this will be used to implement
`--autostash` in other builtins.

This patch is best viewed with `--color-moved`.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/rebase.c
sequencer.c
sequencer.h

index ae345c9e57905a9762a24741d69d288d00b085b5..08b89869b30f73718349c430fb3e9b7d8ddf1bff 100644 (file)
@@ -1274,55 +1274,6 @@ static int check_exec_cmd(const char *cmd)
        return 0;
 }
 
-static void create_autostash(struct repository *r, const char *path,
-                            const char *default_reflog_action)
-{
-       struct strbuf buf = STRBUF_INIT;
-       struct lock_file lock_file = LOCK_INIT;
-       int fd;
-
-       fd = repo_hold_locked_index(r, &lock_file, 0);
-       refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL);
-       if (0 <= fd)
-               repo_update_index_if_able(r, &lock_file);
-       rollback_lock_file(&lock_file);
-
-       if (has_unstaged_changes(r, 1) ||
-           has_uncommitted_changes(r, 1)) {
-               struct child_process stash = CHILD_PROCESS_INIT;
-               struct object_id oid;
-
-               argv_array_pushl(&stash.args,
-                                "stash", "create", "autostash", NULL);
-               stash.git_cmd = 1;
-               stash.no_stdin = 1;
-               strbuf_reset(&buf);
-               if (capture_command(&stash, &buf, GIT_MAX_HEXSZ))
-                       die(_("Cannot autostash"));
-               strbuf_trim_trailing_newline(&buf);
-               if (get_oid(buf.buf, &oid))
-                       die(_("Unexpected stash response: '%s'"),
-                           buf.buf);
-               strbuf_reset(&buf);
-               strbuf_add_unique_abbrev(&buf, &oid, DEFAULT_ABBREV);
-
-               if (safe_create_leading_directories_const(path))
-                       die(_("Could not create directory for '%s'"),
-                           path);
-               write_file(path, "%s", oid_to_hex(&oid));
-               printf(_("Created autostash: %s\n"), buf.buf);
-               if (reset_head(r, NULL, "reset --hard",
-                              NULL, RESET_HEAD_HARD, NULL, NULL,
-                              default_reflog_action) < 0)
-                       die(_("could not reset --hard"));
-
-               if (discard_index(r->index) < 0 ||
-                       repo_read_index(r) < 0)
-                       die(_("could not read index"));
-       }
-       strbuf_release(&buf);
-}
-
 int cmd_rebase(int argc, const char **argv, const char *prefix)
 {
        struct rebase_options options = REBASE_OPTIONS_INIT;
index f5bb1cc1fbfa3c6835d8d2ce3974b14d352a8846..e0b8262521e18b551e6541997de2ad4dabceb084 100644 (file)
@@ -32,6 +32,7 @@
 #include "alias.h"
 #include "commit-reach.h"
 #include "rebase-interactive.h"
+#include "reset.h"
 
 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
 
@@ -3657,6 +3658,55 @@ static enum todo_command peek_command(struct todo_list *todo_list, int offset)
        return -1;
 }
 
+void create_autostash(struct repository *r, const char *path,
+                     const char *default_reflog_action)
+{
+       struct strbuf buf = STRBUF_INIT;
+       struct lock_file lock_file = LOCK_INIT;
+       int fd;
+
+       fd = repo_hold_locked_index(r, &lock_file, 0);
+       refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL);
+       if (0 <= fd)
+               repo_update_index_if_able(r, &lock_file);
+       rollback_lock_file(&lock_file);
+
+       if (has_unstaged_changes(r, 1) ||
+           has_uncommitted_changes(r, 1)) {
+               struct child_process stash = CHILD_PROCESS_INIT;
+               struct object_id oid;
+
+               argv_array_pushl(&stash.args,
+                                "stash", "create", "autostash", NULL);
+               stash.git_cmd = 1;
+               stash.no_stdin = 1;
+               strbuf_reset(&buf);
+               if (capture_command(&stash, &buf, GIT_MAX_HEXSZ))
+                       die(_("Cannot autostash"));
+               strbuf_trim_trailing_newline(&buf);
+               if (get_oid(buf.buf, &oid))
+                       die(_("Unexpected stash response: '%s'"),
+                           buf.buf);
+               strbuf_reset(&buf);
+               strbuf_add_unique_abbrev(&buf, &oid, DEFAULT_ABBREV);
+
+               if (safe_create_leading_directories_const(path))
+                       die(_("Could not create directory for '%s'"),
+                           path);
+               write_file(path, "%s", oid_to_hex(&oid));
+               printf(_("Created autostash: %s\n"), buf.buf);
+               if (reset_head(r, NULL, "reset --hard",
+                              NULL, RESET_HEAD_HARD, NULL, NULL,
+                              default_reflog_action) < 0)
+                       die(_("could not reset --hard"));
+
+               if (discard_index(r->index) < 0 ||
+                       repo_read_index(r) < 0)
+                       die(_("could not read index"));
+       }
+       strbuf_release(&buf);
+}
+
 int apply_autostash(const char *path)
 {
        struct strbuf stash_oid = STRBUF_INIT;
index ab686146d1f719f69ca0dd4804a304654d30cff8..9d1fe0ccfba78c341cf2ddc76b6316fb862f4648 100644 (file)
@@ -191,6 +191,8 @@ void commit_post_rewrite(struct repository *r,
                         const struct commit *current_head,
                         const struct object_id *new_head);
 
+void create_autostash(struct repository *r, const char *path,
+                     const char *default_reflog_action);
 int apply_autostash(const char *path);
 
 #define SUMMARY_INITIAL_COMMIT   (1 << 0)