diff --git a/sequencer.c b/sequencer.c index f2d0667b571..7eec231234b 100644 --- a/sequencer.c +++ b/sequencer.c @@ -3694,15 +3694,17 @@ static const char *reflog_message(struct replay_opts *opts, return buf.buf; } -static struct commit *lookup_label(const char *label, int len, - struct strbuf *buf) +static struct commit *lookup_label(struct repository *r, const char *label, + int len, struct strbuf *buf) { struct commit *commit; + struct object_id oid; strbuf_reset(buf); strbuf_addf(buf, "refs/rewritten/%.*s", len, label); - commit = lookup_commit_reference_by_name(buf->buf); - if (!commit) { + if (!read_ref(buf->buf, &oid)) { + commit = lookup_commit_object(r, &oid); + } else { /* fall back to non-rewritten ref or commit */ strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0); commit = lookup_commit_reference_by_name(buf->buf); @@ -3753,7 +3755,7 @@ static int do_reset(struct repository *r, break; len = i; - commit = lookup_label(name, len, &ref_name); + commit = lookup_label(r, name, len, &ref_name); if (!commit) { ret = -1; goto cleanup; @@ -3852,7 +3854,7 @@ static int do_merge(struct repository *r, k = strcspn(p, " \t\n"); if (!k) continue; - merge_commit = lookup_label(p, k, &ref_name); + merge_commit = lookup_label(r, p, k, &ref_name); if (!merge_commit) { ret = error(_("unable to parse '%.*s'"), k, p); goto leave_merge; diff --git a/t/t3430-rebase-merges.sh b/t/t3430-rebase-merges.sh index fbbc4439bfe..fa2a06c19f0 100755 --- a/t/t3430-rebase-merges.sh +++ b/t/t3430-rebase-merges.sh @@ -146,6 +146,15 @@ test_expect_success '`reset` rejects trees' ' test_must_be_empty out ' +test_expect_success '`reset` only looks for labels under refs/rewritten/' ' + test_when_finished "test_might_fail git rebase --abort" && + git branch refs/rewritten/my-label A && + test_must_fail env GIT_SEQUENCE_EDITOR="echo reset my-label >" \ + git rebase -i B C >out 2>err && + grep "could not resolve ${SQ}my-label${SQ}" err && + test_must_be_empty out +' + test_expect_success 'failed `merge -C` writes patch (may be rescheduled, too)' ' test_when_finished "test_might_fail git rebase --abort" && git checkout -b conflicting-merge A &&