Thread (2 messages) 2 messages, 2 authors, 2021-04-05

Re: should git maintenance prefetch be taught to honor remote.fetch refspec?

From: Derrick Stolee <hidden>
Date: 2021-04-05 13:20:47

Possibly related (same subject, not in this thread)

On 4/4/2021 7:10 PM, Junio C Hamano wrote:
Derrick Stolee [off-list ref] writes:
quoted
On 4/2/2021 5:19 PM, Junio C Hamano wrote:
quoted
I do not recommend unparsed refspec and textually munging, by the
way.  Doesn't

	git fetch master:remotes/origin/master

first parse to normalize the src/dst sides to turn it into

	git fetch refs/heads/master:refs/remotes/origin/master
I tried to jug my memory in this area a bit by reading the relevant
code.  For non-wildcard refspec, e.g. with

    [remote "origin"]
	url = ../git.git/
	fetch = master:remotes/origin/master
	tagopt = --no-tags

you'd get

    $ git fetch -v
    From ../git
     * [new branch]            master     -> origin/master
    $ git for-each-ref
    2e36527f23b7f6ae15e6f21ac3b08bf3fed6ee48 commit	refs/remotes/origin/master

It all happens inside remote.c::get_fetch_map(), I think.
I see there that some refs are being matched with some
expectation of remote refs inside get_remote_ref() (which
calls find_ref_by_name_abbrev() as a helper). There does not
appear to be any place that modifies the refs directly in
general, and instead refs are matched from the refspec using
standard short-ref rules.

This is particularly shown in examples like "git push topic"
never modifying the push-refspec from having 'src' equal to
"topic" and instead the ref machinery discovers that "topic"
really means "refs/heads/topic".

I took your advice to not munge raw refpsecs and instead
worked directly on the 'dst' of the struct refspec_item. This
required adding a method that formats a refspec, which I test
carefully. I spent about an hour trying to have parse_refspec()
add the appropriate "refs/" prefix, but it becomes difficult
when we intend to make a distinction between "refs/heads/" and
other sub-areas within "refs/". Finally, I punted on that
conversion and made the logic in 'prefetch' extremely obvious:

1. If the refspec's 'dst' starts with "refs/", then replace
   that prefix with "refs/prefetch/".

2. If the refspec's 'dst' does not start with "refs/", then
   concatenate "refs/prefetch/" and 'dst'.

This will keep a roughly-equivalent partition of refs (some
might have previously collided that will not any more).

I have posted my patch series [1], so please take a look. It
builds up the infrastructure to properly test such a refspec
expansion, if we wish to do so.

[1] https://lore.kernel.org/git/pull.924.git.1617627856.gitgitgadget@gmail.com/ (local)

Thanks,
-Stolee
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help