Re: [PATCH v3 7/8] rebase: update refs from 'update-ref' commands
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 28, 2022, 21:15 UTC
- Message-ID
- <xmqq7d50ij6f.fsf@gitster.g>
- In-Reply-To
- <72e0481b643e98c5670eee0bf5c199c4fb693b16.1656422759.git.gitgitgadget@gmail.com>
"Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 16 quoted lines
> From: Derrick Stolee <derrickstolee@github.com> > > The previous change introduced the 'git rebase --update-refs' option > which added 'update-ref <ref>' commands to the todo list of an > interactive rebase. > > Teach Git to record the HEAD position when reaching these 'update-ref' > commands. The ref/OID pair is stored in the > $GIT_DIR/rebase-merge/update-refs file. A previous change parsed this > file to avoid having other processes updating the refs in that file > while the rebase is in progress. > > Not only do we update the file when the sequencer reaches these > 'update-ref' commands, we then update the refs themselves at the end of > the rebase sequence. If the rebase is aborted before this final step, > then the refs are not updated.
So, in general, we would
* first scan the range of commits being rebased * compute what should happen and write the "todo" thing * write also "update-refs" to lick the branches to repel others * execute the "todo" insns one by one, possibly giving control back
And this order is important---update-refs file is written fairly early, and the branches potentially involved in the rebase are all protected during the time-consuming (due to possibility of manual conflict resolution) execution step.
Makes sense.
Show 34 quoted lines
> diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
> index 3cd20733bc8..63a69bc073e 100755
> --- a/t/t3404-rebase-interactive.sh
> +++ b/t/t3404-rebase-interactive.sh
> @@ -1813,6 +1813,29 @@ test_expect_success '--update-refs adds commands with --rebase-merges' '
> )
> '
>
> +compare_two_refs () {
> + git rev-parse $1 >expect &&
> + git rev-parse $2 >actual &&
> + test_cmp expect actual
> +}
> +
> +test_expect_success '--update-refs updates refs correctly' '
> + git checkout -B update-refs no-conflict-branch &&
> + git branch -f base HEAD~4 &&
> + git branch -f first HEAD~3 &&
> + git branch -f second HEAD~3 &&
> + git branch -f third HEAD~1 &&
> + test_commit extra2 fileX &&
> + git commit --amend --fixup=L &&
> +
> + git rebase -i --autosquash --update-refs primary &&
> +
> + compare_two_refs HEAD~3 refs/heads/first &&
> + compare_two_refs HEAD~3 refs/heads/second &&
> + compare_two_refs HEAD~1 refs/heads/third &&
> + compare_two_refs HEAD refs/heads/no-conflict-branch
> +'
> +
> # This must be the last test in this file
> test_expect_success '$EDITOR and friends are unchanged' '
> test_editor_unchangedIt would be nice to also have a test that makes sure that other people will be prevented from checking out a branch whose tips may be updated at the end.
Thanks.