diff options
Diffstat (limited to 't')
-rw-r--r-- | t/README | 108 | ||||
-rwxr-xr-x | t/access.t | 53 | ||||
-rwxr-xr-x | t/fedora-root-smart-http-test-setup | 95 | ||||
-rwxr-xr-x | t/git-config.t | 1 | ||||
-rwxr-xr-x | t/manjaro-root-smart-http-test-setup | 114 | ||||
-rwxr-xr-x | t/mirror-test | 16 | ||||
-rwxr-xr-x | t/mirror-test-setup.sh | 34 | ||||
-rwxr-xr-x | t/partial-copy.t | 6 | ||||
-rwxr-xr-x | t/repo-specific-hooks.t | 12 | ||||
-rwxr-xr-x | t/smart-http | 6 | ||||
-rwxr-xr-x | t/smart-http.root-setup | 2 | ||||
-rwxr-xr-x | t/templates.t | 1322 |
12 files changed, 1726 insertions, 43 deletions
@@ -1,7 +1,26 @@ +# instructions for running the tests -============================================ -WARNING: THE TEST SUITE DELETES STUFF FIRST! -============================================ +# Pre-requisites + +Install the following packages: + +* Manjaro (and probably Arch): + + pacman -S perl-json perl-json-xs apache + +* Fedora (and probably CentOS): + + dnf install -y perl-Test-Harness perl-JSON perl-JSON-XS httpd httpd-tools + +* others: + + (TBD) + +# RUNNING THE MAIN TEST SUITE + + ====================================== + WARNING: THE TEST SUITE DELETES STUFF! + ====================================== Please run the tests ONLY on a userid where it's ok to LOSE DATA. @@ -12,3 +31,86 @@ On such a userid, clone gitolite then run this command in the clone: http://gitolite.com/gitolite/testing.html has more details. Alternatively, http://gitolite.com/gitolite/req.html#trying will help you try out gitolite if you want to play with gitolite safely. + +# RUNNING THE HTTP AND MIRROR TESTS + + ====================================== + WARNING: THE TEST SUITE DELETES STUFF! + ====================================== + +The http and mirror tests require a lot more preparation, including commands +and/or scripts to be run as root, so they're not invoked when you simply run +"prove" as above. + +## Manjaro + +1. Create 3 users: sam, frodo, and gollum (`useradd -m`). + +2. Assuming you're running the tests using a local user called `g3`, run + `visudo` and add the following line: + + g3 ALL = (sam,frodo,gollum) NOPASSWD: ALL + + Test this by running this command from within `g3` and making sure you get + the correct results: + + sudo -u sam -i pwd + # should print /home/sam + # similarly make sure frodo and gollum also give correct results + + The mirror test will not run if this does not work. That does not mean + *mirroring* will not work; only the test suite depends on this feature. + +3. Manjaro does not, by default, add $HOME/bin to $PATH, so you will need the + following on at least sam, frodo, and gollum: + + # copy-paste this into a root terminal + for u in frodo sam gollum; do + grep '$HOME/bin' /home/$u/.bash_profile || echo 'export PATH="$HOME/bin:$PATH"' >> /home/$u/.bash_profile + done + + Again, test this by running: + + sudo -u sam -i echo '$PATH' + + and making sure the output starts with `/home/sam/bin:` (and similarly for + frodo and gollum). + +4. Take a look inside `t/manjaro-root-smart-http-test-setup` to make sure + everything looks sane (because you have to run it as root!!), then run it + as root. + +5. Now you are ready to run the last two tests: + + GITOLITE_TEST=y prove t/smart-http + GITOLITE_TEST=y prove t/mirror-test + +## Fedora + +1. Create 3 users: sam, frodo, and gollum (`useradd`). + +2. Assuming you're running the tests using a local user called `g3`, run + `visudo` and add the following line: + + g3 ALL = (sam,frodo,gollum) NOPASSWD: ALL + + Test this by running this command from within `g3` and making sure you get + the correct results: + + sudo -u sam -i pwd + # should print /home/sam + # similarly make sure frodo and gollum also give correct results + + The mirror test will not run if this does not work. That does not mean + *mirroring* will not work; only the test suite depends on this feature. + +3. Take a look inside `t/fedora-root-smart-http-test-setup` to make sure + everything looks sane (because you have to run it as root!!), then run it + as root. + +4. Now you are ready to run the last two tests: + + prove t/smart-http + prove t/mirror-test + +vim: ft=markdown @@ -9,7 +9,7 @@ use Gitolite::Test; # test 'gitolite access' # ---------------------------------------------------------------------- -try "plan 216"; +try "plan 254"; confreset;confadd ' @admins = admin dev1 @@ -200,3 +200,54 @@ try " gitolite access c1 u2 +; ok gitolite access c1 u2 C; !ok "; + +confreset;confadd ' + repo foo + R = u1 + RW = u2 + RW+ = u3 + + repo bar + R = u1 + RW = u2 + RW+ = u3 + RW+CDM = u6 + +'; + +try "ADMIN_PUSH set4; !/FATAL/" or die text(); + +try " + gitolite access foo u1 +; !ok + gitolite access foo u2 +; !ok + gitolite access foo u3 +; ok + gitolite access foo u1 C; !ok + gitolite access foo u2 C; ok + gitolite access foo u3 C; ok + gitolite access foo u1 D; !ok + gitolite access foo u2 D; !ok + gitolite access foo u3 D; ok + gitolite access foo u1 M; !ok + gitolite access foo u2 M; ok + gitolite access foo u3 M; ok + + gitolite access bar u1 +; !ok + gitolite access bar u2 +; !ok + gitolite access bar u3 +; ok + gitolite access bar u1 C; !ok + gitolite access bar u2 C; !ok + gitolite access bar u3 C; !ok + gitolite access bar u1 D; !ok + gitolite access bar u2 D; !ok + gitolite access bar u3 D; !ok + gitolite access bar u1 M; !ok + gitolite access bar u2 M; !ok + gitolite access bar u3 M; !ok + + gitolite access bar u6 R; ok + gitolite access bar u6 W; ok + gitolite access bar u6 +; ok + gitolite access bar u6 C; ok + gitolite access bar u6 D; ok + gitolite access bar u6 M; ok +"; diff --git a/t/fedora-root-smart-http-test-setup b/t/fedora-root-smart-http-test-setup new file mode 100755 index 0000000..869d13d --- /dev/null +++ b/t/fedora-root-smart-http-test-setup @@ -0,0 +1,95 @@ +#!/bin/bash + +# gitolite http mode TESTING setup for Fedora +# - Probably works for CentOS also; if someone tests it let me know +# - Use the comments to create a version for your distro if needed + +# CAUTION: This script needs to be run as root, so you best eyeball it at +# least once to make sure you know what changes it is making. + +# WARNING: clobbers /usr/share/httpd/gitolite-home, and also creates 7 http +# users with trivial passwords FOR TESTING. + +# HOWEVER: if you remove some of that, especially the part that creates test +# users, this *should* work as a quick "setup gitolite http mode" script. + +# CAUTION: This script assumes the httpd.conf file is pretty much the default +# "as shipped" version. If you fiddled with it, this script *may* break. +# It's on you to determine if that is the case and manually simulate the +# actions of this script. It's not that hard, and anyway it's just once (for +# a given server) so it's not too bad. + +# ---------------------------------------------------------------------- + +cd ~apache +# should be /usr/share/httpd; you may want to check just to be safe +export GITOLITE_HTTP_HOME=$PWD/gitolite-home + +[[ -d gitolite-home ]] && { + [[ $GITOLITE_TEST != y ]] && { + echo "If you're OK with clobbering $GITOLITE_HTTP_HOME, please rerun with +environment variable GITOLITE_TEST set to 'y'." + exit 1; + } +} + +rm -rf gitolite-home +mkdir gitolite-home + +# setup apache conf for gitolite +cd /etc/httpd/conf.d +[[ -f gitolite.conf ]] || { + cat > gitolite.conf <<-EOF + SetEnv GIT_PROJECT_ROOT $GITOLITE_HTTP_HOME/repositories + ScriptAlias /git/ $GITOLITE_HTTP_HOME/gitolite-source/src/gitolite-shell/ + ScriptAlias /gitmob/ $GITOLITE_HTTP_HOME/gitolite-source/src/gitolite-shell/ + SetEnv GITOLITE_HTTP_HOME $GITOLITE_HTTP_HOME + SetEnv GIT_HTTP_EXPORT_ALL + + <Location /git> + AuthType Basic + AuthName "Private Git Access" + Require valid-user + AuthUserFile $GITOLITE_HTTP_HOME/gitolite-http-authuserfile + </Location> + EOF +} + +# get the gitolite sources +cd $GITOLITE_HTTP_HOME + +if [[ -d /tmp/gitolite.git ]]; then + git clone /tmp/gitolite.git gitolite-source + # I do this because I have to test stuff *before* it gets to github, so I + # can't simply clone what's on github. Instead, I use a local + # world-readable bare repo cloned from my dev environment. +else + git clone 'https://github.com/sitaramc/gitolite' gitolite-source +fi + +# make the bin directory, and add it to PATH +cd gitolite-source +mkdir $GITOLITE_HTTP_HOME/bin +./install -ln $GITOLITE_HTTP_HOME/bin +export PATH=$PATH:$GITOLITE_HTTP_HOME/bin + +# come back to base, then run setup. Notice that you have to point HOME to +# the right place, even if it is just for this command +cd $GITOLITE_HTTP_HOME +HOME=$GITOLITE_HTTP_HOME gitolite setup -a admin + +# insert some essential lines at the beginning of the rc file +echo '$ENV{PATH} .= ":$ENV{GITOLITE_HTTP_HOME}/bin";' > 1 +echo >> 1 +cat .gitolite.rc >> 1 +\mv 1 .gitolite.rc + +# create users "admin" and "u1" thru "u6" for testing +htpasswd -bc $GITOLITE_HTTP_HOME/gitolite-http-authuserfile admin admin +seq 6 | xargs -I % htpasswd -b $GITOLITE_HTTP_HOME/gitolite-http-authuserfile u% u% + +# fix up ownership +chown -R apache:apache $GITOLITE_HTTP_HOME + +# restart httpd to make it pick up all the new stuff +systemctl restart httpd diff --git a/t/git-config.t b/t/git-config.t index 86a3a7b..fb5097e 100755 --- a/t/git-config.t +++ b/t/git-config.t @@ -137,7 +137,6 @@ try " $t = join("\n", sort (lines())); cmp $t, 'bar.git/config: bare = true -bar.git/config:[foo] foo.git/config: bar = f1 foo.git/config: bare = true foo.git/config:[foo] diff --git a/t/manjaro-root-smart-http-test-setup b/t/manjaro-root-smart-http-test-setup new file mode 100755 index 0000000..f254b55 --- /dev/null +++ b/t/manjaro-root-smart-http-test-setup @@ -0,0 +1,114 @@ +#!/bin/bash + +# gitolite http mode TESTING setup for Manjaro +# - Probably works for Arch also; if someone tests it let me know +# - Use the comments to create a version for your distro if needed + +# CAUTION: This script needs to be run as root, so you best eyeball it at +# least once to make sure you know what changes it is making. + +# WARNING: clobbers /srv/http/gitolite-home, and also creates 7 http +# users with trivial passwords FOR TESTING. + +# HOWEVER: if you remove some of that, especially the part that creates test +# users, this *should* work as a quick "setup gitolite http mode" script. + +# CAUTION: This script assumes the httpd.conf file is pretty much the default +# "as shipped" version. If you fiddled with it, this script *may* break. +# It's on you to determine if that is the case and manually simulate the +# actions of this script. It's not that hard, and anyway it's just once (for +# a given server) so it's not too bad. + +# ---------------------------------------------------------------------- +# BEGIN APACHE CONF CHANGES + +# Unlike Fedora, Manjaro's default httpd.conf does not contain a wildcard +# include for stuff in conf.d; they're all explicitly included, so we need to +# include gitolite.conf. +cd /etc/httpd/conf +grep ^Include.*gitolite.conf httpd.conf || + printf "\n%s\n%s\n" '# gitolite http mode' 'Include conf/extra/gitolite.conf' >> httpd.conf + +# Again, unlike Fedora, Manjaro's default conf does not come with cgi enabled. +# In fact, the directive is both commented out *and* inside an "IF" block for +# some other module. Since I don't plan to be an expert on apache, I will +# punt by including the required LoadModule line before the first LoadModule +# line that is not in an "if" block (i.e., not indented). +grep '^LoadModule cgi_module modules/mod_cgi.so' httpd.conf || + perl -i -pE 'say "LoadModule cgi_module modules/mod_cgi.so" if /^LoadModule/ and not $flag++' httpd.conf + +# END APACHE CONF CHANGES +# ---------------------------------------------------------------------- + +cd ~http +# should be /srv/http; you may want to check just to be safe +export GITOLITE_HTTP_HOME=$PWD/gitolite-home + +[[ -d gitolite-home ]] && { + [[ $GITOLITE_TEST != y ]] && { + echo "If you're OK with clobbering $GITOLITE_HTTP_HOME, please rerun with +environment variable GITOLITE_TEST set to 'y'." + exit 1; + } +} + +rm -rf gitolite-home +mkdir gitolite-home + +# setup apache conf for gitolite +cd /etc/httpd/conf/extra +[[ -f gitolite.conf ]] || { + cat > gitolite.conf <<-EOF + SetEnv GIT_PROJECT_ROOT $GITOLITE_HTTP_HOME/repositories + ScriptAlias /git/ $GITOLITE_HTTP_HOME/gitolite-source/src/gitolite-shell/ + ScriptAlias /gitmob/ $GITOLITE_HTTP_HOME/gitolite-source/src/gitolite-shell/ + SetEnv GITOLITE_HTTP_HOME $GITOLITE_HTTP_HOME + SetEnv GIT_HTTP_EXPORT_ALL + + <Location /git> + AuthType Basic + AuthName "Private Git Access" + Require valid-user + AuthUserFile $GITOLITE_HTTP_HOME/gitolite-http-authuserfile + </Location> + EOF +} + +# get the gitolite sources +cd $GITOLITE_HTTP_HOME + +if [[ -d /tmp/gitolite.git ]]; then + git clone /tmp/gitolite.git gitolite-source + # I do this because I have to test stuff *before* it gets to github, so I + # can't simply clone what's on github. Instead, I use a local + # world-readable bare repo cloned from my dev environment. +else + git clone 'https://github.com/sitaramc/gitolite' gitolite-source +fi + +# make the bin directory, and add it to PATH +cd gitolite-source +mkdir $GITOLITE_HTTP_HOME/bin +./install -ln $GITOLITE_HTTP_HOME/bin +export PATH=$PATH:$GITOLITE_HTTP_HOME/bin + +# come back to base, then run setup. Notice that you have to point HOME to +# the right place, even if it is just for this command +cd $GITOLITE_HTTP_HOME +HOME=$GITOLITE_HTTP_HOME gitolite setup -a admin + +# insert some essential lines at the beginning of the rc file +echo '$ENV{PATH} .= ":$ENV{GITOLITE_HTTP_HOME}/bin";' > 1 +echo >> 1 +cat .gitolite.rc >> 1 +\mv 1 .gitolite.rc + +# create users "admin" and "u1" thru "u6" for testing +htpasswd -bc $GITOLITE_HTTP_HOME/gitolite-http-authuserfile admin admin +seq 6 | xargs -I % htpasswd -b $GITOLITE_HTTP_HOME/gitolite-http-authuserfile u% u% + +# fix up ownership +chown -R http:http $GITOLITE_HTTP_HOME + +# restart httpd to make it pick up all the new stuff +systemctl restart httpd diff --git a/t/mirror-test b/t/mirror-test index 627dc74..3ace59b 100755 --- a/t/mirror-test +++ b/t/mirror-test @@ -91,7 +91,7 @@ try " git add keydir; ok git commit -m 6keys; ok git push; ok - /To frodo\@localhost:gitolite-admin/ + /To localhost:gitolite-admin/ /master -> master/ sleep 5 git rev-parse HEAD @@ -118,7 +118,7 @@ try " cd sga; ok empty; ok git push; ok - /To sam\@localhost:gitolite-admin/ + /To localhost:gitolite-admin/ /master -> master/ sleep 5 git rev-parse HEAD @@ -145,9 +145,9 @@ try " cd gga; ok empty; ok git push; !ok - !/To gollum\@localhost:gitolite-admin/ + !/To localhost:gitolite-admin/ !/master -> master/ - /gollum: pushing 'gitolite-admin' to slave 'gollum' not allowed/ + /gollum: pushing 'gitolite-admin' to copy 'gollum' not allowed/ git rev-parse HEAD "; @@ -193,7 +193,7 @@ try " cd fga; ok empty; ok git push; ok - /To frodo\@localhost:gitolite-admin/ + /To localhost:gitolite-admin/ /master -> master/ sleep 5 @@ -290,7 +290,7 @@ try " cd fr1 empty git push - /frodo: pushing 'r1' to slave 'frodo' not allowed/ + /frodo: pushing 'r1' to copy 'frodo' not allowed/ cd .. git clone sam\@localhost:r1 sr1; ok cd sr1 @@ -335,7 +335,7 @@ try " cd fr1 tc b git push - /frodo: pushing 'r1' to slave 'frodo' not allowed/ + /frodo: pushing 'r1' to copy 'frodo' not allowed/ cd .. git clone frodo\@localhost:r2 fr2; ok cd fr2 @@ -441,5 +441,5 @@ try " cd nvsfrodo empty git push origin master; !ok - /FATAL: frodo: 'sam' is not a valid slave for 'nvsfrodo'/ + /FATAL: frodo: 'sam' is not a valid copy for 'nvsfrodo'/ "; diff --git a/t/mirror-test-setup.sh b/t/mirror-test-setup.sh index b35364c..32bc462 100755 --- a/t/mirror-test-setup.sh +++ b/t/mirror-test-setup.sh @@ -66,7 +66,7 @@ ssh $mainhost@localhost info lines=" repo gitolite-admin option mirror.master = frodo - option mirror.slaves-1 = sam gollum + option mirror.copies-1 = sam gollum option mirror.redirectOK = sam repo r1 @@ -74,14 +74,14 @@ repo r1 RW = u2 R = u3 option mirror.master = sam - option mirror.slaves-1 = frodo + option mirror.copies-1 = frodo repo r2 RW+ = u2 RW = u3 R = u4 option mirror.master = sam - option mirror.slaves-1 = frodo gollum + option mirror.copies-1 = frodo gollum option mirror.redirectOK = all include \"%HOSTNAME.conf\" @@ -106,7 +106,7 @@ done # goes on frodo lines=" -# local to frodo but sam thinks frodo is a slave +# local to frodo but sam thinks frodo is a copy repo lfrodo RW = u1 @@ -114,13 +114,13 @@ RW = u1 repo mboth RW = u1 option mirror.master = frodo -option mirror.slaves = sam +option mirror.copies = sam # frodo thinks someone else is the master but sam thinks he is repo mnotsam RW = u1 option mirror.master = merry -option mirror.slaves = frodo +option mirror.copies = frodo # local to frodo but sam thinks frodo is a master and redirect is OK repo lfrodo2 @@ -130,14 +130,14 @@ RW = u1 repo nnfrodo RW = u1 option mirror.master = gollum -option mirror.slaves = frodo +option mirror.copies = frodo option mirror.redirectOK = all -# sam is not a valid slave to send stuff to frodo +# sam is not a valid copy to send stuff to frodo repo nvsfrodo RW = u1 option mirror.master = frodo -option mirror.slaves = gollum +option mirror.copies = gollum option mirror.redirectOK = all " @@ -145,43 +145,43 @@ echo "$lines" | sudo -u frodo -i sh -c "cat >> .gitolite/conf/frodo.conf" # goes on sam lines=" -# local to frodo but sam thinks frodo is a slave +# local to frodo but sam thinks frodo is a copy repo lfrodo RW = u1 option mirror.master = sam -option mirror.slaves = frodo +option mirror.copies = frodo # both think they're master repo mboth RW = u1 option mirror.master = sam -option mirror.slaves = frodo +option mirror.copies = frodo # frodo thinks someone else is the master but sam thinks he is repo mnotsam RW = u1 option mirror.master = sam -option mirror.slaves = frodo +option mirror.copies = frodo # local to frodo but sam thinks frodo is a master and redirect is OK repo lfrodo2 RW = u1 option mirror.master = frodo -option mirror.slaves = sam +option mirror.copies = sam option mirror.redirectOK = all # non-native to frodo but sam thinks frodo is master repo nnfrodo RW = u1 option mirror.master = frodo -option mirror.slaves = sam +option mirror.copies = sam option mirror.redirectOK = all -# sam is not a valid slave to send stuff to frodo +# sam is not a valid copy to send stuff to frodo repo nvsfrodo RW = u1 option mirror.master = frodo -option mirror.slaves = sam +option mirror.copies = sam option mirror.redirectOK = all " diff --git a/t/partial-copy.t b/t/partial-copy.t index 5bff843..493f0d4 100755 --- a/t/partial-copy.t +++ b/t/partial-copy.t @@ -95,7 +95,7 @@ try " /52c7716..ca37871 next -> next/ tag u4/nexttag; glt push u4 --tags /To file:///foo-pc/ - /\\[new tag\\] u4/nexttag -> u4/nexttag/ + /\\[new tag\\] u4/nexttag +-> +u4/nexttag/ /\\[new branch\\] ca3787119b7e8b9914bc22c939cefc443bc308da -> refs/partial/br-\\d+/ checkout master @@ -112,8 +112,8 @@ try " glt fetch u1 /From file:///foo/ /new branch\\] dev/u4/u4master -> origin/dev/u4/u4master/ - /new tag\\] u4/nexttag -> u4/nexttag/ - /52c7716..ca37871 next -> origin/next/ + /new tag\\] u4/nexttag +-> +u4/nexttag/ + /52c7716..ca37871 next +-> +origin/next/ checkout master; tc u1ma1 u1ma2; /\\[master 8ab1ff5\\] u1ma2 at Thu Jul 7 06:23:20 2011/ tag mt2; PUSH u1 master; ok diff --git a/t/repo-specific-hooks.t b/t/repo-specific-hooks.t index 6cacdb2..90a23c6 100755 --- a/t/repo-specific-hooks.t +++ b/t/repo-specific-hooks.t @@ -173,10 +173,10 @@ try " # Verify hooks are removed properly -confreset;confadd ' +confadd ' repo foo RW+ = @all - option hook.post-receive = + option hook.post-receive = "" repo bar RW+ = @all @@ -184,17 +184,17 @@ confreset;confadd ' repo baz RW+ = @all - option hook.post-receive = + option hook.post-receive = "" option hook.post-update = second '; try "ADMIN_PUSH repo-specific-hooks-02; !/FATAL/" or die text(); try " - ls $rb/foo.git/hooks/*; ok; !/post-receive/ + ls $rb/foo.git/hooks/*; ok; !/post-receive.h0/ ls $rb/bar.git/hooks/*; ok; !/pre-receive.*first/ /pre-receive.h00-second/ - ls $rb/baz.git/hooks/*; ok; !/post-receive/ + ls $rb/baz.git/hooks/*; ok; !/post-receive.h0/ !/post-update.*first/ /post-update.h00-second/ "; @@ -216,7 +216,7 @@ try " PUSH admin master; ok; /master -. master/ /hooks/pre-receive.h00-second/ !/hooks/pre-receive.*has args:/ - /hooks/pre-receive.h00-second has stdin: 0000000000000000000000000000000000000000 cc7808f77c7c7d705f82dc54dc3152146175768f refs/heads/master/ + /hooks/pre-receive.h00-second has stdin: cfc8561c7827a8b94df6c5dad156383d4cb210f5 cc7808f77c7c7d705f82dc54dc3152146175768f refs/heads/master/ cd .. diff --git a/t/smart-http b/t/smart-http index 98fc8c0..3ac910b 100755 --- a/t/smart-http +++ b/t/smart-http @@ -62,8 +62,8 @@ tsh " /1 file.*changed/ git push ok - /Initialized.*usr.share.httpd.gitolite-home.repositories.t2.git/ - /To http:..admin:admin.localhost.git.gitolite-admin.git/ + /Initialized.*gitolite-home.repositories.t2.git/ + /To http:..localhost.git.gitolite-admin.git/ /master -. master/ ## various ls-remotes git ls-remote `url u1 gitolite-admin` @@ -81,7 +81,7 @@ tsh " ## push to u1:t2 git push `url u1 t2` master:master ok - /To http:..u1:u1.localhost.git.t2.git/ + /To http:..localhost.git.t2.git/ /master -. master/ git ls-remote `url u2 t2` ok diff --git a/t/smart-http.root-setup b/t/smart-http.root-setup index 7a46dda..f22dcb5 100755 --- a/t/smart-http.root-setup +++ b/t/smart-http.root-setup @@ -51,7 +51,7 @@ export GITOLITE_HTTP_HOME=$PWD/gitolite-home cd gitolite-home git clone /tmp/gitolite.git gitolite-source # NOTE: I use a bare repo in /tmp for convenience; you'd use -# 'git://github.com/sitaramc/gitolite' +# 'https://github.com/sitaramc/gitolite' # make the bin directory, and add it to PATH cd gitolite-source diff --git a/t/templates.t b/t/templates.t new file mode 100755 index 0000000..a705167 --- /dev/null +++ b/t/templates.t @@ -0,0 +1,1322 @@ +#!/usr/bin/perl +use strict; +use warnings; +use 5.10.0; +use Data::Dumper; + +# this is hardcoded; change it if needed +use lib "$ENV{PWD}/src/lib"; + +use Gitolite::Test; + +BEGIN { + $ENV{G3T_RC} = "$ENV{HOME}/g3trc"; + put "$ENV{G3T_RC}", "\$rc{ROLES} = { + FORCERS => 1, + MASTERS => 1, + READERS => 1, + ROOT => 1, + TEAM => 1, + WRITERS => 1 + }"; +} + +use Gitolite::Rc; +use Gitolite::Common; +use Gitolite::Conf::Load; + +# permissions using role names +# ---------------------------------------------------------------------- + +try "plan 1163"; +try "DEF POK = !/DENIED/; !/failed to push/"; + +# basic push admin repo +confreset; confadd ' +# order is important for these next few repo group definitions, because an +# individual repo may pick and choose any combination of them, and they should +# apply sensibly. In this example, "BASE" is pretty much required; the others +# are optional. + +# if you want someone to have "ultimate" power over all refs in the repo, +# add them to the ROOT role. +repo @BASE + RW+CD = ROOT + +# add this to the repo group list to allow personal branches +repo @PERSONAL + RW+CD dev/USER/ = TEAM + - dev/ = TEAM + RW+CD refs/tags/dev/USER/ = TEAM + - refs/tags/dev/ = TEAM + +# add this to the repo group list to control tagging for release versions +repo @RELEASES + RWC refs/tags/v[0-9] = RELEASERS + - refs/tags/v[0-9] = @all + +# (the basic set of access rules continues) +repo @BASE + # Note that "FORCERS" here, even though they have RW+CD, + # 1. cannot touch other users personal branches or tags if you added + # PER_BR to the repo group list, and + # 2. create a release tag unless they are also in RELEASE_TAGGERS if + # you added TAGS to the repo group list + RW+CD = FORCERS + RWC master = MASTERS + - master = @all + RWC = RELEASERS MASTERS WRITERS + # Note you can define "@all" to have the READERS role, and then this will + # effectively be public (albeit authenticated public) readable. + R = READERS + +=begin template-data + +repo base = BASE + FORCERS = u1 + MASTERS = u2 + WRITERS = u3 + READERS = u4 + +repo baseroot = BASE + ROOT = admin + FORCERS = u1 + MASTERS = u2 + WRITERS = u3 + READERS = u4 + +repo basepers = BASE PERSONAL + FORCERS = u1 + MASTERS = u2 + WRITERS = u3 + READERS = u4 u5 + TEAM = u1 u2 u3 u5 u6 + +repo baserel = BASE RELEASES + FORCERS = u1 + MASTERS = u2 + WRITERS = u3 + READERS = u4 u5 + TEAM = u1 u2 u3 u5 u6 + +repo baseall = BASE PERSONAL RELEASES + ROOT = admin + FORCERS = u1 + MASTERS = u2 + WRITERS = u3 + READERS = u4 u5 + TEAM = u1 u2 u3 u5 u6 + +=end +'; + +try "ADMIN_PUSH set1; !/FATAL/" or die text(); + +# now we step outside tsh, into pure perl + +sub _access { + push @_, 'any' if @_ < 4; + my $ref = pop; + $ref =~ s(^)(refs/heads/) if $ref ne 'any' and $ref !~ m(^(refs|VREF)/); + push @_, $ref; + + return access(@_); +} + +sub ok { + say STDOUT (_access(@_) !~ /DENIED/ ? "ok" : "not ok"); +} +sub nok { + say STDOUT (_access(@_) =~ /DENIED/ ? "ok" : "not ok"); +} + +nok qw( base admin R ); +nok qw( base admin W master ); +nok qw( base admin W notmaster ); +nok qw( base admin W refs/tags/boo ); +nok qw( base admin W refs/tags/v1 ); +nok qw( base admin W dev/admin/foo ); +nok qw( base admin W refs/tags/dev/admin/foo ); +nok qw( base admin W dev/alice/foo ); +nok qw( base admin W refs/tags/dev/alice/foo ); +nok qw( base admin + master ); +nok qw( base admin + notmaster ); +nok qw( base admin + refs/tags/boo ); +nok qw( base admin + refs/tags/v1 ); +nok qw( base admin + dev/admin/foo ); +nok qw( base admin + refs/tags/dev/admin/foo ); +nok qw( base admin + dev/alice/foo ); +nok qw( base admin + refs/tags/dev/alice/foo ); +nok qw( base admin C master ); +nok qw( base admin C notmaster ); +nok qw( base admin C refs/tags/boo ); +nok qw( base admin C refs/tags/v1 ); +nok qw( base admin C dev/admin/foo ); +nok qw( base admin C refs/tags/dev/admin/foo ); +nok qw( base admin C dev/alice/foo ); +nok qw( base admin C refs/tags/dev/alice/foo ); +nok qw( base admin D master ); +nok qw( base admin D notmaster ); +nok qw( base admin D refs/tags/boo ); +nok qw( base admin D refs/tags/v1 ); +nok qw( base admin D dev/admin/foo ); +nok qw( base admin D refs/tags/dev/admin/foo ); +nok qw( base admin D dev/alice/foo ); +nok qw( base admin D refs/tags/dev/alice/foo ); + +ok qw( base u1 R ); +ok qw( base u1 W master ); +ok qw( base u1 W notmaster ); +ok qw( base u1 W refs/tags/boo ); +ok qw( base u1 W refs/tags/v1 ); +ok qw( base u1 W dev/u1/foo ); +ok qw( base u1 W refs/tags/dev/u1/foo ); +ok qw( base u1 W dev/alice/foo ); +ok qw( base u1 W refs/tags/dev/alice/foo ); +ok qw( base u1 + master ); +ok qw( base u1 + notmaster ); +ok qw( base u1 + refs/tags/boo ); +ok qw( base u1 + refs/tags/v1 ); +ok qw( base u1 + dev/u1/foo ); +ok qw( base u1 + refs/tags/dev/u1/foo ); +ok qw( base u1 + dev/alice/foo ); +ok qw( base u1 + refs/tags/dev/alice/foo ); +ok qw( base u1 C master ); +ok qw( base u1 C notmaster ); +ok qw( base u1 C refs/tags/boo ); +ok qw( base u1 C refs/tags/v1 ); +ok qw( base u1 C dev/u1/foo ); +ok qw( base u1 C refs/tags/dev/u1/foo ); +ok qw( base u1 C dev/alice/foo ); +ok qw( base u1 C refs/tags/dev/alice/foo ); +ok qw( base u1 D master ); +ok qw( base u1 D notmaster ); +ok qw( base u1 D refs/tags/boo ); +ok qw( base u1 D refs/tags/v1 ); +ok qw( base u1 D dev/u1/foo ); +ok qw( base u1 D refs/tags/dev/u1/foo ); +ok qw( base u1 D dev/alice/foo ); +ok qw( base u1 D refs/tags/dev/alice/foo ); + +ok qw( base u2 R ); +ok qw( base u2 W master ); +ok qw( base u2 W notmaster ); +ok qw( base u2 W refs/tags/boo ); +ok qw( base u2 W refs/tags/v1 ); +ok qw( base u2 W dev/u2/foo ); +ok qw( base u2 W refs/tags/dev/u2/foo ); +ok qw( base u2 W dev/alice/foo ); +ok qw( base u2 W refs/tags/dev/alice/foo ); +nok qw( base u2 + master ); +nok qw( base u2 + notmaster ); +nok qw( base u2 + refs/tags/boo ); +nok qw( base u2 + refs/tags/v1 ); +nok qw( base u2 + dev/u2/foo ); +nok qw( base u2 + refs/tags/dev/u2/foo ); +nok qw( base u2 + dev/alice/foo ); +nok qw( base u2 + refs/tags/dev/alice/foo ); +ok qw( base u2 C master ); +ok qw( base u2 C notmaster ); +ok qw( base u2 C refs/tags/boo ); +ok qw( base u2 C refs/tags/v1 ); +ok qw( base u2 C dev/u2/foo ); +ok qw( base u2 C refs/tags/dev/u2/foo ); +ok qw( base u2 C dev/alice/foo ); +ok qw( base u2 C refs/tags/dev/alice/foo ); +nok qw( base u2 D master ); +nok qw( base u2 D notmaster ); +nok qw( base u2 D refs/tags/boo ); +nok qw( base u2 D refs/tags/v1 ); +nok qw( base u2 D dev/u2/foo ); +nok qw( base u2 D refs/tags/dev/u2/foo ); +nok qw( base u2 D dev/alice/foo ); +nok qw( base u2 D refs/tags/dev/alice/foo ); + +ok qw( base u3 R ); +nok qw( base u3 W master ); +ok qw( base u3 W notmaster ); +ok qw( base u3 W refs/tags/boo ); +ok qw( base u3 W refs/tags/v1 ); +ok qw( base u3 W dev/u3/foo ); +ok qw( base u3 W refs/tags/dev/u3/foo ); +ok qw( base u3 W dev/alice/foo ); +ok qw( base u3 W refs/tags/dev/alice/foo ); +nok qw( base u3 + master ); +nok qw( base u3 + notmaster ); +nok qw( base u3 + refs/tags/boo ); +nok qw( base u3 + refs/tags/v1 ); +nok qw( base u3 + dev/u3/foo ); +nok qw( base u3 + refs/tags/dev/u3/foo ); +nok qw( base u3 + dev/alice/foo ); +nok qw( base u3 + refs/tags/dev/alice/foo ); +nok qw( base u3 C master ); +ok qw( base u3 C notmaster ); +ok qw( base u3 C refs/tags/boo ); +ok qw( base u3 C refs/tags/v1 ); +ok qw( base u3 C dev/u3/foo ); +ok qw( base u3 C refs/tags/dev/u3/foo ); +ok qw( base u3 C dev/alice/foo ); +ok qw( base u3 C refs/tags/dev/alice/foo ); +nok qw( base u3 D master ); +nok qw( base u3 D notmaster ); +nok qw( base u3 D refs/tags/boo ); +nok qw( base u3 D refs/tags/v1 ); +nok qw( base u3 D dev/u3/foo ); +nok qw( base u3 D refs/tags/dev/u3/foo ); +nok qw( base u3 D dev/alice/foo ); +nok qw( base u3 D refs/tags/dev/alice/foo ); + +ok qw( base u4 R ); +nok qw( base u4 W master ); +nok qw( base u4 W notmaster ); +nok qw( base u4 W refs/tags/boo ); +nok qw( base u4 W refs/tags/v1 ); +nok qw( base u4 W dev/u4/foo ); +nok qw( base u4 W refs/tags/dev/u4/foo ); +nok qw( base u4 W dev/alice/foo ); +nok qw( base u4 W refs/tags/dev/alice/foo ); +nok qw( base u4 + master ); +nok qw( base u4 + notmaster ); +nok qw( base u4 + refs/tags/boo ); +nok qw( base u4 + refs/tags/v1 ); +nok qw( base u4 + dev/u4/foo ); +nok qw( base u4 + refs/tags/dev/u4/foo ); +nok qw( base u4 + dev/alice/foo ); +nok qw( base u4 + refs/tags/dev/alice/foo ); +nok qw( base u4 C master ); +nok qw( base u4 C notmaster ); +nok qw( base u4 C refs/tags/boo ); +nok qw( base u4 C refs/tags/v1 ); +nok qw( base u4 C dev/u4/foo ); +nok qw( base u4 C refs/tags/dev/u4/foo ); +nok qw( base u4 C dev/alice/foo ); +nok qw( base u4 C refs/tags/dev/alice/foo ); +nok qw( base u4 D master ); +nok qw( base u4 D notmaster ); +nok qw( base u4 D refs/tags/boo ); +nok qw( base u4 D refs/tags/v1 ); +nok qw( base u4 D dev/u4/foo ); +nok qw( base u4 D refs/tags/dev/u4/foo ); +nok qw( base u4 D dev/alice/foo ); +nok qw( base u4 D refs/tags/dev/alice/foo ); + +nok qw( base u5 R ); +nok qw( base u5 W master ); +nok qw( base u5 W notmaster ); +nok qw( base u5 W refs/tags/boo ); +nok qw( base u5 W refs/tags/v1 ); +nok qw( base u5 W dev/u5/foo ); +nok qw( base u5 W refs/tags/dev/u5/foo ); +nok qw( base u5 W dev/alice/foo ); +nok qw( base u5 W refs/tags/dev/alice/foo ); +nok qw( base u5 + master ); +nok qw( base u5 + notmaster ); +nok qw( base u5 + refs/tags/boo ); +nok qw( base u5 + refs/tags/v1 ); +nok qw( base u5 + dev/u5/foo ); +nok qw( base u5 + refs/tags/dev/u5/foo ); +nok qw( base u5 + dev/alice/foo ); +nok qw( base u5 + refs/tags/dev/alice/foo ); +nok qw( base u5 C master ); +nok qw( base u5 C notmaster ); +nok qw( base u5 C refs/tags/boo ); +nok qw( base u5 C refs/tags/v1 ); +nok qw( base u5 C dev/u5/foo ); +nok qw( base u5 C refs/tags/dev/u5/foo ); +nok qw( base u5 C dev/alice/foo ); +nok qw( base u5 C refs/tags/dev/alice/foo ); +nok qw( base u5 D master ); +nok qw( base u5 D notmaster ); +nok qw( base u5 D refs/tags/boo ); +nok qw( base u5 D refs/tags/v1 ); +nok qw( base u5 D dev/u5/foo ); +nok qw( base u5 D refs/tags/dev/u5/foo ); +nok qw( base u5 D dev/alice/foo ); +nok qw( base u5 D refs/tags/dev/alice/foo ); + +nok qw( base u6 R ); +nok qw( base u6 W master ); +nok qw( base u6 W notmaster ); +nok qw( base u6 W refs/tags/boo ); +nok qw( base u6 W refs/tags/v1 ); +nok qw( base u6 W dev/u6/foo ); +nok qw( base u6 W refs/tags/dev/u6/foo ); +nok qw( base u6 W dev/alice/foo ); +nok qw( base u6 W refs/tags/dev/alice/foo ); +nok qw( base u6 + master ); +nok qw( base u6 + notmaster ); +nok qw( base u6 + refs/tags/boo ); +nok qw( base u6 + refs/tags/v1 ); +nok qw( base u6 + dev/u6/foo ); +nok qw( base u6 + refs/tags/dev/u6/foo ); +nok qw( base u6 + dev/alice/foo ); +nok qw( base u6 + refs/tags/dev/alice/foo ); +nok qw( base u6 C master ); +nok qw( base u6 C notmaster ); +nok qw( base u6 C refs/tags/boo ); +nok qw( base u6 C refs/tags/v1 ); +nok qw( base u6 C dev/u6/foo ); +nok qw( base u6 C refs/tags/dev/u6/foo ); +nok qw( base u6 C dev/alice/foo ); +nok qw( base u6 C refs/tags/dev/alice/foo ); +nok qw( base u6 D master ); +nok qw( base u6 D notmaster ); +nok qw( base u6 D refs/tags/boo ); +nok qw( base u6 D refs/tags/v1 ); +nok qw( base u6 D dev/u6/foo ); +nok qw( base u6 D refs/tags/dev/u6/foo ); +nok qw( base u6 D dev/alice/foo ); +nok qw( base u6 D refs/tags/dev/alice/foo ); + +ok qw( baseroot admin R ); +ok qw( baseroot admin W master ); +ok qw( baseroot admin W notmaster ); +ok qw( baseroot admin W refs/tags/boo ); +ok qw( baseroot admin W refs/tags/v1 ); +ok qw( baseroot admin W dev/admin/foo ); +ok qw( baseroot admin W refs/tags/dev/admin/foo ); +ok qw( baseroot admin W dev/alice/foo ); +ok qw( baseroot admin W refs/tags/dev/alice/foo ); +ok qw( baseroot admin + master ); +ok qw( baseroot admin + notmaster ); +ok qw( baseroot admin + refs/tags/boo ); +ok qw( baseroot admin + refs/tags/v1 ); +ok qw( baseroot admin + dev/admin/foo ); +ok qw( baseroot admin + refs/tags/dev/admin/foo ); +ok qw( baseroot admin + dev/alice/foo ); +ok qw( baseroot admin + refs/tags/dev/alice/foo ); +ok qw( baseroot admin C master ); +ok qw( baseroot admin C notmaster ); +ok qw( baseroot admin C refs/tags/boo ); +ok qw( baseroot admin C refs/tags/v1 ); +ok qw( baseroot admin C dev/admin/foo ); +ok qw( baseroot admin C refs/tags/dev/admin/foo ); +ok qw( baseroot admin C dev/alice/foo ); +ok qw( baseroot admin C refs/tags/dev/alice/foo ); +ok qw( baseroot admin D master ); +ok qw( baseroot admin D notmaster ); +ok qw( baseroot admin D refs/tags/boo ); +ok qw( baseroot admin D refs/tags/v1 ); +ok qw( baseroot admin D dev/admin/foo ); +ok qw( baseroot admin D refs/tags/dev/admin/foo ); +ok qw( baseroot admin D dev/alice/foo ); +ok qw( baseroot admin D refs/tags/dev/alice/foo ); + +ok qw( baseroot u1 R ); +ok qw( baseroot u1 W master ); +ok qw( baseroot u1 W notmaster ); +ok qw( baseroot u1 W refs/tags/boo ); +ok qw( baseroot u1 W refs/tags/v1 ); +ok qw( baseroot u1 W dev/u1/foo ); +ok qw( baseroot u1 W refs/tags/dev/u1/foo ); +ok qw( baseroot u1 W dev/alice/foo ); +ok qw( baseroot u1 W refs/tags/dev/alice/foo ); +ok qw( baseroot u1 + master ); +ok qw( baseroot u1 + notmaster ); +ok qw( baseroot u1 + refs/tags/boo ); +ok qw( baseroot u1 + refs/tags/v1 ); +ok qw( baseroot u1 + dev/u1/foo ); +ok qw( baseroot u1 + refs/tags/dev/u1/foo ); +ok qw( baseroot u1 + dev/alice/foo ); +ok qw( baseroot u1 + refs/tags/dev/alice/foo ); +ok qw( baseroot u1 C master ); +ok qw( baseroot u1 C notmaster ); +ok qw( baseroot u1 C refs/tags/boo ); +ok qw( baseroot u1 C refs/tags/v1 ); +ok qw( baseroot u1 C dev/u1/foo ); +ok qw( baseroot u1 C refs/tags/dev/u1/foo ); +ok qw( baseroot u1 C dev/alice/foo ); +ok qw( baseroot u1 C refs/tags/dev/alice/foo ); +ok qw( baseroot u1 D master ); +ok qw( baseroot u1 D notmaster ); +ok qw( baseroot u1 D refs/tags/boo ); +ok qw( baseroot u1 D refs/tags/v1 ); +ok qw( baseroot u1 D dev/u1/foo ); +ok qw( baseroot u1 D refs/tags/dev/u1/foo ); +ok qw( baseroot u1 D dev/alice/foo ); +ok qw( baseroot u1 D refs/tags/dev/alice/foo ); + +ok qw( baseroot u2 R ); +ok qw( baseroot u2 W master ); +ok qw( baseroot u2 W notmaster ); +ok qw( baseroot u2 W refs/tags/boo ); +ok qw( baseroot u2 W refs/tags/v1 ); +ok qw( baseroot u2 W dev/u2/foo ); +ok qw( baseroot u2 W refs/tags/dev/u2/foo ); +ok qw( baseroot u2 W dev/alice/foo ); +ok qw( baseroot u2 W refs/tags/dev/alice/foo ); +nok qw( baseroot u2 + master ); +nok qw( baseroot u2 + notmaster ); +nok qw( baseroot u2 + refs/tags/boo ); +nok qw( baseroot u2 + refs/tags/v1 ); +nok qw( baseroot u2 + dev/u2/foo ); +nok qw( baseroot u2 + refs/tags/dev/u2/foo ); +nok qw( baseroot u2 + dev/alice/foo ); +nok qw( baseroot u2 + refs/tags/dev/alice/foo ); +ok qw( baseroot u2 C master ); +ok qw( baseroot u2 C notmaster ); +ok qw( baseroot u2 C refs/tags/boo ); +ok qw( baseroot u2 C refs/tags/v1 ); +ok qw( baseroot u2 C dev/u2/foo ); +ok qw( baseroot u2 C refs/tags/dev/u2/foo ); +ok qw( baseroot u2 C dev/alice/foo ); +ok qw( baseroot u2 C refs/tags/dev/alice/foo ); +nok qw( baseroot u2 D master ); +nok qw( baseroot u2 D notmaster ); +nok qw( baseroot u2 D refs/tags/boo ); +nok qw( baseroot u2 D refs/tags/v1 ); +nok qw( baseroot u2 D dev/u2/foo ); +nok qw( baseroot u2 D refs/tags/dev/u2/foo ); +nok qw( baseroot u2 D dev/alice/foo ); +nok qw( baseroot u2 D refs/tags/dev/alice/foo ); + +ok qw( baseroot u3 R ); +nok qw( baseroot u3 W master ); +ok qw( baseroot u3 W notmaster ); +ok qw( baseroot u3 W refs/tags/boo ); +ok qw( baseroot u3 W refs/tags/v1 ); +ok qw( baseroot u3 W dev/u3/foo ); +ok qw( baseroot u3 W refs/tags/dev/u3/foo ); +ok qw( baseroot u3 W dev/alice/foo ); +ok qw( baseroot u3 W refs/tags/dev/alice/foo ); +nok qw( baseroot u3 + master ); +nok qw( baseroot u3 + notmaster ); +nok qw( baseroot u3 + refs/tags/boo ); +nok qw( baseroot u3 + refs/tags/v1 ); +nok qw( baseroot u3 + dev/u3/foo ); +nok qw( baseroot u3 + refs/tags/dev/u3/foo ); +nok qw( baseroot u3 + dev/alice/foo ); +nok qw( baseroot u3 + refs/tags/dev/alice/foo ); +nok qw( baseroot u3 C master ); +ok qw( baseroot u3 C notmaster ); +ok qw( baseroot u3 C refs/tags/boo ); +ok qw( baseroot u3 C refs/tags/v1 ); +ok qw( baseroot u3 C dev/u3/foo ); +ok qw( baseroot u3 C refs/tags/dev/u3/foo ); +ok qw( baseroot u3 C dev/alice/foo ); +ok qw( baseroot u3 C refs/tags/dev/alice/foo ); +nok qw( baseroot u3 D master ); +nok qw( baseroot u3 D notmaster ); +nok qw( baseroot u3 D refs/tags/boo ); +nok qw( baseroot u3 D refs/tags/v1 ); +nok qw( baseroot u3 D dev/u3/foo ); +nok qw( baseroot u3 D refs/tags/dev/u3/foo ); +nok qw( baseroot u3 D dev/alice/foo ); +nok qw( baseroot u3 D refs/tags/dev/alice/foo ); + +ok qw( baseroot u4 R ); +nok qw( baseroot u4 W master ); +nok qw( baseroot u4 W notmaster ); +nok qw( baseroot u4 W refs/tags/boo ); +nok qw( baseroot u4 W refs/tags/v1 ); +nok qw( baseroot u4 W dev/u4/foo ); +nok qw( baseroot u4 W refs/tags/dev/u4/foo ); +nok qw( baseroot u4 W dev/alice/foo ); +nok qw( baseroot u4 W refs/tags/dev/alice/foo ); +nok qw( baseroot u4 + master ); +nok qw( baseroot u4 + notmaster ); +nok qw( baseroot u4 + refs/tags/boo ); +nok qw( baseroot u4 + refs/tags/v1 ); +nok qw( baseroot u4 + dev/u4/foo ); +nok qw( baseroot u4 + refs/tags/dev/u4/foo ); +nok qw( baseroot u4 + dev/alice/foo ); +nok qw( baseroot u4 + refs/tags/dev/alice/foo ); +nok qw( baseroot u4 C master ); +nok qw( baseroot u4 C notmaster ); +nok qw( baseroot u4 C refs/tags/boo ); +nok qw( baseroot u4 C refs/tags/v1 ); +nok qw( baseroot u4 C dev/u4/foo ); +nok qw( baseroot u4 C refs/tags/dev/u4/foo ); +nok qw( baseroot u4 C dev/alice/foo ); +nok qw( baseroot u4 C refs/tags/dev/alice/foo ); +nok qw( baseroot u4 D master ); +nok qw( baseroot u4 D notmaster ); +nok qw( baseroot u4 D refs/tags/boo ); +nok qw( baseroot u4 D refs/tags/v1 ); +nok qw( baseroot u4 D dev/u4/foo ); +nok qw( baseroot u4 D refs/tags/dev/u4/foo ); +nok qw( baseroot u4 D dev/alice/foo ); +nok qw( baseroot u4 D refs/tags/dev/alice/foo ); + +nok qw( baseroot u5 R ); +nok qw( baseroot u5 W master ); +nok qw( baseroot u5 W notmaster ); +nok qw( baseroot u5 W refs/tags/boo ); +nok qw( baseroot u5 W refs/tags/v1 ); +nok qw( baseroot u5 W dev/u5/foo ); +nok qw( baseroot u5 W refs/tags/dev/u5/foo ); +nok qw( baseroot u5 W dev/alice/foo ); +nok qw( baseroot u5 W refs/tags/dev/alice/foo ); +nok qw( baseroot u5 + master ); +nok qw( baseroot u5 + notmaster ); +nok qw( baseroot u5 + refs/tags/boo ); +nok qw( baseroot u5 + refs/tags/v1 ); +nok qw( baseroot u5 + dev/u5/foo ); +nok qw( baseroot u5 + refs/tags/dev/u5/foo ); +nok qw( baseroot u5 + dev/alice/foo ); +nok qw( baseroot u5 + refs/tags/dev/alice/foo ); +nok qw( baseroot u5 C master ); +nok qw( baseroot u5 C notmaster ); +nok qw( baseroot u5 C refs/tags/boo ); +nok qw( baseroot u5 C refs/tags/v1 ); +nok qw( baseroot u5 C dev/u5/foo ); +nok qw( baseroot u5 C refs/tags/dev/u5/foo ); +nok qw( baseroot u5 C dev/alice/foo ); +nok qw( baseroot u5 C refs/tags/dev/alice/foo ); +nok qw( baseroot u5 D master ); +nok qw( baseroot u5 D notmaster ); +nok qw( baseroot u5 D refs/tags/boo ); +nok qw( baseroot u5 D refs/tags/v1 ); +nok qw( baseroot u5 D dev/u5/foo ); +nok qw( baseroot u5 D refs/tags/dev/u5/foo ); +nok qw( baseroot u5 D dev/alice/foo ); +nok qw( baseroot u5 D refs/tags/dev/alice/foo ); + +nok qw( baseroot u6 R ); +nok qw( baseroot u6 W master ); +nok qw( baseroot u6 W notmaster ); +nok qw( baseroot u6 W refs/tags/boo ); +nok qw( baseroot u6 W refs/tags/v1 ); +nok qw( baseroot u6 W dev/u6/foo ); +nok qw( baseroot u6 W refs/tags/dev/u6/foo ); +nok qw( baseroot u6 W dev/alice/foo ); +nok qw( baseroot u6 W refs/tags/dev/alice/foo ); +nok qw( baseroot u6 + master ); +nok qw( baseroot u6 + notmaster ); +nok qw( baseroot u6 + refs/tags/boo ); +nok qw( baseroot u6 + refs/tags/v1 ); +nok qw( baseroot u6 + dev/u6/foo ); +nok qw( baseroot u6 + refs/tags/dev/u6/foo ); +nok qw( baseroot u6 + dev/alice/foo ); +nok qw( baseroot u6 + refs/tags/dev/alice/foo ); +nok qw( baseroot u6 C master ); +nok qw( baseroot u6 C notmaster ); +nok qw( baseroot u6 C refs/tags/boo ); +nok qw( baseroot u6 C refs/tags/v1 ); +nok qw( baseroot u6 C dev/u6/foo ); +nok qw( baseroot u6 C refs/tags/dev/u6/foo ); +nok qw( baseroot u6 C dev/alice/foo ); +nok qw( baseroot u6 C refs/tags/dev/alice/foo ); +nok qw( baseroot u6 D master ); +nok qw( baseroot u6 D notmaster ); +nok qw( baseroot u6 D refs/tags/boo ); +nok qw( baseroot u6 D refs/tags/v1 ); +nok qw( baseroot u6 D dev/u6/foo ); +nok qw( baseroot u6 D refs/tags/dev/u6/foo ); +nok qw( baseroot u6 D dev/alice/foo ); +nok qw( baseroot u6 D refs/tags/dev/alice/foo ); + +nok qw( basepers admin R ); +nok qw( basepers admin W master ); +nok qw( basepers admin W notmaster ); +nok qw( basepers admin W refs/tags/boo ); +nok qw( basepers admin W refs/tags/v1 ); +nok qw( basepers admin W dev/admin/foo ); +nok qw( basepers admin W refs/tags/dev/admin/foo ); +nok qw( basepers admin W dev/alice/foo ); +nok qw( basepers admin W refs/tags/dev/alice/foo ); +nok qw( basepers admin + master ); +nok qw( basepers admin + notmaster ); +nok qw( basepers admin + refs/tags/boo ); +nok qw( basepers admin + refs/tags/v1 ); +nok qw( basepers admin + dev/admin/foo ); +nok qw( basepers admin + refs/tags/dev/admin/foo ); +nok qw( basepers admin + dev/alice/foo ); +nok qw( basepers admin + refs/tags/dev/alice/foo ); +nok qw( basepers admin C master ); +nok qw( basepers admin C notmaster ); +nok qw( basepers admin C refs/tags/boo ); +nok qw( basepers admin C refs/tags/v1 ); +nok qw( basepers admin C dev/admin/foo ); +nok qw( basepers admin C refs/tags/dev/admin/foo ); +nok qw( basepers admin C dev/alice/foo ); +nok qw( basepers admin C refs/tags/dev/alice/foo ); +nok qw( basepers admin D master ); +nok qw( basepers admin D notmaster ); +nok qw( basepers admin D refs/tags/boo ); +nok qw( basepers admin D refs/tags/v1 ); +nok qw( basepers admin D dev/admin/foo ); +nok qw( basepers admin D refs/tags/dev/admin/foo ); +nok qw( basepers admin D dev/alice/foo ); +nok qw( basepers admin D refs/tags/dev/alice/foo ); + +ok qw( basepers u1 R ); +ok qw( basepers u1 W master ); +ok qw( basepers u1 W notmaster ); +ok qw( basepers u1 W refs/tags/boo ); +ok qw( basepers u1 W refs/tags/v1 ); +ok qw( basepers u1 W dev/u1/foo ); +ok qw( basepers u1 W refs/tags/dev/u1/foo ); +nok qw( basepers u1 W dev/alice/foo ); +nok qw( basepers u1 W refs/tags/dev/alice/foo ); +ok qw( basepers u1 + master ); +ok qw( basepers u1 + notmaster ); +ok qw( basepers u1 + refs/tags/boo ); +ok qw( basepers u1 + refs/tags/v1 ); +ok qw( basepers u1 + dev/u1/foo ); +ok qw( basepers u1 + refs/tags/dev/u1/foo ); +nok qw( basepers u1 + dev/alice/foo ); +nok qw( basepers u1 + refs/tags/dev/alice/foo ); +ok qw( basepers u1 C master ); +ok qw( basepers u1 C notmaster ); +ok qw( basepers u1 C refs/tags/boo ); +ok qw( basepers u1 C refs/tags/v1 ); +ok qw( basepers u1 C dev/u1/foo ); +ok qw( basepers u1 C refs/tags/dev/u1/foo ); +nok qw( basepers u1 C dev/alice/foo ); +nok qw( basepers u1 C refs/tags/dev/alice/foo ); +ok qw( basepers u1 D master ); +ok qw( basepers u1 D notmaster ); +ok qw( basepers u1 D refs/tags/boo ); +ok qw( basepers u1 D refs/tags/v1 ); +ok qw( basepers u1 D dev/u1/foo ); +ok qw( basepers u1 D refs/tags/dev/u1/foo ); +nok qw( basepers u1 D dev/alice/foo ); +nok qw( basepers u1 D refs/tags/dev/alice/foo ); + +ok qw( basepers u2 R ); +ok qw( basepers u2 W master ); +ok qw( basepers u2 W notmaster ); +ok qw( basepers u2 W refs/tags/boo ); +ok qw( basepers u2 W refs/tags/v1 ); +ok qw( basepers u2 W dev/u2/foo ); +ok qw( basepers u2 W refs/tags/dev/u2/foo ); +nok qw( basepers u2 W dev/alice/foo ); +nok qw( basepers u2 W refs/tags/dev/alice/foo ); +nok qw( basepers u2 + master ); +nok qw( basepers u2 + notmaster ); +nok qw( basepers u2 + refs/tags/boo ); +nok qw( basepers u2 + refs/tags/v1 ); +ok qw( basepers u2 + dev/u2/foo ); +ok qw( basepers u2 + refs/tags/dev/u2/foo ); +nok qw( basepers u2 + dev/alice/foo ); +nok qw( basepers u2 + refs/tags/dev/alice/foo ); +ok qw( basepers u2 C master ); +ok qw( basepers u2 C notmaster ); +ok qw( basepers u2 C refs/tags/boo ); +ok qw( basepers u2 C refs/tags/v1 ); +ok qw( basepers u2 C dev/u2/foo ); +ok qw( basepers u2 C refs/tags/dev/u2/foo ); +nok qw( basepers u2 C dev/alice/foo ); +nok qw( basepers u2 C refs/tags/dev/alice/foo ); +nok qw( basepers u2 D master ); +nok qw( basepers u2 D notmaster ); +nok qw( basepers u2 D refs/tags/boo ); +nok qw( basepers u2 D refs/tags/v1 ); +ok qw( basepers u2 D dev/u2/foo ); +ok qw( basepers u2 D refs/tags/dev/u2/foo ); +nok qw( basepers u2 D dev/alice/foo ); +nok qw( basepers u2 D refs/tags/dev/alice/foo ); + +ok qw( basepers u3 R ); +nok qw( basepers u3 W master ); +ok qw( basepers u3 W notmaster ); +ok qw( basepers u3 W refs/tags/boo ); +ok qw( basepers u3 W refs/tags/v1 ); +ok qw( basepers u3 W dev/u3/foo ); +ok qw( basepers u3 W refs/tags/dev/u3/foo ); +nok qw( basepers u3 W dev/alice/foo ); +nok qw( basepers u3 W refs/tags/dev/alice/foo ); +nok qw( basepers u3 + master ); +nok qw( basepers u3 + notmaster ); +nok qw( basepers u3 + refs/tags/boo ); +nok qw( basepers u3 + refs/tags/v1 ); +ok qw( basepers u3 + dev/u3/foo ); +ok qw( basepers u3 + refs/tags/dev/u3/foo ); +nok qw( basepers u3 + dev/alice/foo ); +nok qw( basepers u3 + refs/tags/dev/alice/foo ); +nok qw( basepers u3 C master ); +ok qw( basepers u3 C notmaster ); +ok qw( basepers u3 C refs/tags/boo ); +ok qw( basepers u3 C refs/tags/v1 ); +ok qw( basepers u3 C dev/u3/foo ); +ok qw( basepers u3 C refs/tags/dev/u3/foo ); +nok qw( basepers u3 C dev/alice/foo ); +nok qw( basepers u3 C refs/tags/dev/alice/foo ); +nok qw( basepers u3 D master ); +nok qw( basepers u3 D notmaster ); +nok qw( basepers u3 D refs/tags/boo ); +nok qw( basepers u3 D refs/tags/v1 ); +ok qw( basepers u3 D dev/u3/foo ); +ok qw( basepers u3 D refs/tags/dev/u3/foo ); +nok qw( basepers u3 D dev/alice/foo ); +nok qw( basepers u3 D refs/tags/dev/alice/foo ); + +ok qw( basepers u4 R ); +nok qw( basepers u4 W master ); +nok qw( basepers u4 W notmaster ); +nok qw( basepers u4 W refs/tags/boo ); +nok qw( basepers u4 W refs/tags/v1 ); +nok qw( basepers u4 W dev/u4/foo ); +nok qw( basepers u4 W refs/tags/dev/u4/foo ); +nok qw( basepers u4 W dev/alice/foo ); +nok qw( basepers u4 W refs/tags/dev/alice/foo ); +nok qw( basepers u4 + master ); +nok qw( basepers u4 + notmaster ); +nok qw( basepers u4 + refs/tags/boo ); +nok qw( basepers u4 + refs/tags/v1 ); +nok qw( basepers u4 + dev/u4/foo ); +nok qw( basepers u4 + refs/tags/dev/u4/foo ); +nok qw( basepers u4 + dev/alice/foo ); +nok qw( basepers u4 + refs/tags/dev/alice/foo ); +nok qw( basepers u4 C master ); +nok qw( basepers u4 C notmaster ); +nok qw( basepers u4 C refs/tags/boo ); +nok qw( basepers u4 C refs/tags/v1 ); +nok qw( basepers u4 C dev/u4/foo ); +nok qw( basepers u4 C refs/tags/dev/u4/foo ); +nok qw( basepers u4 C dev/alice/foo ); +nok qw( basepers u4 C refs/tags/dev/alice/foo ); +nok qw( basepers u4 D master ); +nok qw( basepers u4 D notmaster ); +nok qw( basepers u4 D refs/tags/boo ); +nok qw( basepers u4 D refs/tags/v1 ); +nok qw( basepers u4 D dev/u4/foo ); +nok qw( basepers u4 D refs/tags/dev/u4/foo ); +nok qw( basepers u4 D dev/alice/foo ); +nok qw( basepers u4 D refs/tags/dev/alice/foo ); + +ok qw( basepers u5 R ); +nok qw( basepers u5 W master ); +nok qw( basepers u5 W notmaster ); +nok qw( basepers u5 W refs/tags/boo ); +nok qw( basepers u5 W refs/tags/v1 ); +ok qw( basepers u5 W dev/u5/foo ); +ok qw( basepers u5 W refs/tags/dev/u5/foo ); +nok qw( basepers u5 W dev/alice/foo ); +nok qw( basepers u5 W refs/tags/dev/alice/foo ); +nok qw( basepers u5 + master ); +nok qw( basepers u5 + notmaster ); +nok qw( basepers u5 + refs/tags/boo ); +nok qw( basepers u5 + refs/tags/v1 ); +ok qw( basepers u5 + dev/u5/foo ); +ok qw( basepers u5 + refs/tags/dev/u5/foo ); +nok qw( basepers u5 + dev/alice/foo ); +nok qw( basepers u5 + refs/tags/dev/alice/foo ); +nok qw( basepers u5 C master ); +nok qw( basepers u5 C notmaster ); +nok qw( basepers u5 C refs/tags/boo ); +nok qw( basepers u5 C refs/tags/v1 ); +ok qw( basepers u5 C dev/u5/foo ); +ok qw( basepers u5 C refs/tags/dev/u5/foo ); +nok qw( basepers u5 C dev/alice/foo ); +nok qw( basepers u5 C refs/tags/dev/alice/foo ); +nok qw( basepers u5 D master ); +nok qw( basepers u5 D notmaster ); +nok qw( basepers u5 D refs/tags/boo ); +nok qw( basepers u5 D refs/tags/v1 ); +ok qw( basepers u5 D dev/u5/foo ); +ok qw( basepers u5 D refs/tags/dev/u5/foo ); +nok qw( basepers u5 D dev/alice/foo ); +nok qw( basepers u5 D refs/tags/dev/alice/foo ); + +ok qw( basepers u6 R ); +nok qw( basepers u6 W master ); +nok qw( basepers u6 W notmaster ); +nok qw( basepers u6 W refs/tags/boo ); +nok qw( basepers u6 W refs/tags/v1 ); +ok qw( basepers u6 W dev/u6/foo ); +ok qw( basepers u6 W refs/tags/dev/u6/foo ); +nok qw( basepers u6 W dev/alice/foo ); +nok qw( basepers u6 W refs/tags/dev/alice/foo ); +nok qw( basepers u6 + master ); +nok qw( basepers u6 + notmaster ); +nok qw( basepers u6 + refs/tags/boo ); +nok qw( basepers u6 + refs/tags/v1 ); +ok qw( basepers u6 + dev/u6/foo ); +ok qw( basepers u6 + refs/tags/dev/u6/foo ); +nok qw( basepers u6 + dev/alice/foo ); +nok qw( basepers u6 + refs/tags/dev/alice/foo ); +nok qw( basepers u6 C master ); +nok qw( basepers u6 C notmaster ); +nok qw( basepers u6 C refs/tags/boo ); +nok qw( basepers u6 C refs/tags/v1 ); +ok qw( basepers u6 C dev/u6/foo ); +ok qw( basepers u6 C refs/tags/dev/u6/foo ); +nok qw( basepers u6 C dev/alice/foo ); +nok qw( basepers u6 C refs/tags/dev/alice/foo ); +nok qw( basepers u6 D master ); +nok qw( basepers u6 D notmaster ); +nok qw( basepers u6 D refs/tags/boo ); +nok qw( basepers u6 D refs/tags/v1 ); +ok qw( basepers u6 D dev/u6/foo ); +ok qw( basepers u6 D refs/tags/dev/u6/foo ); +nok qw( basepers u6 D dev/alice/foo ); +nok qw( basepers u6 D refs/tags/dev/alice/foo ); + +nok qw( baserel admin R ); +nok qw( baserel admin W master ); +nok qw( baserel admin W notmaster ); +nok qw( baserel admin W refs/tags/boo ); +nok qw( baserel admin W refs/tags/v1 ); +nok qw( baserel admin W dev/admin/foo ); +nok qw( baserel admin W refs/tags/dev/admin/foo ); +nok qw( baserel admin W dev/alice/foo ); +nok qw( baserel admin W refs/tags/dev/alice/foo ); +nok qw( baserel admin + master ); +nok qw( baserel admin + notmaster ); +nok qw( baserel admin + refs/tags/boo ); +nok qw( baserel admin + refs/tags/v1 ); +nok qw( baserel admin + dev/admin/foo ); +nok qw( baserel admin + refs/tags/dev/admin/foo ); +nok qw( baserel admin + dev/alice/foo ); +nok qw( baserel admin + refs/tags/dev/alice/foo ); +nok qw( baserel admin C master ); +nok qw( baserel admin C notmaster ); +nok qw( baserel admin C refs/tags/boo ); +nok qw( baserel admin C refs/tags/v1 ); +nok qw( baserel admin C dev/admin/foo ); +nok qw( baserel admin C refs/tags/dev/admin/foo ); +nok qw( baserel admin C dev/alice/foo ); +nok qw( baserel admin C refs/tags/dev/alice/foo ); +nok qw( baserel admin D master ); +nok qw( baserel admin D notmaster ); +nok qw( baserel admin D refs/tags/boo ); +nok qw( baserel admin D refs/tags/v1 ); +nok qw( baserel admin D dev/admin/foo ); +nok qw( baserel admin D refs/tags/dev/admin/foo ); +nok qw( baserel admin D dev/alice/foo ); +nok qw( baserel admin D refs/tags/dev/alice/foo ); + +ok qw( baserel u1 R ); +ok qw( baserel u1 W master ); +ok qw( baserel u1 W notmaster ); +ok qw( baserel u1 W refs/tags/boo ); +nok qw( baserel u1 W refs/tags/v1 ); +ok qw( baserel u1 W dev/u1/foo ); +ok qw( baserel u1 W refs/tags/dev/u1/foo ); +ok qw( baserel u1 W dev/alice/foo ); +ok qw( baserel u1 W refs/tags/dev/alice/foo ); +ok qw( baserel u1 + master ); +ok qw( baserel u1 + notmaster ); +ok qw( baserel u1 + refs/tags/boo ); +nok qw( baserel u1 + refs/tags/v1 ); +ok qw( baserel u1 + dev/u1/foo ); +ok qw( baserel u1 + refs/tags/dev/u1/foo ); +ok qw( baserel u1 + dev/alice/foo ); +ok qw( baserel u1 + refs/tags/dev/alice/foo ); +ok qw( baserel u1 C master ); +ok qw( baserel u1 C notmaster ); +ok qw( baserel u1 C refs/tags/boo ); +nok qw( baserel u1 C refs/tags/v1 ); +ok qw( baserel u1 C dev/u1/foo ); +ok qw( baserel u1 C refs/tags/dev/u1/foo ); +ok qw( baserel u1 C dev/alice/foo ); +ok qw( baserel u1 C refs/tags/dev/alice/foo ); +ok qw( baserel u1 D master ); +ok qw( baserel u1 D notmaster ); +ok qw( baserel u1 D refs/tags/boo ); +nok qw( baserel u1 D refs/tags/v1 ); +ok qw( baserel u1 D dev/u1/foo ); +ok qw( baserel u1 D refs/tags/dev/u1/foo ); +ok qw( baserel u1 D dev/alice/foo ); +ok qw( baserel u1 D refs/tags/dev/alice/foo ); + +ok qw( baserel u2 R ); +ok qw( baserel u2 W master ); +ok qw( baserel u2 W notmaster ); +ok qw( baserel u2 W refs/tags/boo ); +nok qw( baserel u2 W refs/tags/v1 ); +ok qw( baserel u2 W dev/u2/foo ); +ok qw( baserel u2 W refs/tags/dev/u2/foo ); +ok qw( baserel u2 W dev/alice/foo ); +ok qw( baserel u2 W refs/tags/dev/alice/foo ); +nok qw( baserel u2 + master ); +nok qw( baserel u2 + notmaster ); +nok qw( baserel u2 + refs/tags/boo ); +nok qw( baserel u2 + refs/tags/v1 ); +nok qw( baserel u2 + dev/u2/foo ); +nok qw( baserel u2 + refs/tags/dev/u2/foo ); +nok qw( baserel u2 + dev/alice/foo ); +nok qw( baserel u2 + refs/tags/dev/alice/foo ); +ok qw( baserel u2 C master ); +ok qw( baserel u2 C notmaster ); +ok qw( baserel u2 C refs/tags/boo ); +nok qw( baserel u2 C refs/tags/v1 ); +ok qw( baserel u2 C dev/u2/foo ); +ok qw( baserel u2 C refs/tags/dev/u2/foo ); +ok qw( baserel u2 C dev/alice/foo ); +ok qw( baserel u2 C refs/tags/dev/alice/foo ); +nok qw( baserel u2 D master ); +nok qw( baserel u2 D notmaster ); +nok qw( baserel u2 D refs/tags/boo ); +nok qw( baserel u2 D refs/tags/v1 ); +nok qw( baserel u2 D dev/u2/foo ); +nok qw( baserel u2 D refs/tags/dev/u2/foo ); +nok qw( baserel u2 D dev/alice/foo ); +nok qw( baserel u2 D refs/tags/dev/alice/foo ); + +ok qw( baserel u3 R ); +nok qw( baserel u3 W master ); +ok qw( baserel u3 W notmaster ); +ok qw( baserel u3 W refs/tags/boo ); +nok qw( baserel u3 W refs/tags/v1 ); +ok qw( baserel u3 W dev/u3/foo ); +ok qw( baserel u3 W refs/tags/dev/u3/foo ); +ok qw( baserel u3 W dev/alice/foo ); +ok qw( baserel u3 W refs/tags/dev/alice/foo ); +nok qw( baserel u3 + master ); +nok qw( baserel u3 + notmaster ); +nok qw( baserel u3 + refs/tags/boo ); +nok qw( baserel u3 + refs/tags/v1 ); +nok qw( baserel u3 + dev/u3/foo ); +nok qw( baserel u3 + refs/tags/dev/u3/foo ); +nok qw( baserel u3 + dev/alice/foo ); +nok qw( baserel u3 + refs/tags/dev/alice/foo ); +nok qw( baserel u3 C master ); +ok qw( baserel u3 C notmaster ); +ok qw( baserel u3 C refs/tags/boo ); +nok qw( baserel u3 C refs/tags/v1 ); +ok qw( baserel u3 C dev/u3/foo ); +ok qw( baserel u3 C refs/tags/dev/u3/foo ); +ok qw( baserel u3 C dev/alice/foo ); +ok qw( baserel u3 C refs/tags/dev/alice/foo ); +nok qw( baserel u3 D master ); +nok qw( baserel u3 D notmaster ); +nok qw( baserel u3 D refs/tags/boo ); +nok qw( baserel u3 D refs/tags/v1 ); +nok qw( baserel u3 D dev/u3/foo ); +nok qw( baserel u3 D refs/tags/dev/u3/foo ); +nok qw( baserel u3 D dev/alice/foo ); +nok qw( baserel u3 D refs/tags/dev/alice/foo ); + +ok qw( baserel u4 R ); +nok qw( baserel u4 W master ); +nok qw( baserel u4 W notmaster ); +nok qw( baserel u4 W refs/tags/boo ); +nok qw( baserel u4 W refs/tags/v1 ); +nok qw( baserel u4 W dev/u4/foo ); +nok qw( baserel u4 W refs/tags/dev/u4/foo ); +nok qw( baserel u4 W dev/alice/foo ); +nok qw( baserel u4 W refs/tags/dev/alice/foo ); +nok qw( baserel u4 + master ); +nok qw( baserel u4 + notmaster ); +nok qw( baserel u4 + refs/tags/boo ); +nok qw( baserel u4 + refs/tags/v1 ); +nok qw( baserel u4 + dev/u4/foo ); +nok qw( baserel u4 + refs/tags/dev/u4/foo ); +nok qw( baserel u4 + dev/alice/foo ); +nok qw( baserel u4 + refs/tags/dev/alice/foo ); +nok qw( baserel u4 C master ); +nok qw( baserel u4 C notmaster ); +nok qw( baserel u4 C refs/tags/boo ); +nok qw( baserel u4 C refs/tags/v1 ); +nok qw( baserel u4 C dev/u4/foo ); +nok qw( baserel u4 C refs/tags/dev/u4/foo ); +nok qw( baserel u4 C dev/alice/foo ); +nok qw( baserel u4 C refs/tags/dev/alice/foo ); +nok qw( baserel u4 D master ); +nok qw( baserel u4 D notmaster ); +nok qw( baserel u4 D refs/tags/boo ); +nok qw( baserel u4 D refs/tags/v1 ); +nok qw( baserel u4 D dev/u4/foo ); +nok qw( baserel u4 D refs/tags/dev/u4/foo ); +nok qw( baserel u4 D dev/alice/foo ); +nok qw( baserel u4 D refs/tags/dev/alice/foo ); + +ok qw( baserel u5 R ); +nok qw( baserel u5 W master ); +nok qw( baserel u5 W notmaster ); +nok qw( baserel u5 W refs/tags/boo ); +nok qw( baserel u5 W refs/tags/v1 ); +nok qw( baserel u5 W dev/u5/foo ); +nok qw( baserel u5 W refs/tags/dev/u5/foo ); +nok qw( baserel u5 W dev/alice/foo ); +nok qw( baserel u5 W refs/tags/dev/alice/foo ); +nok qw( baserel u5 + master ); +nok qw( baserel u5 + notmaster ); +nok qw( baserel u5 + refs/tags/boo ); +nok qw( baserel u5 + refs/tags/v1 ); +nok qw( baserel u5 + dev/u5/foo ); +nok qw( baserel u5 + refs/tags/dev/u5/foo ); +nok qw( baserel u5 + dev/alice/foo ); +nok qw( baserel u5 + refs/tags/dev/alice/foo ); +nok qw( baserel u5 C master ); +nok qw( baserel u5 C notmaster ); +nok qw( baserel u5 C refs/tags/boo ); +nok qw( baserel u5 C refs/tags/v1 ); +nok qw( baserel u5 C dev/u5/foo ); +nok qw( baserel u5 C refs/tags/dev/u5/foo ); +nok qw( baserel u5 C dev/alice/foo ); +nok qw( baserel u5 C refs/tags/dev/alice/foo ); +nok qw( baserel u5 D master ); +nok qw( baserel u5 D notmaster ); +nok qw( baserel u5 D refs/tags/boo ); +nok qw( baserel u5 D refs/tags/v1 ); +nok qw( baserel u5 D dev/u5/foo ); +nok qw( baserel u5 D refs/tags/dev/u5/foo ); +nok qw( baserel u5 D dev/alice/foo ); +nok qw( baserel u5 D refs/tags/dev/alice/foo ); + +nok qw( baserel u6 R ); +nok qw( baserel u6 W master ); +nok qw( baserel u6 W notmaster ); +nok qw( baserel u6 W refs/tags/boo ); +nok qw( baserel u6 W refs/tags/v1 ); +nok qw( baserel u6 W dev/u6/foo ); +nok qw( baserel u6 W refs/tags/dev/u6/foo ); +nok qw( baserel u6 W dev/alice/foo ); +nok qw( baserel u6 W refs/tags/dev/alice/foo ); +nok qw( baserel u6 + master ); +nok qw( baserel u6 + notmaster ); +nok qw( baserel u6 + refs/tags/boo ); +nok qw( baserel u6 + refs/tags/v1 ); +nok qw( baserel u6 + dev/u6/foo ); +nok qw( baserel u6 + refs/tags/dev/u6/foo ); +nok qw( baserel u6 + dev/alice/foo ); +nok qw( baserel u6 + refs/tags/dev/alice/foo ); +nok qw( baserel u6 C master ); +nok qw( baserel u6 C notmaster ); +nok qw( baserel u6 C refs/tags/boo ); +nok qw( baserel u6 C refs/tags/v1 ); +nok qw( baserel u6 C dev/u6/foo ); +nok qw( baserel u6 C refs/tags/dev/u6/foo ); +nok qw( baserel u6 C dev/alice/foo ); +nok qw( baserel u6 C refs/tags/dev/alice/foo ); +nok qw( baserel u6 D master ); +nok qw( baserel u6 D notmaster ); +nok qw( baserel u6 D refs/tags/boo ); +nok qw( baserel u6 D refs/tags/v1 ); +nok qw( baserel u6 D dev/u6/foo ); +nok qw( baserel u6 D refs/tags/dev/u6/foo ); +nok qw( baserel u6 D dev/alice/foo ); +nok qw( baserel u6 D refs/tags/dev/alice/foo ); + +ok qw( baseall admin R ); +ok qw( baseall admin W master ); +ok qw( baseall admin W notmaster ); +ok qw( baseall admin W refs/tags/boo ); +ok qw( baseall admin W refs/tags/v1 ); +ok qw( baseall admin W dev/admin/foo ); +ok qw( baseall admin W refs/tags/dev/admin/foo ); +ok qw( baseall admin W dev/alice/foo ); +ok qw( baseall admin W refs/tags/dev/alice/foo ); +ok qw( baseall admin + master ); +ok qw( baseall admin + notmaster ); +ok qw( baseall admin + refs/tags/boo ); +ok qw( baseall admin + refs/tags/v1 ); +ok qw( baseall admin + dev/admin/foo ); +ok qw( baseall admin + refs/tags/dev/admin/foo ); +ok qw( baseall admin + dev/alice/foo ); +ok qw( baseall admin + refs/tags/dev/alice/foo ); +ok qw( baseall admin C master ); +ok qw( baseall admin C notmaster ); +ok qw( baseall admin C refs/tags/boo ); +ok qw( baseall admin C refs/tags/v1 ); +ok qw( baseall admin C dev/admin/foo ); +ok qw( baseall admin C refs/tags/dev/admin/foo ); +ok qw( baseall admin C dev/alice/foo ); +ok qw( baseall admin C refs/tags/dev/alice/foo ); +ok qw( baseall admin D master ); +ok qw( baseall admin D notmaster ); +ok qw( baseall admin D refs/tags/boo ); +ok qw( baseall admin D refs/tags/v1 ); +ok qw( baseall admin D dev/admin/foo ); +ok qw( baseall admin D refs/tags/dev/admin/foo ); +ok qw( baseall admin D dev/alice/foo ); +ok qw( baseall admin D refs/tags/dev/alice/foo ); + +ok qw( baseall u1 R ); +ok qw( baseall u1 W master ); +ok qw( baseall u1 W notmaster ); +ok qw( baseall u1 W refs/tags/boo ); +nok qw( baseall u1 W refs/tags/v1 ); +ok qw( baseall u1 W dev/u1/foo ); +ok qw( baseall u1 W refs/tags/dev/u1/foo ); +nok qw( baseall u1 W dev/alice/foo ); +nok qw( baseall u1 W refs/tags/dev/alice/foo ); +ok qw( baseall u1 + master ); +ok qw( baseall u1 + notmaster ); +ok qw( baseall u1 + refs/tags/boo ); +nok qw( baseall u1 + refs/tags/v1 ); +ok qw( baseall u1 + dev/u1/foo ); +ok qw( baseall u1 + refs/tags/dev/u1/foo ); +nok qw( baseall u1 + dev/alice/foo ); +nok qw( baseall u1 + refs/tags/dev/alice/foo ); +ok qw( baseall u1 C master ); +ok qw( baseall u1 C notmaster ); +ok qw( baseall u1 C refs/tags/boo ); +nok qw( baseall u1 C refs/tags/v1 ); +ok qw( baseall u1 C dev/u1/foo ); +ok qw( baseall u1 C refs/tags/dev/u1/foo ); +nok qw( baseall u1 C dev/alice/foo ); +nok qw( baseall u1 C refs/tags/dev/alice/foo ); +ok qw( baseall u1 D master ); +ok qw( baseall u1 D notmaster ); +ok qw( baseall u1 D refs/tags/boo ); +nok qw( baseall u1 D refs/tags/v1 ); +ok qw( baseall u1 D dev/u1/foo ); +ok qw( baseall u1 D refs/tags/dev/u1/foo ); +nok qw( baseall u1 D dev/alice/foo ); +nok qw( baseall u1 D refs/tags/dev/alice/foo ); + +ok qw( baseall u2 R ); +ok qw( baseall u2 W master ); +ok qw( baseall u2 W notmaster ); +ok qw( baseall u2 W refs/tags/boo ); +nok qw( baseall u2 W refs/tags/v1 ); +ok qw( baseall u2 W dev/u2/foo ); +ok qw( baseall u2 W refs/tags/dev/u2/foo ); +nok qw( baseall u2 W dev/alice/foo ); +nok qw( baseall u2 W refs/tags/dev/alice/foo ); +nok qw( baseall u2 + master ); +nok qw( baseall u2 + notmaster ); +nok qw( baseall u2 + refs/tags/boo ); +nok qw( baseall u2 + refs/tags/v1 ); +ok qw( baseall u2 + dev/u2/foo ); +ok qw( baseall u2 + refs/tags/dev/u2/foo ); +nok qw( baseall u2 + dev/alice/foo ); +nok qw( baseall u2 + refs/tags/dev/alice/foo ); +ok qw( baseall u2 C master ); +ok qw( baseall u2 C notmaster ); +ok qw( baseall u2 C refs/tags/boo ); +nok qw( baseall u2 C refs/tags/v1 ); +ok qw( baseall u2 C dev/u2/foo ); +ok qw( baseall u2 C refs/tags/dev/u2/foo ); +nok qw( baseall u2 C dev/alice/foo ); +nok qw( baseall u2 C refs/tags/dev/alice/foo ); +nok qw( baseall u2 D master ); +nok qw( baseall u2 D notmaster ); +nok qw( baseall u2 D refs/tags/boo ); +nok qw( baseall u2 D refs/tags/v1 ); +ok qw( baseall u2 D dev/u2/foo ); +ok qw( baseall u2 D refs/tags/dev/u2/foo ); +nok qw( baseall u2 D dev/alice/foo ); +nok qw( baseall u2 D refs/tags/dev/alice/foo ); + +ok qw( baseall u3 R ); +nok qw( baseall u3 W master ); +ok qw( baseall u3 W notmaster ); +ok qw( baseall u3 W refs/tags/boo ); +nok qw( baseall u3 W refs/tags/v1 ); +ok qw( baseall u3 W dev/u3/foo ); +ok qw( baseall u3 W refs/tags/dev/u3/foo ); +nok qw( baseall u3 W dev/alice/foo ); +nok qw( baseall u3 W refs/tags/dev/alice/foo ); +nok qw( baseall u3 + master ); +nok qw( baseall u3 + notmaster ); +nok qw( baseall u3 + refs/tags/boo ); +nok qw( baseall u3 + refs/tags/v1 ); +ok qw( baseall u3 + dev/u3/foo ); +ok qw( baseall u3 + refs/tags/dev/u3/foo ); +nok qw( baseall u3 + dev/alice/foo ); +nok qw( baseall u3 + refs/tags/dev/alice/foo ); +nok qw( baseall u3 C master ); +ok qw( baseall u3 C notmaster ); +ok qw( baseall u3 C refs/tags/boo ); +nok qw( baseall u3 C refs/tags/v1 ); +ok qw( baseall u3 C dev/u3/foo ); +ok qw( baseall u3 C refs/tags/dev/u3/foo ); +nok qw( baseall u3 C dev/alice/foo ); +nok qw( baseall u3 C refs/tags/dev/alice/foo ); +nok qw( baseall u3 D master ); +nok qw( baseall u3 D notmaster ); +nok qw( baseall u3 D refs/tags/boo ); +nok qw( baseall u3 D refs/tags/v1 ); +ok qw( baseall u3 D dev/u3/foo ); +ok qw( baseall u3 D refs/tags/dev/u3/foo ); +nok qw( baseall u3 D dev/alice/foo ); +nok qw( baseall u3 D refs/tags/dev/alice/foo ); + +ok qw( baseall u4 R ); +nok qw( baseall u4 W master ); +nok qw( baseall u4 W notmaster ); +nok qw( baseall u4 W refs/tags/boo ); +nok qw( baseall u4 W refs/tags/v1 ); +nok qw( baseall u4 W dev/u4/foo ); +nok qw( baseall u4 W refs/tags/dev/u4/foo ); +nok qw( baseall u4 W dev/alice/foo ); +nok qw( baseall u4 W refs/tags/dev/alice/foo ); +nok qw( baseall u4 + master ); +nok qw( baseall u4 + notmaster ); +nok qw( baseall u4 + refs/tags/boo ); +nok qw( baseall u4 + refs/tags/v1 ); +nok qw( baseall u4 + dev/u4/foo ); +nok qw( baseall u4 + refs/tags/dev/u4/foo ); +nok qw( baseall u4 + dev/alice/foo ); +nok qw( baseall u4 + refs/tags/dev/alice/foo ); +nok qw( baseall u4 C master ); +nok qw( baseall u4 C notmaster ); +nok qw( baseall u4 C refs/tags/boo ); +nok qw( baseall u4 C refs/tags/v1 ); +nok qw( baseall u4 C dev/u4/foo ); +nok qw( baseall u4 C refs/tags/dev/u4/foo ); +nok qw( baseall u4 C dev/alice/foo ); +nok qw( baseall u4 C refs/tags/dev/alice/foo ); +nok qw( baseall u4 D master ); +nok qw( baseall u4 D notmaster ); +nok qw( baseall u4 D refs/tags/boo ); +nok qw( baseall u4 D refs/tags/v1 ); +nok qw( baseall u4 D dev/u4/foo ); +nok qw( baseall u4 D refs/tags/dev/u4/foo ); +nok qw( baseall u4 D dev/alice/foo ); +nok qw( baseall u4 D refs/tags/dev/alice/foo ); + +ok qw( baseall u5 R ); +nok qw( baseall u5 W master ); +nok qw( baseall u5 W notmaster ); +nok qw( baseall u5 W refs/tags/boo ); +nok qw( baseall u5 W refs/tags/v1 ); +ok qw( baseall u5 W dev/u5/foo ); +ok qw( baseall u5 W refs/tags/dev/u5/foo ); +nok qw( baseall u5 W dev/alice/foo ); +nok qw( baseall u5 W refs/tags/dev/alice/foo ); +nok qw( baseall u5 + master ); +nok qw( baseall u5 + notmaster ); +nok qw( baseall u5 + refs/tags/boo ); +nok qw( baseall u5 + refs/tags/v1 ); +ok qw( baseall u5 + dev/u5/foo ); +ok qw( baseall u5 + refs/tags/dev/u5/foo ); +nok qw( baseall u5 + dev/alice/foo ); +nok qw( baseall u5 + refs/tags/dev/alice/foo ); +nok qw( baseall u5 C master ); +nok qw( baseall u5 C notmaster ); +nok qw( baseall u5 C refs/tags/boo ); +nok qw( baseall u5 C refs/tags/v1 ); +ok qw( baseall u5 C dev/u5/foo ); +ok qw( baseall u5 C refs/tags/dev/u5/foo ); +nok qw( baseall u5 C dev/alice/foo ); +nok qw( baseall u5 C refs/tags/dev/alice/foo ); +nok qw( baseall u5 D master ); +nok qw( baseall u5 D notmaster ); +nok qw( baseall u5 D refs/tags/boo ); +nok qw( baseall u5 D refs/tags/v1 ); +ok qw( baseall u5 D dev/u5/foo ); +ok qw( baseall u5 D refs/tags/dev/u5/foo ); +nok qw( baseall u5 D dev/alice/foo ); +nok qw( baseall u5 D refs/tags/dev/alice/foo ); + +ok qw( baseall u6 R ); +nok qw( baseall u6 W master ); +nok qw( baseall u6 W notmaster ); +nok qw( baseall u6 W refs/tags/boo ); +nok qw( baseall u6 W refs/tags/v1 ); +ok qw( baseall u6 W dev/u6/foo ); +ok qw( baseall u6 W refs/tags/dev/u6/foo ); +nok qw( baseall u6 W dev/alice/foo ); +nok qw( baseall u6 W refs/tags/dev/alice/foo ); +nok qw( baseall u6 + master ); +nok qw( baseall u6 + notmaster ); +nok qw( baseall u6 + refs/tags/boo ); +nok qw( baseall u6 + refs/tags/v1 ); +ok qw( baseall u6 + dev/u6/foo ); +ok qw( baseall u6 + refs/tags/dev/u6/foo ); +nok qw( baseall u6 + dev/alice/foo ); +nok qw( baseall u6 + refs/tags/dev/alice/foo ); +nok qw( baseall u6 C master ); +nok qw( baseall u6 C notmaster ); +nok qw( baseall u6 C refs/tags/boo ); +nok qw( baseall u6 C refs/tags/v1 ); +ok qw( baseall u6 C dev/u6/foo ); +ok qw( baseall u6 C refs/tags/dev/u6/foo ); +nok qw( baseall u6 C dev/alice/foo ); +nok qw( baseall u6 C refs/tags/dev/alice/foo ); +nok qw( baseall u6 D master ); +nok qw( baseall u6 D notmaster ); +nok qw( baseall u6 D refs/tags/boo ); +nok qw( baseall u6 D refs/tags/v1 ); +ok qw( baseall u6 D dev/u6/foo ); +ok qw( baseall u6 D refs/tags/dev/u6/foo ); +nok qw( baseall u6 D dev/alice/foo ); +nok qw( baseall u6 D refs/tags/dev/alice/foo ); + |