@@ -3696,15 +3696,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);
@@ -3755,7 +3757,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;
@@ -3854,7 +3856,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;
@@ -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 &&