rebase: teach reset_head()
to optionally skip the worktree
This is what the legacy (scripted) rebase does in `move_to_original_branch`, and we will need this functionality in the next commit. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
5b2237a876
commit
414f336069
@ -337,6 +337,7 @@ static void add_var(struct strbuf *buf, const char *name, const char *value)
|
|||||||
|
|
||||||
#define RESET_HEAD_DETACH (1<<0)
|
#define RESET_HEAD_DETACH (1<<0)
|
||||||
#define RESET_HEAD_HARD (1<<1)
|
#define RESET_HEAD_HARD (1<<1)
|
||||||
|
#define RESET_HEAD_REFS_ONLY (1<<2)
|
||||||
|
|
||||||
static int reset_head(struct object_id *oid, const char *action,
|
static int reset_head(struct object_id *oid, const char *action,
|
||||||
const char *switch_to_branch, unsigned flags,
|
const char *switch_to_branch, unsigned flags,
|
||||||
@ -344,6 +345,7 @@ static int reset_head(struct object_id *oid, const char *action,
|
|||||||
{
|
{
|
||||||
unsigned detach_head = flags & RESET_HEAD_DETACH;
|
unsigned detach_head = flags & RESET_HEAD_DETACH;
|
||||||
unsigned reset_hard = flags & RESET_HEAD_HARD;
|
unsigned reset_hard = flags & RESET_HEAD_HARD;
|
||||||
|
unsigned refs_only = flags & RESET_HEAD_REFS_ONLY;
|
||||||
struct object_id head_oid;
|
struct object_id head_oid;
|
||||||
struct tree_desc desc[2] = { { NULL }, { NULL } };
|
struct tree_desc desc[2] = { { NULL }, { NULL } };
|
||||||
struct lock_file lock = LOCK_INIT;
|
struct lock_file lock = LOCK_INIT;
|
||||||
@ -359,7 +361,7 @@ static int reset_head(struct object_id *oid, const char *action,
|
|||||||
if (switch_to_branch && !starts_with(switch_to_branch, "refs/"))
|
if (switch_to_branch && !starts_with(switch_to_branch, "refs/"))
|
||||||
BUG("Not a fully qualified branch: '%s'", switch_to_branch);
|
BUG("Not a fully qualified branch: '%s'", switch_to_branch);
|
||||||
|
|
||||||
if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0) {
|
if (!refs_only && hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0) {
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto leave_reset_head;
|
goto leave_reset_head;
|
||||||
}
|
}
|
||||||
@ -372,6 +374,9 @@ static int reset_head(struct object_id *oid, const char *action,
|
|||||||
if (!oid)
|
if (!oid)
|
||||||
oid = &head_oid;
|
oid = &head_oid;
|
||||||
|
|
||||||
|
if (refs_only)
|
||||||
|
goto reset_head_refs;
|
||||||
|
|
||||||
memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
|
memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
|
||||||
setup_unpack_trees_porcelain(&unpack_tree_opts, action);
|
setup_unpack_trees_porcelain(&unpack_tree_opts, action);
|
||||||
unpack_tree_opts.head_idx = 1;
|
unpack_tree_opts.head_idx = 1;
|
||||||
@ -412,6 +417,7 @@ static int reset_head(struct object_id *oid, const char *action,
|
|||||||
goto leave_reset_head;
|
goto leave_reset_head;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reset_head_refs:
|
||||||
reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT);
|
reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT);
|
||||||
strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : "rebase");
|
strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : "rebase");
|
||||||
prefix_len = msg.len;
|
prefix_len = msg.len;
|
||||||
|
Reference in New Issue
Block a user