#!/usr/local/bin/perl -w
=head1 NAME
p4.t - testing of vcp p4 i/o
=cut
use strict ;
use Carp ;
use File::Spec ;
use POSIX ':sys_wait_h' ;
use Test ;
use VCP::TestUtils ;
my @vcp = vcp_cmd ;
my $t = -d 't' ? 't/' : '' ;
my $p4_options ;
my $p4_spec_base ;
my $p4_rev_root ;
my $p4_spec ;
# what change number to start incremental export at
my $first_import_1_change; # was called $incr_change
my $cvs_options ;
my $cvs_module ;
my $cvs_borken = $ENV{CVSBORKEN} || cvs_borken;
my @tests = (
sub {
return skip $cvs_borken, "" if $cvs_borken ;
# init_cvs before initting p4d, since it may need to set the uid and euid.
$cvs_module = 'p4_t_module' ;
$cvs_options = init_cvsroot "p4_", $cvs_module ;
ok 1 ;
},
###
# start p4 daemon in existing p4root_0
sub {
$ENV{P4USER} = "foobar_user" ;
$ENV{P4PORT} = "foobar_port" ;
$ENV{P4CLIENT} = "foobar_client" ;
$ENV{P4PASSWD} = "foobar_passwd" ;
$p4_options = launch_p4d "p4_", {
repo_dir => "${t}p4root_0",
} ;
$p4_spec_base = "p4:$p4_options->{user}:\@$p4_options->{port}:" ;
$p4_rev_root = "//depot/foo/" ;
$p4_spec = "$p4_spec_base$p4_rev_root" ;
ok 1 ;
},
##
## p4->cvs->revml bootstrap
##
sub { ## Two ok's in next test.
return skip $cvs_borken, "" if $cvs_borken ;
},
sub {
return skip $cvs_borken, "" if $cvs_borken ;
$ENV{CVSROOT} = $cvs_options->{repo};
eval {
run [ @vcp, "${p4_spec}...", "cvs:$cvs_module/" ], \undef;
ok 1 ;
my $infile = $t . "test-p4-in-0.revml" ;
my $in = slurp $infile ;
my $out = get_vcp_output "cvs:$cvs_module/", qw( -r 1.1: ) ;
s_content qw( rep_desc rep_type time user_id ), \$in, \$out ;
s_content qw( rev_root ), \$in, $cvs_module ;
rm_elts qw( p4_info change_id ), \$in ;
rm_elts qw( label ), qr/r_\w+|ch_\w+/, \$in, \$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;
assert_eq $infile, $in, $out ;
} ;
ok (( $@ || '' ), '', 'diff' );
},
# determine next change number that p4d will use this will become the
# change number of the first change in t/test-p4-in-1.revml when it is
# imported.
sub {
# get counter change
run_p4 [ qw( counter change ) ],
\undef,
\$first_import_1_change,
$p4_options ;
chomp $first_import_1_change ;
die "Invalid change counter value: '$first_import_1_change'"
unless $first_import_1_change =~ /^\d+$/ ;
++$first_import_1_change ;
ok 1;
},
# shut down the p4root_0 p4d
sub {
$p4_options->{p4d_handle}->kill_kill;
ok 1;
},
###
# start p4d in existing p4root_1
sub {
$ENV{P4USER} = "foobar_user" ;
$ENV{P4PORT} = "foobar_port" ;
$ENV{P4CLIENT} = "foobar_client" ;
$ENV{P4PASSWD} = "foobar_passwd" ;
$p4_options = launch_p4d "p4_", {
repo_dir => "${t}p4root_1",
} ;
$p4_spec_base = "p4:$p4_options->{user}:\@$p4_options->{port}:" ;
$p4_spec = "$p4_spec_base$p4_rev_root" ;
ok 1 ;
},
##
## p4->cvs->revml incremental export
##
sub { ## Two ok's in next test.
return skip $cvs_borken, "" if $cvs_borken ;
},
sub {
return skip $cvs_borken, "" if $cvs_borken ;
$ENV{CVSROOT} = $cvs_options->{repo};
eval {
run [ @vcp, "${p4_spec}...\@$first_import_1_change,#head", "cvs:$cvs_module/" ], \undef;
ok 1 ;
my $infile = $t . "test-p4-in-1.revml" ;
my $in = slurp $infile ;
my $out = get_vcp_output "cvs:$cvs_module/", "-r", "ch_$first_import_1_change:" ;
s_content qw( rep_desc rep_type time user_id ), \$in, \$out ;
s_content qw( rev_root ), \$in, $cvs_module ;
rm_elts qw( p4_info change_id ), \$in ;
rm_elts qw( label ), qr/r_\w+|ch_\w+/, \$in, \$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;
rm_elts qw( branches ), \$in ;
## TODO: This is an incremental export and perforce does not give us
## a trivial way to figure out what branch a file is on (since
## multiple branch views can cover the same file), so we bail
## on that for now.
rm_elts qw( branch_id ), \$in ;
assert_eq $infile, $in, $out ;
} ;
ok $@ || '', '', 'diff' ;
},
# shut down the p4root_1 p4d
sub {
$p4_options->{p4d_handle}->kill_kill;
ok 1;
},
); # end @tests.
plan tests => scalar @tests, todo => [ 4 ] ;
my $p4d_borken = p4d_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 ? skip( $why_skip, '' ) : $_->() for @tests ;
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #15 | 5403 | Barrie Slaymaker | - Misc logging, maintainability & debugging improvements | ||
| #14 | 3970 | Barrie Slaymaker |
- VCP::Source handles rev queing, uses disk to reduce RAM - Lots of other fixes |
||
| #13 | 3428 | Barrie Slaymaker | - Test suite cleanup | ||
| #12 | 2973 | Barrie Slaymaker | Fix handling of branched but unchanged files | ||
| #11 | 2926 | John Fetkovich |
remove --state-location switch add --db-dir and --repo-id switches build state location from concatenation of those two. |
||
| #10 | 2894 | Barrie Slaymaker | Get t/95p42cvs.t to pass | ||
| #9 | 2856 | John Fetkovich | Add use of --repo-id, --continue, and --state-location switches. | ||
| #8 | 2802 | John Fetkovich |
Added a source_repo_id to each revision, and repo_id to each Source and Dest. The repo_ids include repository type (cvs,p4,revml,vss,...) and the repo_server fields. Changed the $self->...->set() and $self->...->get() lines in VCP::Dest::* to pass in a conglomerated key value, by passing in the key as an ARRAY ref. Also various restructuring in VCP::DB.pm, VCP::DB_file.pm and VCP::DB_file::sdbm.pm related to this change. |
||
| #7 | 2799 | Barrie Slaymaker | Remove old debug code | ||
| #6 | 2756 | John Fetkovich | check skips if cvs not present | ||
| #5 | 2743 | John Fetkovich |
Add fields to vcp: source_name, source_filebranch_id, source_branch_id, source_rev_id, source_change_id 1. Alter revml.dtd to include the fields 2. Alter bin/gentrevml to emit legal RevML 3. Extend VCP::Rev to have the fields 4. Extend VCP::{Source,Dest}::revml to read/write the fields (VCP::Dest::revml should die() if VCP tries to emit illegal RevML) 5. Extend VCP::{Source,Dest}::{cvs,p4} to read the fields 7. Get all tests through t/91*.t to pass except those that rely on ch_4 labels |
||
| #4 | 2712 | Barrie Slaymaker |
RevMapDB works, branching seems to (pending further changes in statefulness so we can get incremental revml output without using labels in the source repo). |
||
| #3 | 2706 | Barrie Slaymaker | Interim checkin | ||
| #2 | 2699 | Barrie Slaymaker | remove unnecessary dependancies | ||
| #1 | 2589 | John Fetkovich |
Split 90p4.t into 90revml2p4_0.t, 90revml2p4_1.t, 91p42revml.t, 95p42cvs.t. Added some utilities to the library files listed. |