Jeff King <[email protected]> writes:
> We de-duplicate ".have" refs among themselves, but never
> check if they are duplicates of our local refs. It's not
> unreasonable that they would be if we are a "--shared" or
> "--reference" clone of a similar repository; we'd have all
> the same tags.
>
> We can handle this by inserting our local refs into the
> oidset, but obviously not suppressing duplicates (since the
> refnames are important).
Makes sense.
> +extract_ref_advertisement () {
> + perl -lne '
> + # \\ is there to skip capabilities after \0
> + /push< ([^\\]+)/ or next;
> + exit 0 if $1 eq "0000";
> + print $1;
> + '
Parsing TRACE_PACKET output? Yuck. But I think this has to do, as
any other solution will bound to be uglier.
> +test_expect_success 'receive-pack de-dupes .have lines' '
> + git init shared &&
> + git -C shared commit --allow-empty -m both &&
> + git clone -s shared fork &&
> + (
> + cd shared &&
> + git checkout -b only-shared &&
> + git commit --allow-empty -m only-shared &&
> + git update-ref refs/heads/foo HEAD
> + ) &&
> +
> + # Notable things in this expectation:
> + # - local refs are not de-duped
> + # - .have does not duplicate locals
> + # - .have does not duplicate itself
> + local=$(git -C fork rev-parse HEAD) &&
> + shared=$(git -C shared rev-parse only-shared) &&
> + cat >expect <<-EOF &&
> + $local refs/heads/master
> + $local refs/remotes/origin/HEAD
> + $local refs/remotes/origin/master
> + $shared .have
> + EOF
We may want to sort this thing and the extracted one when comparing;
the order of the entries is not part of the feature we cast in stone.
> +
> + GIT_TRACE_PACKET=$(pwd)/trace git push fork HEAD:foo &&
> + extract_ref_advertisement <trace >refs &&
> + test_cmp expect refs
> +'
> +
> test_done