sequencer: extract perform_autostash() from rebase
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>
This commit is contained in:
committed by
Junio C Hamano
parent
9bb3dea45d
commit
0816f1dff8
@@ -1274,55 +1274,6 @@ static int check_exec_cmd(const char *cmd)
|
|||||||
return 0;
|
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)
|
int cmd_rebase(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
struct rebase_options options = REBASE_OPTIONS_INIT;
|
struct rebase_options options = REBASE_OPTIONS_INIT;
|
||||||
|
|||||||
50
sequencer.c
50
sequencer.c
@@ -32,6 +32,7 @@
|
|||||||
#include "alias.h"
|
#include "alias.h"
|
||||||
#include "commit-reach.h"
|
#include "commit-reach.h"
|
||||||
#include "rebase-interactive.h"
|
#include "rebase-interactive.h"
|
||||||
|
#include "reset.h"
|
||||||
|
|
||||||
#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
|
#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;
|
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)
|
int apply_autostash(const char *path)
|
||||||
{
|
{
|
||||||
struct strbuf stash_oid = STRBUF_INIT;
|
struct strbuf stash_oid = STRBUF_INIT;
|
||||||
|
|||||||
@@ -191,6 +191,8 @@ void commit_post_rewrite(struct repository *r,
|
|||||||
const struct commit *current_head,
|
const struct commit *current_head,
|
||||||
const struct object_id *new_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);
|
int apply_autostash(const char *path);
|
||||||
|
|
||||||
#define SUMMARY_INITIAL_COMMIT (1 << 0)
|
#define SUMMARY_INITIAL_COMMIT (1 << 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user