Hi, Attached is the second re-roll of my series to teach "core.alternateRefsCommand" and "core.alternateRefsPrefixes". I have included a range-diff below (which I have taught my scripts to do by default now), but will summarize the changes as usual: * Clean up t5410 according to Peff's suggestions in [1]: * Simplify many `git update-ref -d`'s into one `git update-ref --stdin`. * Use `echo >`, instead of `printf >` to write an alternate repository. * Avoid placing Git on the left-hand side of a pipe. * Use 'write_script', instead of embedding the same code in a lengthy 'test_config'. * Add a motivating example in Documentation/config.txt, per Peff's suggestion in [1]. * Use `printf "%s .have\n"` with many arguments instead of another `cat <<-EOF` block and extract it into `expect_haves`, per [2]. * Do not use `grep -o` in `extract_haves`, thus making it portable. Per [3]. [1]: https://public-inbox.org/git/20180920193751.GC29603@xxxxxxxxxxxxxxxxxxxxx/ [2]: https://public-inbox.org/git/CAPig+cT7WTyBCQZ75WSjmBqiui383YrKqoHqbLASQkOaGVTfVA@xxxxxxxxxxxxxx/ [3]: https://public-inbox.org/git/xmqqlg7ux0st.fsf@xxxxxxxxxxxxxxxxxxxxxxxxx/ Taylor Blau (3): transport.c: extract 'fill_alternate_refs_command' transport.c: introduce core.alternateRefsCommand transport.c: introduce core.alternateRefsPrefixes Documentation/config.txt | 18 ++++++++++++ t/t5410-receive-pack.sh | 62 ++++++++++++++++++++++++++++++++++++++++ transport.c | 34 ++++++++++++++++++---- 3 files changed, 108 insertions(+), 6 deletions(-) create mode 100755 t/t5410-receive-pack.sh Range-diff against v1: 1: 6e3a58afe7 = 1: 6e3a58afe7 transport.c: extract 'fill_alternate_refs_command' 2: 4c4900722c ! 2: 9797f52551 transport.c: introduce core.alternateRefsCommand @@ -42,6 +42,11 @@ + the shell to execute the specified command instead of + linkgit:git-for-each-ref[1]. The first argument is the path of the alternate. + Output must be of the form: `%(objectname) SPC %(refname)`. +++ ++This is useful when a repository only wishes to advertise some of its ++alternate's references as ".have"'s. For example, to only advertise branch ++heads, configure `core.alternateRefsCommand` to the path of a script which runs ++`git --git-dir="$1" for-each-ref refs/heads`. + core.bare:: If true this repository is assumed to be 'bare' and has no @@ -70,32 +75,39 @@ + ( + cd fork && + git config receive.advertisealternates true && -+ git update-ref -d refs/heads/a && -+ git update-ref -d refs/heads/b && -+ git update-ref -d refs/heads/c && -+ git update-ref -d refs/heads/master && -+ git update-ref -d refs/tags/one && -+ git update-ref -d refs/tags/two && -+ git update-ref -d refs/tags/three && -+ printf "../../.git/objects" >objects/info/alternates ++ cat <<-EOF | git update-ref --stdin && ++ delete refs/heads/a ++ delete refs/heads/b ++ delete refs/heads/c ++ delete refs/heads/master ++ delete refs/tags/one ++ delete refs/tags/two ++ delete refs/tags/three ++ EOF ++ echo "../../.git/objects" >objects/info/alternates + ) +' + ++expect_haves () { ++ printf "%s .have\n" $(git rev-parse $@) >expect ++} ++ +extract_haves () { -+ depacketize - | grep -o '^.* \.have' ++ depacketize - | grep '\.have' | sed -e 's/\\0.*$//g' +} + +test_expect_success 'with core.alternateRefsCommand' ' -+ test_config -C fork core.alternateRefsCommand \ -+ "git --git-dir=\"\$1\" for-each-ref \ -+ --format=\"%(objectname) %(refname)\" \ -+ refs/heads/a refs/heads/c;:" && -+ cat >expect <<-EOF && -+ $(git rev-parse a) .have -+ $(git rev-parse c) .have ++ write_script fork/alternate-refs <<-\EOF && ++ git --git-dir="$1" for-each-ref \ ++ --format="%(objectname) %(refname)" \ ++ refs/heads/a \ ++ refs/heads/c + EOF -+ printf "0000" | git receive-pack fork | extract_haves >actual && -+ test_cmp expect actual ++ test_config -C fork core.alternateRefsCommand alternate-refs && ++ expect_haves a c >expect && ++ printf "0000" | git receive-pack fork >actual && ++ extract_haves <actual >actual.haves && ++ test_cmp expect actual.haves +' + +test_done 3: 3639e90588 ! 3: 6e8f65a16d transport.c: introduce core.alternateRefsPrefixes @@ -40,13 +40,14 @@ --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ - linkgit:git-for-each-ref[1]. The first argument is the path of the alternate. - Output must be of the form: `%(objectname) SPC %(refname)`. + heads, configure `core.alternateRefsCommand` to the path of a script which runs + `git --git-dir="$1" for-each-ref refs/heads`. +core.alternateRefsPrefixes:: + When listing references from an alternate, list only references that begin -+ with the given prefix. To list multiple prefixes, separate them with a -+ whitespace character. If `core.alternateRefsCommand` is set, setting ++ with the given prefix. Prefixes match as if they were given as arguments to ++ linkgit:git-for-each-ref[1]. To list multiple prefixes, separate them with ++ whitespace. If `core.alternateRefsCommand` is set, setting + `core.alternateRefsPrefixes` has no effect. + core.bare:: @@ -57,18 +58,15 @@ --- a/t/t5410-receive-pack.sh +++ b/t/t5410-receive-pack.sh @@ - test_cmp expect actual + test_cmp expect actual.haves ' +test_expect_success 'with core.alternateRefsPrefixes' ' + test_config -C fork core.alternateRefsPrefixes "refs/tags" && -+ cat >expect <<-EOF && -+ $(git rev-parse one) .have -+ $(git rev-parse three) .have -+ $(git rev-parse two) .have -+ EOF -+ printf "0000" | git receive-pack fork | extract_haves >actual && -+ test_cmp expect actual ++ expect_haves one three two >expect && ++ printf "0000" | git receive-pack fork >actual && ++ extract_haves <actual >actual.haves && ++ test_cmp expect actual.haves +' + test_done -- 2.19.0.221.g150f307af