@@ -4261,26 +4261,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;
}
@@ -4800,7 +4828,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;
}
@@ -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 >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.last >err.trimmed &&
+ test_cmp expect err.trimmed
'
# This must be the last test in this file