#!/usr/local/bin/perl -w =head1 NAME cvs.t - testing of vcp cvs i/o =cut use strict ; use Carp ; use Cwd ; use File::Path ; use File::Spec ; use POSIX ':sys_wait_h' ; use Test ; use IPC::Run qw( run ) ; my $cwd = cwd ; ## We always run vcp by doing a $^X vcp, to make sure that vcp runs under ## the same version of perl that we are running under. my $vcp = 'vcp' ; $vcp = "bin/$vcp" if -x "bin/$vcp" ; $vcp = "../bin/$vcp" if -x "../bin/$vcp" ; $vcp = File::Spec->catfile( $cwd, $vcp ) ; my $t = -d 't' ? 't/' : '' ; my $tmp = File::Spec->tmpdir ; my $p4repo = File::Spec->catdir( $tmp, "cvsp4repo" ) ; my $p4work = File::Spec->catdir( $tmp, "cvsp4work" ) ; my ( $p4user, $p4client, $p4port ) = qw( p4_t_user p4_t_client 19666 ) ; my $p4spec = "p4:$p4user($p4client):\@$p4port:" ; my $cvsroot = File::Spec->catdir( $tmp, "cvsroot" ) ; my $cvswork = File::Spec->catdir( $tmp, "cvswork" ) ; END { rmtree [ $p4repo, $p4work, $cvsroot, $cvswork ] ; } my $module = 'foo' ; ## Must match the rev_root in the testrevml files my $perl = $^X ; sub slurp { my ( $fn ) = @_ ; open F, "<$fn" or die "$!: $fn" ; local $/ ; return <F> ; } my $max_change_id ; my @tests = ( sub {}, ## Mult. ok()s in next sub{}. sub { my $type = 'cvs' ; my $infile = $t . "test-$type-in-0.revml" ; my $outfile = $t . "test-$type-out-0.revml" ; my $infile_t = "test-$type-in-0-tweaked.revml" ; my $outfile_t = "test-$type-out-0-tweaked.revml" ; ## ## Idempotency test revml->cvs->revml ## my $diff = '' ; eval { my $out ; my $err ; ## $in and $out allow us to avoide execing diff most of the time. run( [ $perl, $vcp, "revml:$infile", "cvs:$cvsroot:$module" ], \undef ) or die "`$vcp revml:$infile cvs:$cvsroot:$module` returned $?" ; ok( 1 ) ; chdir $cvswork or die "$!: '$cvswork'" ; run [qw( cvs -d ), $cvsroot, "checkout", $module], \undef or die $! ; run( [ $perl, $vcp, "cvs:$cvsroot:$module", qw( -r 1.1: ) ], \undef, \$out ) or die "`$vcp cvs:$cvsroot:$module -r 1.1:` returned $?" ; chdir $cwd or die "$!: '$cwd'" ; my $in = slurp $infile ; $in =~ s{^\s*<cvs_info>.*?</cvs_info>(\r\n|\n\r|\n)}{}smg ; $in =~ s{<rep_desc>.*?</rep_desc>}{<rep_desc><!--deleted by cvs.t--></rep_desc>}s ; $out =~ s{<rep_desc>.*?</rep_desc>}{<rep_desc><!--deleted by cvs.t--></rep_desc>}s ; $in =~ s{<time>.*?</time>}{<time><!--deleted by cvs.t--></time>}sg ; $out =~ s{<time>.*?</time>}{<time><!--deleted by cvs.t--></time>}sg ; $in =~ s{^.*<mod_time>.*?</mod_time>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<label>r_.*?</label>.*(\r\n|\n\r|\n)}{}mg ; $in =~ s{^.*<change_id>.*?</change_id>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<label>ch_.*?</label>.*(\r\n|\n\r|\n)}{}mg ; $in =~ s{<user_id>.*?</user_id>}{<user_id><!--deleted by cvs.t--></user_id>}sg ; $out =~ s{<user_id>.*?</user_id>}{<user_id><!--deleted by cvs.t--></user_id>}sg ; # ## The r_ and ch_ labels are not present in the source files. # $out =~ s{.*<label>(r|ch)_\w+</label>\r?\n\r?}{}g ; open F, ">$infile_t" ; print F $in ; close F ; open F, ">$outfile_t" ; print F $out ; close F ; if ( $in ne $out && run( [ 'diff', '-U', '10', $infile_t, $outfile_t ], \undef, '>', \$diff ) && $? != 256 ) { die "`diff -d -u $infile_t $outfile_t` returned $?" ; } } ; $diff = $@ if $@ ; chomp $diff ; ok( $diff, '' ) ; if ( $diff eq '' ) { if ( -e $infile_t ) { unlink $infile_t or warn "$!: $infile_t" ; } if ( -e $outfile_t ) { unlink $outfile_t or warn "$!: $outfile_t" ; } } }, sub {}, ## Mult. ok()s in next sub{}. sub { my $type = 'cvs' ; my $infile = $t . "test-$type-in-0.revml" ; my $outfile = $t . "test-$type-out-0-p4.revml" ; my $infile_t = "test-$type-in-0-p4-tweaked.revml" ; my $outfile_t = "test-$type-out-0-p4-tweaked.revml" ; ## ## cvs->p4->revml ## my $diff = '' ; eval { my $out ; my $err ; ## Gotta use a working directory with a checked-out version chdir $cvswork or die $! . ": '$cvswork'" ; run [qw( cvs -d ), $cvsroot, "checkout", $module], \undef or die $! ; ok( 1 ) ; run( [ $perl, $vcp, "cvs:$cvsroot:$module", qw( -r 1.1: ), $p4spec, "-w", $p4work ], \undef ) or die "`$vcp cvs:$cvsroot:$module -r 1.1:` returned $?" ; chdir $cwd or die $! ; run [ $perl, $vcp, "$p4spec//depot/..." ], \undef, \$out ; my $in = slurp $infile ; $in =~ s{^\s*<cvs_info>.*?</cvs_info>(\r\n|\n\r|\n)}{}smg ; $in =~ s{<rep_type>.*?</rep_type>}{<rep_type><!--deleted by cvs.t--></rep_type>}s ; $out =~ s{<rep_type>.*?</rep_type>}{<rep_type><!--deleted by cvs.t--></rep_type>}s ; $in =~ s{<rev_root>.*?</rev_root>}{<rev_root><!--deleted by cvs.t--></rev_root>}s ; $out =~ s{<rev_root>.*?</rev_root>}{<rev_root><!--deleted by cvs.t--></rev_root>}s ; $in =~ s{<rep_desc>.*?</rep_desc>}{<rep_desc><!--deleted by cvs.t--></rep_desc>}s ; $out =~ s{<rep_desc>.*?</rep_desc>}{<rep_desc><!--deleted by cvs.t--></rep_desc>}s ; $in =~ s{<time>.*?</time>}{<time><!--deleted by cvs.t--></time>}sg ; $out =~ s{<time>.*?</time>}{<time><!--deleted by cvs.t--></time>}sg ; $in =~ s{^.*<mod_time>.*?</mod_time>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<label>r_.*?</label>.*(\r\n|\n\r|\n)}{}mg ; $in =~ s{^.*<change_id>.*?</change_id>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<label>ch_.*?</label>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<change_id>(.*?)</change_id>.*(\r\n|\n\r|\n)}{ $max_change_id = $1 if ! defined $max_change_id || $1 > $max_change_id ; "" }gem ; $out =~ s{<rev_id>}{<rev_id>1.}g ; $out =~ s{<base_rev_id>}{<base_rev_id>1.}g ; $in =~ s{<user_id>.*?</user_id>}{<user_id><!--deleted by cvs.t--></user_id>}sg ; $out =~ s{<user_id>.*?</user_id>}{<user_id><!--deleted by cvs.t--></user_id>}sg; $out =~ s{\s*<p4_info>.*?</p4_info>}{}sg ; # ## The r_ and ch_ labels are not present in the source files. # $out =~ s{.*<label>(r|ch)_\w+</label>\r?\n\r?}{}g ; open F, ">$infile_t" ; print F $in ; close F ; open F, ">$outfile_t" ; print F $out ; close F ; if ( $in ne $out && run( [ 'diff', '-U', '10', $infile_t, $outfile_t ], \undef, '>', \$diff ) && $? != 256 ) { die "`diff -d -u $infile_t $outfile_t` returned $?" ; } } ; $diff = $@ if $@ ; chomp $diff ; ok( $diff, '' ) ; if ( $diff eq '' ) { if ( -e $infile_t ) { unlink $infile_t or warn "$!: $infile_t" ; } if ( -e $outfile_t ) { unlink $outfile_t or warn "$!: $outfile_t" ; } } }, sub { skip( ! defined $max_change_id, $max_change_id, 3, "Max change_id in cvs->p4 transfer" ) }, sub {}, ## Mult. ok()s in next sub{}. sub { my $type = 'cvs' ; my $infile = $t . "test-$type-in-1.revml" ; my $outfile = $t . "test-$type-out-1.revml" ; my $infile_t = "test-$type-in-1-tweaked.revml" ; my $outfile_t = "test-$type-out-1-tweaked.revml" ; ## ## Idempotency test for an incremental revml->cvs->revml update ## my $diff = '' ; eval { my $out ; ## $in and $out allow us to avoid execing diff most of the time. run( [ $perl, $vcp, "revml:$infile", "cvs:$cvsroot:$module" ], \undef ) or die "`$vcp revml:$infile cvs:$cvsroot:$module` returned $?" ; ok( 1 ) ; ## Gotta use a working directory with a checked-out version chdir $cvswork or die $! . ": '$cvswork'" ; run [qw( cvs -d ), $cvsroot, "checkout", $module], \undef, \*STDERR, \*STDERR or die $! ; run( [ $perl, $vcp, "cvs:$cvsroot:$module", qw( -r ch_4: -f ) ], \undef, \$out , ) or die "`$vcp cvs:$cvsroot:$module -r ch_4:` returned $?" ; chdir $cwd or die $! ; my $in = slurp $infile ; $in =~ s{^\s*<cvs_info>.*?</cvs_info>(\r\n|\n\r|\n)}{}smg ; $in =~ s{<rep_desc>.*?</rep_desc>}{<rep_desc><!--deleted by cvs.t--></rep_desc>}s ; $out =~ s{<rep_desc>.*?</rep_desc>}{<rep_desc><!--deleted by cvs.t--></rep_desc>}s ; $in =~ s{<time>.*?</time>}{<time><!--deleted by cvs.t--></time>}sg ; $out =~ s{<time>.*?</time>}{<time><!--deleted by cvs.t--></time>}sg ; $in =~ s{^.*<mod_time>.*?</mod_time>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<label>r_.*?</label>.*(\r\n|\n\r|\n)}{}mg ; $in =~ s{^.*<change_id>.*?</change_id>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<label>ch_.*?</label>.*(\r\n|\n\r|\n)}{}mg ; $in =~ s{<user_id>.*?</user_id>}{<user_id><!--deleted by cvs.t--></user_id>}sg ; $out =~ s{<user_id>.*?</user_id>}{<user_id><!--deleted by cvs.t--></user_id>}sg ; # ## The r_ and ch_ labels are not present in the source files. # $out =~ s{.*<label>(r|ch)_\w+</label>\r?\n\r?}{}g ; open F, ">$infile_t" ; print F $in ; close F ; open F, ">$outfile_t" ; print F $out ; close F ; if ( $in ne $out && run( [ 'diff', '-U', '10', $infile_t, $outfile_t ], \undef, '>', \$diff ) && $? != 256 ) { die "`diff -d -u $infile_t $outfile_t` returned $?" ; } } ; $diff = $@ if $@ ; chomp $diff ; ok( $diff, '' ) ; if ( $diff eq '' ) { if ( -e $infile_t ) { unlink $infile_t or warn "$!: $infile_t" ; } if ( -e $outfile_t ) { unlink $outfile_t or warn "$!: $outfile_t" ; } } }, sub {}, ## Mult. ok()s in next sub{}. sub { my $type = 'cvs' ; my $infile = $t . "test-$type-in-1-bootstrap.revml" ; my $outfile = $t . "test-$type-out-1-bootstrap.revml" ; my $infile_t = "test-$type-in-1-bootstrap-tweaked.revml" ; my $outfile_t = "test-$type-out-1-bootstrap-tweaked.revml" ; ## ## Idempotency test ## my $diff = '' ; eval { my $out ; ## Gotta use a working directory with a checked-out version chdir $cvswork or die $! . ": '$cvswork'" ; run [qw( cvs -d ), $cvsroot, "checkout", $module], \undef, \*STDERR, \*STDERR or die $! ; ok( 1 ) ; run( [ $perl, $vcp, "cvs:$cvsroot:$module", qw( -r ch_4: -f --bootstrap=** ) ], \undef, \$out , ) or die "`$vcp cvs:$cvsroot:$module -r ch_4:` returned $?" ; chdir $cwd ; my $in = slurp $infile ; $in =~ s{^\s*<cvs_info>.*?</cvs_info>(\r\n|\n\r|\n)}{}smg ; $in =~ s{<rep_desc>.*?</rep_desc>}{<rep_desc><!--deleted by cvs.t--></rep_desc>}s ; $out =~ s{<rep_desc>.*?</rep_desc>}{<rep_desc><!--deleted by cvs.t--></rep_desc>}s ; $in =~ s{<time>.*?</time>}{<time><!--deleted by cvs.t--></time>}sg ; $out =~ s{<time>.*?</time>}{<time><!--deleted by cvs.t--></time>}sg ; $in =~ s{^.*<mod_time>.*?</mod_time>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<label>r_.*?</label>.*(\r\n|\n\r|\n)}{}mg ; $in =~ s{^.*<change_id>.*?</change_id>.*(\r\n|\n\r|\n)}{}mg ; $out =~ s{^.*<label>ch_.*?</label>.*(\r\n|\n\r|\n)}{}mg ; $in =~ s{<user_id>.*?</user_id>}{<user_id><!--deleted by cvs.t--></user_id>}sg ; $out =~ s{<user_id>.*?</user_id>}{<user_id><!--deleted by cvs.t--></user_id>}sg ; # ## The r_ and ch_ labels are not present in the source files. # $out =~ s{.*<label>(r|ch)_\w+</label>\r?\n\r?}{}g ; open F, ">$infile_t" ; print F $in ; close F ; open F, ">$outfile_t" ; print F $out ; close F ; if ( $in ne $out && run( [ 'diff', '-U', '10', $infile_t, $outfile_t ], \undef, '>', \$diff ) && $? != 256 ) { die "`diff -d -u $infile_t $outfile_t` returned $?" ; } } ; $diff = $@ if $@ ; chomp $diff ; ok( $diff, '' ) ; if ( $diff eq '' ) { if ( -e $infile_t ) { unlink $infile_t or warn "$!: $infile_t" ; } if ( -e $outfile_t ) { unlink $outfile_t or warn "$!: $outfile_t" ; } } }, ) ; plan tests => scalar( @tests ) ; ## ## Build a repository and they will come... ## my $why_skip ; $why_skip .= "# '$vcp' not found\n" unless -x $vcp ; $why_skip .= "cvs command not found\n" unless `cvs -v` =~ /Concurrent Versions System/ ; unless ( $why_skip ) { ## Give vcp ... cvs:... a repository to work with. Note that it does not ## use $cvswork, just this test script does. rmtree [ $p4repo, $p4work ] ; mkpath [ $p4repo, $p4work ], 0, 0700 ; # END { rmtree [$p4repo,$p4work] } $ENV{CVSROOT} = $cvsroot ; rmtree [ $cvsroot, $cvswork ] ; mkpath [ $cvsroot, $cvswork ], 0, 0700 ; # END { rmtree [$cvsroot,$cvswork] } system qw( cvs init ) and die "cvs init failed" ; chdir $cvswork or die "$!: $cvswork" ; mkdir $module, 0770 or die "$!: $module" ; chdir $module or die "$!: $module" ; system qw( cvs import -m ), "${module} import", $module, "${module}_vendor", "${module}_release" and die "cvs import failed" ; chdir $cwd or die "$!: $cwd" ; $ENV{CVSROOT} = "foobar" ; $ENV{P4USER}= $p4user ; $ENV{P4CLIENT}= $p4client ; $ENV{P4PORT} = $p4port ; launch_p4d() ; init_client() ; $ENV{P4USER} = "foobar_user" ; $ENV{P4PORT} = "foobar_port" ; $ENV{P4CLIENT} = "foobar_client" ; $ENV{P4PASSWD} = "foobar_passwd" ; } print STDERR $why_skip if $why_skip ; $why_skip ? skip( 1, '' ) : $_->() for @tests ; #chdir "$cvswork/cvs_t" or die $! ;; #print `pwd` ; #run( ['cvs', 'log', glob( '*/*' )] ) ; ############################################################################### sub launch_p4d { ## Ok, this is wierd: we need to fork & run p4d in foreground mode so that ## we can capture it's PID and kill it later. There doesn't seem to be ## the equivalent of a 'p4d.pid' file. my $p4d_pid = fork ; unless ( $p4d_pid ) { ## Ok, there's a tiny chance that this will fail due to a port ## collision. Oh, well. exec 'p4d', '-f', '-r', $p4repo ; die "$!: p4d" ; } sleep 1 ; ## Wait for p4d to start. 'twould be better to wait for P4PORT to ## be seen. select( undef, undef, undef, 0.250 ) ; END { kill 'INT', $p4d_pid or die "$! $p4d_pid" ; my $t0 = time ; my $dead_child ; while ( $t0 + 15 > time ) { select undef, undef, undef, 0.250 ; $dead_child = waitpid $p4d_pid, WNOHANG ; warn "$!: $p4d_pid" if $dead_child == -1 ; last if $dead_child ; } unless ( defined $dead_child && $dead_child > 0 ) { print "terminating $p4d_pid\n" ; kill 'TERM', $p4d_pid or die "$! $p4d_pid" ; $t0 = time ; while ( $t0 + 15 > time ) { select undef, undef, undef, 0.250 ; $dead_child = waitpid $p4d_pid, WNOHANG ; warn "$!: $p4d_pid" if $dead_child == -1 ; last if $dead_child ; } } unless ( defined $dead_child && $dead_child > 0 ) { print "killing $p4d_pid\n" ; kill 'KILL', $p4d_pid or die "$! $p4d_pid" ; } } } sub init_client { my $client_desc = `p4 client -o` ; $client_desc =~ s(^Root.*)(Root:\t$p4work)m ; $client_desc =~ s(^View.*)(View:\n\t//depot/...\t//$ENV{P4CLIENT}/...\n)ms ; open( P4, "| p4 client -i" ) or die "$! p4 client -i" ; print P4 $client_desc ; close P4 ; }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#36 | 2268 | Barrie Slaymaker | factor out 91revml2cvs.t | ||
#35 | 2267 | Barrie Slaymaker | factor out cvs2revml, test both --use-cvs and direct modes, with times | ||
#34 | 2265 | Barrie Slaymaker | factor out t/95cvs2p4.pm and allow it to reuse the cvs repo for speed. | ||
#33 | 2246 | Barrie Slaymaker | let FATALTEST control fatality of tests | ||
#32 | 2245 | Barrie Slaymaker | cvs -r (re)implemented for direct reads, passes all cvs-only tests | ||
#31 | 2241 | Barrie Slaymaker | RCS file scanning improvements, implement some of -r | ||
#30 | 2240 | Barrie Slaymaker | Start on cvs -r option support. | ||
#29 | 2236 | Barrie Slaymaker | Debug, speed up cvs file parsing | ||
#28 | 2235 | Barrie Slaymaker | Debugging cvs speed reader. | ||
#27 | 2044 | Barrie Slaymaker | Tweak to reflect branched => branch-#/branched | ||
#26 | 2042 | Barrie Slaymaker | Basic source::p4 branching support | ||
#25 | 2026 | Barrie Slaymaker | VCP::8::cvs now supoprt branching | ||
#24 | 2006 | Barrie Slaymaker |
more preparations for branching support, handling of cvs :foo:... CVSROOT specs, misc fixes, improvements |
||
#23 | 1728 | Barrie Slaymaker | CVS on win32, minor bugfixes | ||
#22 | 1366 | Barrie Slaymaker | Require Regexp::Shellish 0.93 for '...' support | ||
#21 | 1358 | Barrie Slaymaker | Win32 changes | ||
#20 | 1055 | Barrie Slaymaker |
add sorting, revamp test suite, misc cleanup. Dest/revml is not portable off my system yet (need to release ...::Diff) |
||
#19 | 825 | Barrie Slaymaker |
test, handle case where no revs are transferred and VCP::Dest::*::handle_footer() blew up. |
||
#18 | 812 | Barrie Slaymaker |
A more sensible name for on_first_rev(), and allow incremental foo->p4 updates to work by backfilling the base rev instead of trying to add it. |
||
#17 | 723 | Barrie Slaymaker | VCP::Dest::cvs tuning and cvs and p4 bugfixes | ||
#16 | 719 | Barrie Slaymaker | vcp 0.221 | ||
#15 | 705 | Barrie Slaymaker | Release 0.22. | ||
#14 | 701 | Barrie Slaymaker | Fixed VCP::Dest::p4 re-rooting problem, further t/* cleanup | ||
#13 | 699 | Barrie Slaymaker | test suite cleanup | ||
#12 | 692 | Barrie Slaymaker |
Add VCP::Utils::p4 and use it to get VCP::Dest::p4 to create it's own client view as needed. |
||
#11 | 689 | Barrie Slaymaker |
reinstate -f behavior as the default for VCP::Source::cvs, clean up -D --> -d doco. |
||
#10 | 687 | Barrie Slaymaker | remove -f, tweak deduce_rev_root | ||
#9 | 669 | Barrie Slaymaker |
0.1 Wed Jul 4 00:27:35 EDT 2001 Fix VCP::Dest::p4 to take the filespec from the p4:<dest> spec and use it as the rev_root. No --rev-root option at this time, not sure if it's needed. Reported by david d zuhn <zoo@bravara.com>. |
||
#8 | 615 | Barrie Slaymaker |
Detect p4d <= 99.2 and skip tests. Fix a use strict problem. Both reported by Nick Ing-Simmons. |
||
#7 | 610 | Barrie Slaymaker | Tweaked t/90cvs.t to not try to rmtree undef. | ||
#6 | 608 | Barrie Slaymaker |
Lots of changes to get vcp to install better, now up to 0.066. Many thanks to Matthew Attaway for testing & suggestions. |
||
#5 | 481 | Barrie Slaymaker | Made test suites use File::Spec->tmpdir and clean up after themselves | ||
#4 | 480 | Barrie Slaymaker |
0.06 Wed Dec 20 23:19:15 EST 2000 - bin/vcp: Added --versions, which loads all modules and checks them for a $VERSION and print the results out. This should help with diagnosing out-of-sync modules. - Added $VERSION vars to a few modules :-). Forgot to increment any $VERSION strings. - VCP::Dest::cvs: The directory "deeply" was not being `cvs add`ed on paths like "a/deeply/nested/file", assuming "deeply" had no files in it. - VCP::Dest::revml: fixed a bug that was causing files with a lot of linefeeds to be emitted in base64 instead of deltaed. This means most text files. - Various minor cleanups of diagnostics and error messages, including exposing "Can't locate Foo.pm" when a VCP::Source or VCP::Dest module depends on a module that's not installed, as reported by Jeff Anton. |
||
#3 | 478 | Barrie Slaymaker |
0.05 Mon Dec 18 07:27:53 EST 2000 - Use `p4 labels //...@label` command as per Rober Cowham's suggestion, with the '-s' flag recommended by Christopher Siewald and Amaury.FORGEOTDARC@atsm.fr. Though it's actually something like vcp: running /usr/bin/p4 -u safari -c safari -p localhost:5666 -s files //.../NtLkly //...@compiler_a3 //.../NtLkly //...@compiler_may3 and so //on //for 50 parameters to get the speed up. I use the //.../NtLkly "file" as //a separator between the lists of files in various //revisions. Hope nobody has any files named that :-). What I should do is choose a random label that doesn't occur in the labels list, I guess. - VCP::Source::revml and VCP::Dest::revml are now binary, control code, and "hibit ASCII" (I know, that's an oxymoron) clean. The <comment>, <delta>, and <content> elements now escape anything other than tab, line feed, space, or printable chars (32 <= c <= ASCII 126) using a tag like '<char code="0x09">'. The test suite tests all this. Filenames should also be escaped this way, but I didn't get to that. - The decision whether to do deltas or encode the content in base64 is now based on how many characters would need to be escaped. - We now depend on the users' diff program to have a "-a" option to force it to diff even if the files look binary to it. I need to use Diff.pm and adapt it for use on binary data. - VCP::Dest::cvs now makes sure that no two consecutive revisions of the same file have the same mod_time. VCP::Source::p4 got so fast at pulling revisions from the repositories the test suite sets up that CVS was not noticing that files had changed. - VCP::Plugin now allows you to set a list of acceptable result codes, since we now use p4 in ways that make it return non-zero result codes. - VCP::Revs now croaks if you try to add two entries of the same VCP::Rev (ie matching filename and rev_id). - The <type> tag is now limited to "text" or "binary", and is meant to pass that level of info between foreign repositories. - The <p4_info> on each file now carries the one line p4 description of the file so that p4->p4 transferes can pick out the more detailed info. VCP::Source::p4, VCP::Dest::p4 do this. - VCP::{Source,Dest}::{p4,cvs} now set binaryness on added files properly, I think. For p4->p4, the native p4 type is preserved. For CVS sources, seeing the keyword substitution flag 'o' or 'b' implies binaryness, for p4, seeing a filetype like qr/u?x?binary/ or qr/x?tempobj/ or "resource" implies binaryness (to non-p4 destinations). NOTE: Seeing a 'o' or 'b' in a CVS source only ends up setting the 'b' option on the destination. That should be ok for most uses, but we can make it smarter for cvs->cvs transfers if need be. |
||
#2 | 468 | Barrie Slaymaker |
- VCP::Dest::p4 now does change number aggregation based on the comment field changing or whenever a new revision of a file with unsubmitted changes shows up on the input stream. Since revisions of files are normally sorted in time order, this should work in a number of cases. I'm sure we'll need to generalize it, perhaps with a time thresholding function. - t/90cvs.t now tests cvs->p4 replication. - VCP::Dest::p4 now doesn't try to `p4 submit` when no changes are pending. - VCP::Rev now prevents the same label from being applied twice to a revision. This was occuring because the "r_1"-style label that gets added to a target revision by VCP::Dest::p4 could duplicate a label "r_1" that happened to already be on a revision. - Added t/00rev.t, the beginnings of a test suite for VCP::Rev. - Tweaked bin/gentrevml to comment revisions with their change number instead of using a unique comment for every revision for non-p4 t/test-*-in-0.revml files. This was necessary to test cvs->p4 functionality. |
||
#1 | 467 | Barrie Slaymaker | Version 0.01, initial checkin in perforce public depot. |