91svn2revml.t #1

  • //
  • guest/
  • perforce_software/
  • revml/
  • t/
  • 91svn2revml.t
  • View
  • Commits
  • Open Download .zip Download (6 KB)
#!/usr/local/bin/perl -w

=head1 NAME

91p42revml.t - testing of vcp p4 i/o

=cut

use strict ;

use Carp ;
use Test ;
use VCP::TestUtils ;

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

my $p4root_0 = "${t}p4root_0";
my $p4root_1 = "${t}p4root_1";
my $p4root_2 = "${t}p4root_2";
my $p4root_3 = "${t}p4root_3";

my $p4spec_0 = "p4:revml2p4\@$p4root_0:";
my $p4spec_1 = "p4:revml2p4\@$p4root_1:";
my $p4spec_2 = "p4:revml2p4\@$p4root_2:";
my $p4spec_3 = "p4:revml2p4\@$p4root_3:";

my $deepdir = "one/two/three/four/five";

# what change number to start incremental export at
## my $first_import_1_change; # was called $incr_change

my @tests = (
##
## revml -> p4 -> revml, bootstrap export
##
sub {
   my $infile  = $t . "test-p4-in-0.revml" ;
   ##
   ## Idempotency test
   ##
   ## These depend on the "test-foo-in-0.revml" files built in the makefile.
   ## See MakeMaker.PL for how those are generated.
   ##
   ## We are also testing to see if we can re-root the files under foo/...
   ##

   my $state = "${t}91p42revml_state_A";
   rm_dir_tree $state;

   my $in  = slurp $infile ;
   my $out = get_vcp_output(
      "$p4spec_0//depot/foo/...",
      "--repo-id=p4:test_repository",
      "--run-p4d",
      { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ] } 
   );

   s_content qw( rep_desc time p4_info ), \$in, \$out ;
   s_content qw( rev_root ),              \$in, "depot/foo" ;

   $in =~ s{(id="|_id>)/+ignored}{$1//depot/foo}g;
   $in =~ s{(id="|_id>)ignored}{$1depot/foo}g;

   ok_or_diff $out, $in;
},


## Test a single file extraction from a p4 repo.  This file exists in
## change 1.

sub {
   my $state = "${t}91p42revml_state_B";
   rm_dir_tree $state;
   ok(
      get_vcp_output(
         "$p4spec_0//depot/foo/main/add/f1",
         "--repo-id=p4:test_repository",
         "--run-p4d",
         { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ] },
      ),
      qr{<rev_root>depot/foo/main/add</.+<name>f1<.+<rev_id>1<.+<rev_id>2<.+</revml>}s
   ) ;
},

## Test a single file extraction from a p4 repo.  This file does not exist
## in change 1.
sub {
   my $state = "${t}91p42revml_state_C";
   rm_dir_tree $state;
   ok(
      get_vcp_output(
         "$p4spec_0//depot/foo/main/add/f2",
         "--repo-id=p4:test_repository",
         "--run-p4d",
         { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ] },
      ),
      qr{<rev_root>depot/foo/main/add</.+<name>f2<.+<change_id>2<.+<change_id>3<.+</revml>}s
   ) ;

},

##
## p4->revml, re-rooting a dir tree 
## copies //depot/foo/main/a/deeply/ as if it was a whole repo
## into a target dir as if it were a complete repository.             
##
sub {
   my $state = "${t}91p42revml_state_D";
   rm_dir_tree $state;

   my $infile  = $t . "test-p4-in-0.revml" ;
   my $in  = slurp $infile ;
   my $out = get_vcp_output(
      "$p4spec_0//depot/foo/main/a/deeply/...",
      "--repo-id=p4:test_repository",
      "--run-p4d",
      { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ] } 
   );
   
   s_content qw( rep_desc time ), \$in, \$out ;
   s_content qw( rev_root ),                    \$in, "depot/foo/main/a/deeply" ;
   rm_elts   qw( mod_time change_id p4_info ),  \$in, \$out ;

   ## Strip out all files from $in that shouldn't be there
   rm_elts    qw( rev ), qr{(?:(?!a/deeply).)*?}s, \$in ;
   
   ## Adjust the $in paths to look like the result paths.  $in is
   ## now the "expected" output.
   $in =~ s{<(name|source_name)>main/a/deeply/}{<$1>}g ;
   $in =~ s{(id="|_id>)/+ignored}{$1//depot/foo}g;
   $in =~ s{(id="|_id>)ignored}{$1depot/foo}g;

   ok_or_diff $out, $in;
},


##
## revml -> p4 -> revml, incremental export
##

sub {
   my $infile  = $t . "test-p4-in-1.revml" ;

   my $state = "${t}91p42revml_state_E";
   rm_dir_tree $state;
   copy_dir_tree "${t}91p42revml_state_A" => $state;

   # see if got the right # of files, changes
   # p42revml will do detailed checking (the following code)
   my $in  = slurp $infile ;
   my $out = get_vcp_output(
       "$p4spec_1//depot/foo/...",
       "--repo-id=p4:test_repository",
       "--continue",
       "--run-p4d",
      { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ] }
   );

   $in =~ s{</rev_root>}{/foo</rev_root>} ;
   s_content  qw( rep_desc time p4_info ), \$in, \$out ;
   s_content  qw( rev_root ),              \$in, "depot/foo" ;

   $in =~ s{(id="|_id>)/+ignored}{$1//depot/foo}g;
   $in =~ s{(id="|_id>)ignored}{$1depot/foo}g;
   
   ok_or_diff $out, $in;
},


##
## p4 -> revml, incremental export in bootstrap mode
##
sub {
   my $infile  = $t . "test-p4-in-1-bootstrap.revml" ;

   my $state = "${t}91p42revml_state_F";
   rm_dir_tree $state;
   copy_dir_tree "${t}91p42revml_state_A" => $state;

   my $in  = slurp $infile ;
   my $out = get_vcp_output(
      "$p4spec_1//depot/foo/...",
      "--repo-id=p4:test_repository",
      "--continue",
      "--bootstrap=...",
      "--run-p4d",
      { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ] } 
   );

   $in =~ s{</rev_root>}{/foo</rev_root>} ;
   s_content  qw( rep_desc time p4_info ), \$in, \$out ;
   s_content  qw( rev_root ),              \$in, "depot/foo" ;

   $in =~ s{(id="|_id>)/+ignored}{$1//depot/foo}g;
   $in =~ s{(id="|_id>)ignored}{$1depot/foo}g;

   ok_or_diff $out, $in;
},

## Check contents of t/p4root_2
##   extract p4 to revml
##   build expected from revml
##
## p4->revml, re-rooting a dir tree
##
sub {
   my $infile  = $t . "test-p4-in-0.revml" ;
   my $in = slurp $infile;
   my $out = get_vcp_output(
      "$p4spec_2//depot/foo/...",
      "--repo-id=p4:test_repository",
      "--run-p4d"
   );

   s_content  qw( rep_desc time ), \$in, \$out ;
   rm_elts    qw( p4_info       ), \$in, \$out ;

   ## Adjust the $in paths to look like the result paths.  $in is
   ## now the "expected" output.
   s_content  qw( rev_root ), \$in, "depot/foo" ;
   $in =~ s{(<(?:source_)?name>)}{${1}${deepdir}/}g;
   $in =~ s{(id="|id>)/ignored}{$1//depot/foo/${deepdir}}g;
   $in =~ s{(_id>)ignored}{$1//depot/foo/${deepdir}}g;

   ok_or_diff $out, $in;
},

## We don't check the contents of t/p4root_3 because that's hard and
## not incredibly necessary.

) ;

plan tests => scalar @tests ;

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
#2 5404 Barrie Slaymaker - SVN support added
- Makefile gives clearer notices about missing optional
  prereqs.
- VCP::Filter::labelmap and VCP::Filter::map: <<skip>> replaces
  deprecated <<delete>> to be clearer that no revisions
  are deleted from either repository but some just are
  skipped and not inserted.
- VCP::Filter::map: support added for SVN-like branch labels
- VCP::Source: support added for ISO8601 timestamps
  emitted by SVN.
#1 5364 Barrie Slaymaker - Created t/91svn2revml.t
//guest/perforce_software/revml/t/91p42revml.t
#20 3800 Barrie Slaymaker - <branches> removed from all code
#19 3719 Barrie Slaymaker - p4 username is now parsed correctly (but client is lost)
#18 3717 Barrie Slaymaker - Minor docco cleanup
#17 3428 Barrie Slaymaker - Test suite cleanup
#16 2926 John Fetkovich remove --state-location switch
       add --db-dir and --repo-id switches
       build state location from concatenation of those two.
#15 2915 Barrie Slaymaker Default to *not* changing the first rev of a branch,
       add --change-branch-rev-1 to enable the non-default
       behavior (which is what is used by most of the test suite).
#14 2914 Barrie Slaymaker Remove need for launch_p4d and general cleanup.
#13 2913 Barrie Slaymaker Put a user id on each change
#12 2863 Barrie Slaymaker Use the absolute path to a file's directory as its
       branch_id for SCMs that branch in file path space.
#11 2854 John Fetkovich fixed hard-coded "t/" to be ${t} in state file locations.
#10 2843 John Fetkovich remove old comments,
       add --state-location switch to the tests that didn't have it.
#9 2842 Barrie Slaymaker Get --continue working in VCP::Source::p4
#8 2840 John Fetkovich oops, left a debugging 'die' in the test suite.
#7 2836 John Fetkovich Make Source::p4 use --continue and --bootstrap options (partial)
       update test suite appropriately
#6 2763 John Fetkovich test a rerooted revml->p4 to someplace deep in the p4 tree, to make sure
       that VCP is configuring p4 to map the files to the right place.
#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 2714 Barrie Slaymaker Simplify t/90*cvs.t tests, remove make_cvsroots for speed and
       simplicity.
#3 2650 John Fetkovich Change clean_p4_branch_spec to remove Options: lines.
       We can't always expect this to be the same.
#2 2600 John Fetkovich Minor clean-ups.
#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.