#!/usr/local/bin/perl -w =head1 NAME 91vss2revml.t - testing of vss output =cut use strict ; use Carp ; use Test ; use VCP::TestUtils ; my $t = -d 't' ? 't/' : '' ; my $project = "revml2vss"; my $vssroot_0 = "${t}vssroot_0"; my $vssroot_1 = "${t}vssroot_1"; my $vssroot_2 = "${t}vssroot_2"; my $vssroot_3 = "${t}vssroot_3"; my $vssspec_0 = "vss:Admin\@$vssroot_0:$project"; my $vssspec_1 = "vss:Admin\@$vssroot_1:$project"; my $vssspec_2 = "vss:Admin\@$vssroot_2:$project"; my $vssspec_3 = "vss:Admin\@$vssroot_3:$project"; my $deepdir = "one/two/three/four/five"; my @tests = ( ## ## vss -> revml, bootstrap export ## sub { my $infile = $t . "test-vss-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}91vss2revml_state_A"; rm_dir_tree $state; my $in = slurp $infile ; my $out = get_vcp_output( "-d", "$vssspec_0/...", "--repo-id=vss:test_repository", { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ] } ); s_content qw( rep_desc time vss_info ), \$in, \$out ; s_content qw( rev_root ), \$in, $project ; $in =~ s{(id="|_id>)/+ignored}{$1/$project}g; $in =~ s{(id="|_id>)ignored}{$1/$project}g; $in =~ s{(user_id>).*</user_id>}{$1Admin</user_id>}g; rm_elts qw( mod_time change_id source_change_id ), \$in, \$out ; ## Readd is created, deleted, and recovered, so there is no ## record of the deletion. Remove the <deleted/> rev from the ## input revml. $in =~ s{^\s*<rev id=['"][^"']+readd#[0-9]+\.1">.*?</rev>\r?\n}{}sm; ## So, in VSS, we are left with two consecutive versions. VCP ## properly gets a delta from one to the other. Clean up $in ## and $out so that they don't differ here $in =~ s{(<previous_id>[^<]+readd#1)\.1}{$1}; $in =~ s{^\s*<content[^>]*>[^<]*readd#3[^<]*</content>\r?\n}{}sm; $out =~ s{^\s*<delta[^>]*>[^<]*readd#3[^<]*</delta>\r?\n}{}sm; ok_or_diff $out, $in; }, sub { die }, ## Test a single file extraction from a vss repo. This file exists in ## change 1. sub { my $state = "${t}91vss2revml_state_B"; rm_dir_tree $state; ok( get_vcp_output( "$vssspec_0/main/add/f1", "--repo-id=vss:test_repository", { 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 vss repo. This file does not exist ## in change 1. sub { my $state = "${t}91vss2revml_state_C"; rm_dir_tree $state; ok( get_vcp_output( "$vssspec_0/main/add/f2", "--repo-id=vss:test_repository", { 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 ) ; }, ## ## vss->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}91vss2revml_state_D"; rm_dir_tree $state; my $infile = $t . "test-vss-in-0.revml" ; my $in = slurp $infile ; my $out = get_vcp_output( "$vssspec_0/main/a/deeply/...", "--repo-id=vss:test_repository", { 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 vss_info ), \$in, \$out ; ## We know this changes, let's ASSume it's ok rm_elts qw( branches ), \$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; ## We don't know what client name was used. $out =~ s{(user_id>.*)\@.*</user_id>}{$1</user_id>}g; ok_or_diff $out, $in; }, ## ## revml -> vss -> revml, incremental export ## sub { my $infile = $t . "test-vss-in-1.revml" ; my $state = "${t}91vss2revml_state_E"; rm_dir_tree $state; copy_dir_tree "${t}91vss2revml_state_A" => $state; # see if got the right # of files, changes # vss2revml will do detailed checking (the following code) my $in = slurp $infile ; my $out = get_vcp_output( "$vssspec_1/...", "--repo-id=vss:test_repository", "--continue", { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ], } ); $in =~ s{</rev_root>}{/foo</rev_root>} ; s_content qw( rep_desc time vss_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; ## We don't know what client name was used. $out =~ s{(user_id>.*)\@.*</user_id>}{$1</user_id>}g; ok_or_diff $out, $in; }, ## ## vss -> revml, incremental export in bootstrap mode ## sub { my $infile = $t . "test-vss-in-1-bootstrap.revml" ; my $state = "${t}91vss2revml_state_F"; rm_dir_tree $state; copy_dir_tree "${t}91vss2revml_state_A" => $state; my $in = slurp $infile ; my $out = get_vcp_output( "$vssspec_1/...", "--repo-id=vss:test_repository", "--continue", "--bootstrap=...", { revml_out_spec => [ "--db-dir=$state", "--repo-id=revml:test_repository" ] } ); $in =~ s{</rev_root>}{/foo</rev_root>} ; s_content qw( rep_desc time vss_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; ## We don't know what client name was used. $out =~ s{(user_id>.*)\@.*</user_id>}{$1</user_id>}g; ok_or_diff $out, $in; }, ## Check contents of t/vssroot_2 ## extract vss to revml ## build expected from revml ## ## vss->revml, re-rooting a dir tree ## sub { my $infile = $t . "test-vss-in-0.revml" ; my $in = slurp $infile; my $out = get_vcp_output( "$vssspec_2/...", "--repo-id=vss:test_repository", ); s_content qw( rep_desc time ), \$in, \$out ; rm_elts qw( vss_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; ## We don't know what client name was used. $out =~ s{(user_id>.*)\@.*</user_id>}{$1</user_id>}g; ok_or_diff $out, $in; }, ## We don't check the contents of t/vssroot_3 because that's hard and ## not incredibly necessary. ) ; plan tests => scalar @tests ; my $why_skip = vss_borken ; $why_skip ? skip $why_skip, 1 : $_->() for @tests ;
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#7 | 4417 | Barrie Slaymaker |
- Adapt to "estimated values" messages - Adapt to more accurate test suite |
||
#6 | 3921 | Barrie Slaymaker |
- VCP::Source::vss uses "0." and "1." prefixes on all rev_ids to properly handle VSS's idea of deleted files. - VCP::Dest::vss now offers --dont-recover-deleted-files to allow VSS-like sources to be trasnferred more completely |
||
#5 | 3800 | Barrie Slaymaker | - <branches> removed from all code | ||
#4 | 3691 | Barrie Slaymaker | - t/91vss2revml.t now passes | ||
#3 | 3510 | Barrie Slaymaker | - VSS --continue and branching support | ||
#2 | 3496 | Barrie Slaymaker | - VSS branching | ||
#1 | 3453 | Barrie Slaymaker |
- VCP::Source::vss now reads deleted files, etc. - gentrevml generates more VSS-like RevML - add t/91vss2revml.t (not complete) |