Skip to content

Commit

Permalink
Merge branch 'jk/negative-hiderefs'
Browse files Browse the repository at this point in the history
A negative !ref entry in multi-value transfer.hideRefs
configuration can be used to say "don't hide this one".

* jk/negative-hiderefs:
  refs: support negative transfer.hideRefs
  docs/config.txt: reorder hideRefs config
  • Loading branch information
gitster committed Aug 19, 2015
2 parents 138014c + 2bc31d1 commit 824a0be
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 22 deletions.
37 changes: 20 additions & 17 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2313,13 +2313,10 @@ receive.denyNonFastForwards::
set when initializing a shared repository.

receive.hideRefs::
String(s) `receive-pack` uses to decide which refs to omit
from its initial advertisement. Use more than one
definitions to specify multiple prefix strings. A ref that
are under the hierarchies listed on the value of this
variable is excluded, and is hidden when responding to `git
push`, and an attempt to update or delete a hidden ref by
`git push` is rejected.
This variable is the same as `transfer.hideRefs`, but applies
only to `receive-pack` (and so affects pushes, but not fetches).
An attempt to update or delete a hidden ref by `git push` is
rejected.

receive.updateServerInfo::
If set to true, git-receive-pack will run git-update-server-info
Expand Down Expand Up @@ -2607,9 +2604,18 @@ transfer.fsckObjects::
Defaults to false.

transfer.hideRefs::
This variable can be used to set both `receive.hideRefs`
and `uploadpack.hideRefs` at the same time to the same
values. See entries for these other variables.
String(s) `receive-pack` and `upload-pack` use to decide which
refs to omit from their initial advertisements. Use more than
one definition to specify multiple prefix strings. A ref that is
under the hierarchies listed in the value of this variable is
excluded, and is hidden when responding to `git push` or `git
fetch`. See `receive.hideRefs` and `uploadpack.hideRefs` for
program-specific versions of this config.
+
You may also include a `!` in front of the ref name to negate the entry,
explicitly exposing it, even if an earlier entry marked it as hidden.
If you have multiple hideRefs values, later entries override earlier ones
(and entries in more-specific config files override less-specific ones).

transfer.unpackLimit::
When `fetch.unpackLimit` or `receive.unpackLimit` are
Expand All @@ -2624,13 +2630,10 @@ uploadarchive.allowUnreachable::
`false`.

uploadpack.hideRefs::
String(s) `upload-pack` uses to decide which refs to omit
from its initial advertisement. Use more than one
definitions to specify multiple prefix strings. A ref that
are under the hierarchies listed on the value of this
variable is excluded, and is hidden from `git ls-remote`,
`git fetch`, etc. An attempt to fetch a hidden ref by `git
fetch` will fail. See also `uploadpack.allowTipSHA1InWant`.
This variable is the same as `transfer.hideRefs`, but applies
only to `upload-pack` (and so affects only fetches, not pushes).
An attempt to fetch a hidden ref by `git fetch` will fail. See
also `uploadpack.allowTipSHA1InWant`.

uploadpack.allowTipSHA1InWant::
When `uploadpack.hideRefs` is in effect, allow `upload-pack`
Expand Down
18 changes: 13 additions & 5 deletions refs.c
Original file line number Diff line number Diff line change
Expand Up @@ -4371,17 +4371,25 @@ int parse_hide_refs_config(const char *var, const char *value, const char *secti

int ref_is_hidden(const char *refname)
{
struct string_list_item *item;
int i;

if (!hide_refs)
return 0;
for_each_string_list_item(item, hide_refs) {
for (i = hide_refs->nr - 1; i >= 0; i--) {
const char *match = hide_refs->items[i].string;
int neg = 0;
int len;
if (!starts_with(refname, item->string))

if (*match == '!') {
neg = 1;
match++;
}

if (!starts_with(refname, match))
continue;
len = strlen(item->string);
len = strlen(match);
if (!refname[len] || refname[len] == '/')
return 1;
return !neg;
}
return 0;
}
Expand Down
23 changes: 23 additions & 0 deletions t/t5512-ls-remote.sh
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ test_expect_success 'Report match with --exit-code' '
test_cmp expect actual
'

test_expect_success 'set up some extra tags for ref hiding' '
git tag magic/one &&
git tag magic/two
'

for configsection in transfer uploadpack
do
test_expect_success "Hide some refs with $configsection.hiderefs" '
Expand All @@ -138,6 +143,24 @@ do
sed -e "/ refs\/tags\//d" >expect &&
test_cmp expect actual
'

test_expect_success "Override hiding of $configsection.hiderefs" '
test_when_finished "test_unconfig $configsection.hiderefs" &&
git config --add $configsection.hiderefs refs/tags &&
git config --add $configsection.hiderefs "!refs/tags/magic" &&
git config --add $configsection.hiderefs refs/tags/magic/one &&
git ls-remote . >actual &&
grep refs/tags/magic/two actual &&
! grep refs/tags/magic/one actual
'

done

test_expect_success 'overrides work between mixed transfer/upload-pack hideRefs' '
test_config uploadpack.hiderefs refs/tags &&
test_config transfer.hiderefs "!refs/tags/magic" &&
git ls-remote . >actual &&
grep refs/tags/magic actual
'

test_done

0 comments on commit 824a0be

Please sign in to comment.