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>

Johannes Schindelin committed Jan 18, 2019 at 07:09 UTC 414f336069adfaea76217387cd03beefb4d73a20
1 file changed +7 -1
builtin/rebase.c
+7 -1
@@ -337,6 +337,7 @@ static void add_var(struct strbuf *buf, const char *name, const char *value)
337
338 #define RESET_HEAD_DETACH (1<<0)
339 #define RESET_HEAD_HARD (1<<1)
340 +#define RESET_HEAD_REFS_ONLY (1<<2)
341
342 static int reset_head(struct object_id *oid, const char *action,
343 const char *switch_to_branch, unsigned flags,
@@ -344,6 +345,7 @@ static int reset_head(struct object_id *oid, const char *action,
345 {
346 unsigned detach_head = flags & RESET_HEAD_DETACH;
347 unsigned reset_hard = flags & RESET_HEAD_HARD;
348 + unsigned refs_only = flags & RESET_HEAD_REFS_ONLY;
349 struct object_id head_oid;
350 struct tree_desc desc[2] = { { NULL }, { NULL } };
351 struct lock_file lock = LOCK_INIT;
@@ -359,7 +361,7 @@ static int reset_head(struct object_id *oid, const char *action,
361 if (switch_to_branch && !starts_with(switch_to_branch, "refs/"))
362 BUG("Not a fully qualified branch: '%s'", switch_to_branch);
363
362 - if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0) {
364 + if (!refs_only && hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0) {
365 ret = -1;
366 goto leave_reset_head;
367 }
@@ -372,6 +374,9 @@ static int reset_head(struct object_id *oid, const char *action,
374 if (!oid)
375 oid = &head_oid;
376
377 + if (refs_only)
378 + goto reset_head_refs;
379 +
380 memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
381 setup_unpack_trees_porcelain(&unpack_tree_opts, action);
382 unpack_tree_opts.head_idx = 1;
@@ -412,6 +417,7 @@ static int reset_head(struct object_id *oid, const char *action,
417 goto leave_reset_head;
418 }
419
420 +reset_head_refs:
421 reflog_action = getenv(GIT_REFLOG_ACTION_ENVIRONMENT);
422 strbuf_addf(&msg, "%s: ", reflog_action ? reflog_action : "rebase");
423 prefix_len = msg.len;