95p42cvs.t #1

  • //
  • guest/
  • perforce_software/
  • revml/
  • t/
  • 95p42cvs.t
  • View
  • Commits
  • Open Download .zip Download (5 KB)
#!/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.