diff --git a/sequencer.c b/sequencer.c index f85aa6b1f7..5f22b7cd37 100644 --- a/sequencer.c +++ b/sequencer.c @@ -4286,26 +4286,54 @@ static int do_update_ref(struct repository *r, const char *refname) return 0; } -static int do_update_refs(struct repository *r) +static int do_update_refs(struct repository *r, int quiet) { int res = 0; struct string_list_item *item; struct string_list refs_to_oids = STRING_LIST_INIT_DUP; struct ref_store *refs = get_main_ref_store(r); + struct strbuf update_msg = STRBUF_INIT; + struct strbuf error_msg = STRBUF_INIT; if ((res = sequencer_get_update_refs_state(r->gitdir, &refs_to_oids))) return res; for_each_string_list_item(item, &refs_to_oids) { struct update_ref_record *rec = item->util; + int loop_res; - res |= refs_update_ref(refs, "rewritten during rebase", - item->string, - &rec->after, &rec->before, - 0, UPDATE_REFS_MSG_ON_ERR); + loop_res = refs_update_ref(refs, "rewritten during rebase", + item->string, + &rec->after, &rec->before, + 0, UPDATE_REFS_MSG_ON_ERR); + res |= loop_res; + + if (quiet) + continue; + + if (loop_res) + strbuf_addf(&error_msg, "\t%s\n", item->string); + else + strbuf_addf(&update_msg, "\t%s\n", item->string); + } + + if (!quiet && + (update_msg.len || error_msg.len)) { + fprintf(stderr, + _("Updated the following refs with %s:\n%s"), + "--update-refs", + update_msg.buf); + + if (res) + fprintf(stderr, + _("Failed to update the following refs with %s:\n%s"), + "--update-refs", + error_msg.buf); } string_list_clear(&refs_to_oids, 1); + strbuf_release(&update_msg); + strbuf_release(&error_msg); return res; } @@ -4826,7 +4854,7 @@ cleanup_head_ref: strbuf_release(&buf); strbuf_release(&head_ref); - if (do_update_refs(r)) + if (do_update_refs(r, opts->quiet)) return -1; } diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 1a27bb0626..688b01e3eb 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -1840,12 +1840,26 @@ test_expect_success '--update-refs updates refs correctly' ' test_commit extra2 fileX && git commit --amend --fixup=L && - git rebase -i --autosquash --update-refs primary && + git rebase -i --autosquash --update-refs primary 2>err && test_cmp_rev HEAD~3 refs/heads/first && test_cmp_rev HEAD~3 refs/heads/second && test_cmp_rev HEAD~1 refs/heads/third && - test_cmp_rev HEAD refs/heads/no-conflict-branch + test_cmp_rev HEAD refs/heads/no-conflict-branch && + + cat >expect <<-\EOF && + Successfully rebased and updated refs/heads/update-refs. + Updated the following refs with --update-refs: + refs/heads/first + refs/heads/no-conflict-branch + refs/heads/second + refs/heads/third + EOF + + # Clear "Rebasing (X/Y)" progress lines and drop leading tabs. + sed -e "s/Rebasing.*Successfully/Successfully/g" -e "s/^\t//g" \ + err.trimmed && + test_cmp expect err.trimmed ' test_expect_success 'respect user edits to update-ref steps' ' @@ -1983,8 +1997,23 @@ test_expect_success '--update-refs: check failed ref update' ' # the lock in the update-refs file. git rev-parse third >.git/refs/heads/second && - git rebase --continue 2>err && - grep "update_ref failed for ref '\''refs/heads/second'\''" err + test_must_fail git rebase --continue 2>err && + grep "update_ref failed for ref '\''refs/heads/second'\''" err && + + cat >expect <<-\EOF && + Updated the following refs with --update-refs: + refs/heads/first + refs/heads/no-conflict-branch + refs/heads/third + Failed to update the following refs with --update-refs: + refs/heads/second + EOF + + # Clear "Rebasing (X/Y)" progress lines and drop leading tabs. + tail -n 6 err >err.last && + sed -e "s/Rebasing.*Successfully/Successfully/g" -e "s/^\t//g" \ + err.trimmed && + test_cmp expect err.trimmed ' # This must be the last test in this file