Skip to content

Commit

Permalink
transport.c: introduce core.alternateRefsPrefixes
Browse files Browse the repository at this point in the history
The recently-introduced "core.alternateRefsCommand" allows callers to
specify with high flexibility the tips that they wish to advertise from
alternates. This flexibility comes at the cost of some inconvenience
when the caller only wishes to limit the advertisement to one or more
prefixes.

For example, to advertise only tags, a caller using
'core.alternateRefsCommand' would have to do:

  $ git config core.alternateRefsCommand ' \
      f() { git -C "$1" for-each-ref \
              refs/tags --format="%(objectname)" }; f "$@"'

The above is cumbersome to write, so let's introduce a
"core.alternateRefsPrefixes" to address this common case. Instead, the
caller can run:

  $ git config core.alternateRefsPrefixes 'refs/tags'

Which will behave identically to the longer example using
"core.alternateRefsCommand".

Since the value of "core.alternateRefsPrefixes" is appended to 'git
for-each-ref' and then executed, include a "--" before taking the
configured value to avoid misinterpreting arguments as flags to 'git
for-each-ref'.

In the case that the caller wishes to specify multiple prefixes, they
may separate them by whitespace. If "core.alternateRefsCommand" is set,
it will take precedence over "core.alternateRefsPrefixes".

Signed-off-by: Taylor Blau <[email protected]>
Acked-by: Jeff King <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
ttaylorr authored and gitster committed Oct 9, 2018
1 parent 89284c1 commit 40f327f
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,13 @@ Note that you cannot generally put `git for-each-ref` directly into the config
value, as it does not take a repository path as an argument (but you can wrap
the command above in a shell script).

core.alternateRefsPrefixes::
When listing references from an alternate, list only references that begin
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::
If true this repository is assumed to be 'bare' and has no
working directory associated with it. If this is the case a
Expand Down
8 changes: 8 additions & 0 deletions t/t5410-receive-pack-alternates.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,12 @@ test_expect_success 'with core.alternateRefsCommand' '
test_cmp expect actual.haves
'

test_expect_success 'with core.alternateRefsPrefixes' '
test_config -C fork core.alternateRefsPrefixes "refs/heads/private" &&
git rev-parse private/branch >expect &&
printf "0000" | git receive-pack fork >actual &&
extract_haves <actual >actual.haves &&
test_cmp expect actual.haves
'

test_done
5 changes: 5 additions & 0 deletions transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -1341,6 +1341,11 @@ static void fill_alternate_refs_command(struct child_process *cmd,
argv_array_pushf(&cmd->args, "--git-dir=%s", repo_path);
argv_array_push(&cmd->args, "for-each-ref");
argv_array_push(&cmd->args, "--format=%(objectname)");

if (!git_config_get_value("core.alternateRefsPrefixes", &value)) {
argv_array_push(&cmd->args, "--");
argv_array_split(&cmd->args, value);
}
}

cmd->env = local_repo_env;
Expand Down

0 comments on commit 40f327f

Please sign in to comment.