summaryrefslogtreecommitdiffstats
path: root/t/partial-copy.t
blob: 493f0d4f3e626daf3e75d48f120078f2743f1ce6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
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.