summaryrefslogtreecommitdiffstats
path: root/t/partial-copy.t
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xt/partial-copy.t181
1 files changed, 181 insertions, 0 deletions
diff --git a/t/partial-copy.t b/t/partial-copy.t
new file mode 100755
index 0000000..493f0d4
--- /dev/null
+++ b/t/partial-copy.t
@@ -0,0 +1,181 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+# this is hardcoded; change it if needed
+use lib "src/lib";
+use Gitolite::Test;
+
+# test script for partial copy feature
+# ----------------------------------------------------------------------
+
+try "plan 82";
+try "DEF POK = !/DENIED/; !/failed to push/";
+my $h = $ENV{HOME};
+
+try "
+ cat $h/.gitolite.rc
+ perl s/GIT_CONFIG_KEYS.*/GIT_CONFIG_KEYS => '.*',/
+ perl s/# 'partial-copy'/'partial-copy'/
+ put $h/.gitolite.rc
+";
+
+confreset;confadd '
+ repo foo
+ RW+ = u1 u2
+
+ repo foo-pc
+ - secret-1$ = u4
+ R = u4 # marker 01
+ RW next = u4
+ RW+ dev/USER/ = u4
+ RW refs/tags/USER/ = u4
+
+ - VREF/partial-copy = @all
+ config gitolite.partialCopyOf = foo
+';
+
+try "ADMIN_PUSH set1; !/FATAL/" or die text();
+
+try "
+ /Init.*empty.*foo\\.git/
+ /Init.*empty.*foo-pc\\.git/
+";
+
+try "
+ cd ..
+
+ ## populate repo foo, by user u1
+ # create foo with a bunch of branches and tags
+ CLONE u1 foo
+ /appear.*cloned/
+ cd foo
+ tc a1 a2
+ checkout -b dev/u1/foo; tc f1 f2
+ checkout master; tc m1 m2
+ checkout master; checkout -b next; tc n1 n2; tag nt1
+ checkout -b secret-1; tc s11 s12; tag s1t1
+ checkout next; checkout -b secret-2; tc s21 s22; tag s2t1
+ glt push u1 --all
+ /new branch/; /secret-1/; /secret-2/
+ glt push u1 --tags
+ /new tag/; /s1t1/; /s2t1/
+
+ ## user u4 tries foo, fails, tries foo-pc
+ cd ..
+ CLONE u4 foo foo4; !ok
+ /R any foo u4 DENIED by fallthru/
+ CLONE u4 foo-pc ; ok;
+ /Cloning into 'foo-pc'/
+ /new branch.* dev/u1/foo .* dev/u1/foo/
+ /new branch.* master .* master/
+ /new branch.* next .* next/
+ /new branch.* secret-2 .* secret-2/
+ !/new branch.* secret-1 .* secret-1/
+ /new tag.* nt1 .* nt1/
+ /new tag.* s2t1 .* s2t1/
+ !/new tag.* s1t1 .* s1t1/
+
+ ## user u4 pushes to foo-pc
+ cd foo-pc
+ checkout master
+ tc u4m1 u4m2; PUSH u4; !ok
+ /W refs/heads/master foo-pc u4 DENIED by fallthru/
+ /hook declined to update refs/heads/master/
+ /To file:///foo-pc/
+ /remote rejected/
+ /failed to push some refs to 'file:///foo-pc'/
+
+ checkout next
+ tc u4n1 u4n2
+ PUSH u4 next; ok
+ /To .*/foo.git/
+ /new branch\\] ca3787119b7e8b9914bc22c939cefc443bc308da -> refs/partial/br-\\d+/
+ /file:///foo-pc/
+ /52c7716..ca37871 next -> next/
+ tag u4/nexttag; glt push u4 --tags
+ /To file:///foo-pc/
+ /\\[new tag\\] u4/nexttag +-> +u4/nexttag/
+ /\\[new branch\\] ca3787119b7e8b9914bc22c939cefc443bc308da -> refs/partial/br-\\d+/
+
+ checkout master
+ checkout -b dev/u4/u4master
+ tc devu4m1 devu4m2
+ PUSH u4 HEAD; ok
+ /To .*/foo.git/
+ /new branch\\] 228353950557ed1eb13679c1fce4d2b4718a2060 -> refs/partial/br-\\d+/
+ /file:///foo-pc/
+ /new branch.* HEAD -> dev/u4/u4master/
+
+ ## user u1 gets u4's updates, makes some more
+ cd ../foo
+ 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/
+ checkout master; tc u1ma1 u1ma2;
+ /\\[master 8ab1ff5\\] u1ma2 at Thu Jul 7 06:23:20 2011/
+ tag mt2; PUSH u1 master; ok
+ checkout secret-1; tc u1s1b1 u1s1b2
+ /\\[secret-1 5f96cb5\\] u1s1b2 at Thu Jul 7 06:23:20 2011/
+ tag s1t2; PUSH u1 HEAD; ok
+ checkout secret-2; tc u1s2b1 u1s2b2
+ /\\[secret-2 1ede682\\] u1s2b2 at Thu Jul 7 06:23:20 2011/
+ tag s2t2; PUSH u1 HEAD; ok
+ glt push u1 --tags; ok
+
+ glt ls-remote u1 origin
+ /8ab1ff512faf5935dc0fbff357b6f453b66bb98b\trefs/tags/mt2/
+ /5f96cb5ff73c730fb040eb2d01981f7677ca6dba\trefs/tags/s1t2/
+ /1ede6829ec7b75a53cd6acb7da64e5a8011e6050\trefs/tags/s2t2/
+
+ ## u4 gets updates but without the tag in secret-1
+ cd ../foo-pc
+ glt ls-remote u4 origin
+ !/ refs/heads/secret-1/; !/s1t1/; !/s1t2/
+ /8ab1ff512faf5935dc0fbff357b6f453b66bb98b\tHEAD/
+ /8ced4a374b3935bac1a5ba27ef8dd950bd867d47\trefs/heads/dev/u1/foo/
+ /228353950557ed1eb13679c1fce4d2b4718a2060\trefs/heads/dev/u4/u4master/
+ /8ab1ff512faf5935dc0fbff357b6f453b66bb98b\trefs/heads/master/
+ /ca3787119b7e8b9914bc22c939cefc443bc308da\trefs/heads/next/
+ /1ede6829ec7b75a53cd6acb7da64e5a8011e6050\trefs/heads/secret-2/
+ /8ab1ff512faf5935dc0fbff357b6f453b66bb98b\trefs/tags/mt2/
+ /52c7716c6b029963dd167c647c1ff6222a366499\trefs/tags/nt1/
+ /01f04ece6519e7c0e6aea3d26c7e75e9c4e4b06d\trefs/tags/s2t1/
+ /1ede6829ec7b75a53cd6acb7da64e5a8011e6050\trefs/tags/s2t2/
+
+ glt fetch u4
+ /3ea704d..8ab1ff5 master -> origin/master/
+ /01f04ec..1ede682 secret-2 -> origin/secret-2/
+ /\\[new tag\\] mt2 -> mt2/
+ /\\[new tag\\] s2t2 -> s2t2/
+ !/ refs/heads/secret-1/; !/s1t1/; !/s1t2/
+";
+__END__
+
+# last words...
+glt ls-remote u4 file:///foo-pc
+
+cd ../gitolite-admin
+cat conf/gitolite.conf
+perl s/.*marker 01.*//;
+put conf/gitolite.conf
+add conf; commit -m erdel; ok; PUSH admin; ok
+
+glt ls-remote u4 file:///foo-pc
+# see rant below at this point
+
+cd $h/repositories/foo-pc.git
+git branch -D secret-2
+git tag -d s2t1 s2t2
+git gc --prune=now
+glt ls-remote u4 file:///foo-pc
+# only *now* does the rant get addressed
+
+__END__
+
+RANT...
+
+This is where things go all screwy. Because we still have the *objects*
+pointed to by tags s2t1 and s2t2, we still get them back from the main repo.