Skip to content

Commit

Permalink
sequencer: extract perform_autostash() from rebase
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Denton-L authored and gitster committed Dec 26, 2019
1 parent ed15bc1 commit 38ac131
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 49 deletions.
49 changes: 0 additions & 49 deletions builtin/rebase.c
Original file line number Diff line number Diff line change
Expand Up @@ -1232,55 +1232,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;
Expand Down
50 changes: 50 additions & 0 deletions sequencer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -3744,6 +3745,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_sha1 = STRBUF_INIT;
Expand Down
2 changes: 2 additions & 0 deletions sequencer.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,8 @@ void commit_post_rewrite(struct repository *r,
int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts,
const char *commit);

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)
Expand Down

0 comments on commit 38ac131

Please sign in to comment.