File: 95p42cvs.t

package info (click to toggle)
libvcp-perl 0.9-20041020-1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 1,608 kB
  • ctags: 833
  • sloc: perl: 18,190; sh: 11
file content (173 lines) | stat: -rw-r--r-- 5,070 bytes parent folder | download | duplicates (2)
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
#!/usr/local/bin/perl -w

=head1 NAME

p4.t - testing of vcp p4 i/o

=cut

use strict ;

use Carp ;
use File::Spec ;
use Test ;
use VCP::TestUtils ;

my @vcp = ( vcp_cmd, "vcp:-" );

my $t = -d 't' ? 't/' : '' ;

## Repositories to read from
my $p4root_0 = "${t}p4root_0";
my $p4root_1 = "${t}p4root_1";

## where to put the destination repository
my $cvsroot = tmpdir "cvsroot";

my $state_location = tmpdir "vcp_state";

## where to write to in the destination repo
my $cvs_module = "p4_t_module";

my $cvs_spec = "cvs:$cvsroot:$cvs_module/";

my $repo_id;

## -kb is used when extracting from CVS to get \n-only lineends
## because that's what bin/gentrevml generates and \rs would be
## encoded as <char.../> elements (so we can't just let perl
## or an XML parser hide linending issues).

my @tests = (
##
## p4->cvs->revml bootstrap
##
## read p4root_0 into cvs
sub {
   my $vcp_spec = <<VCP_FILE;
Source:      p4:revml2p4\@$p4root_0://depot/foo/...
               --run-p4d
               --repo-id=p4:test_repository

Destination: $cvs_spec
               --init-cvsroot
               --delete-cvsroot
               --db-dir=$state_location
               --repo-id=cvs:test_repository

Map:
## ASSumes directories under //depot/foo/ are the main and branch
## dirs.
        */(...)<(...)>  \$1<\$2>
VCP_FILE

   eval { run \@vcp, \$vcp_spec };
   ok $@ || '', '';
},

## read cvs repository built in previous test, and compare it to the
## test-cvs-in-0.revml to see how it compares to a file that hasn't been
## through a revml->p4->cvs->revml pipeline.
sub {
   return skip "previous test failed", 1 if $@;

   my $infile  = $t . "test-cvs-in-0.revml" ;
   my $in = slurp $infile ;
   #my $out = get_vcp_output $cvs_spec, qw( -kb -r 1.1: ) ;
   my $out = get_vcp_output $cvs_spec, "-kb",
      { revml_out_spec => [ "--db-dir=$state_location", "--repo-id=revml:test_repository" ] } ;


   s_content  qw( rep_desc time user_id ),   \$in, \$out ;
   s_content  qw( rev_root ),                \$in, $cvs_module ;
   ## TODO can we get the real repo_id here?
   s_content qw( source_repo_id ),          \$out, "cvs:test_repository";
   rm_elts    qw( cvs_info change_id source_change_id mod_time ), \$in ;
   rm_elts    qw( label ), qr/vcp_.*/, \$out ;

   $in =~ s{(id="|_id>)/+ignored}{$1/$cvs_module}g;
   $in =~ s{<(.*branch_id)>main-branch-1</\1>}{<$1>tag_//depot/foo/main-branch-1/</$1>}g;

   $in =~ s{(create branch ')(.*?)(')}{${1}tag_//depot/foo/$2/$3}g;

   ok_or_diff $out, $in;
},


## --repo-id here should agree with the other one above that writes to
## the same destination.  because we are faking by reading from two
## different repositories that are really for test purposes snapshots
## of the same repository at two different moments in time.  
##
## because vcp would by default use the paths to these two
## repositories as the repo_ids, vcp would refuse to add an
## incremental export from the second repository on top of the
## revisions from the first repository.  by specifying the same
## repo_id in both places, we make vcp think that the revisions came
## from the same repository.

##
## p4->cvs->revml incremental export
##
## read from p4root_1 repository into cvs.
##
sub {
   eval { run \@vcp, \<<VCP_END; } or die $@;
Source:       p4:revml2p4\@$p4root_1://depot/foo/...
                --continue
                --run-p4d
                --repo-id=p4:test_repository

Destination:  $cvs_spec
                --db-dir=$state_location
                --repo-id=cvs:test_repository

Map:
## ASSumes directories under //depot/foo/ are the main and branch
## dirs.
        */(...)<(...)>  \$1<\$2>
VCP_END

   ok 1;
},


## extract stuff inserted into cvs in the previous test and compare
## to the source revml to see that it got there ok.
sub {
   my $infile  = $t . "test-cvs-in-1.revml" ;
   my $in = slurp $infile ;
   my $out = get_vcp_output $cvs_spec, "-kb", "--continue",
      { revml_out_spec => [ "--db-dir=$state_location", "--repo-id=revml:test_repository" ] } ;
   
   s_content qw( rep_desc time user_id ),   \$in, \$out ;
   s_content qw( rev_root ),                \$in, $cvs_module ;
   s_content qw( source_repo_id ),          \$out, "cvs:test_repository";
   rm_elts   qw( cvs_info change_id source_change_id mod_time ), \$in ;
   rm_elts   qw( label ), qr/vcp_.*/, \$out ;

#      $out =~ s{<rev_id>1.}{<rev_id>}g ;
#      $out =~ s{<base_rev_id>1.}{<base_rev_id>}g ;
#      $out =~ s{((id="|_id>)?[^>]*#)1\.}{$1}g;
#
   $in =~ s{(id="|_id>)/+ignored}{$1/$cvs_module}g;
   $in =~ s{<(.*branch_id)>main-branch-1</\1>}{<$1>tag_//depot/foo/main-branch-1/</$1>}g;

   ok_or_diff $out, $in;
},

);  # end @tests.


plan tests => scalar @tests;

my $p4d_borken = $ENV{P4BORKEN}  || p4d_borken ;
my $cvs_borken = $ENV{CVSBORKEN} || cvs_borken;


my $why_skip ;
$why_skip .= "p4 command not found\n"  unless ( `p4 -V`  || 0 ) =~ /^Perforce/ ;
$why_skip .= "$p4d_borken\n"           if $p4d_borken ;
$why_skip .= "$cvs_borken\n"           if $cvs_borken ;

$why_skip ? skip( $why_skip, '' ) : $_->() for @tests ;