#!/usr/bin/perl -w # # $Id: //guest/jeffery_g_smith/perforce/utils/sttop4/main/convert.pl#6 $ # # StarTeam to Perforce Converter, top level wrapper (calls all other scripts) # # Copyright 1998 Perforce Software. All rights reserved. # Based on VSStoP4: # Written by James Strickland, April 1998 # Maintained by Robert Cowham, since 2000 # Updated to support StarTeam conversions: # Jeffery G. Smith, MedPlus, Inc. 2004-2005 require 5.0; use strict; use lib '.'; use convert; convert::openlog('start'); # Check that P4 Module is installed eval{require P4; import P4;}; if ($@) { print "\nP4Perl module (P4) is required for the converter to run. Install P4Perl from http://public.perforce.com/guest/tony_smith/perforce/API/Perl/index.html. Use the Current version (for Perl 5.6 or 5.8 as appropriate), and just double-click on Windows installer and run it (no real need to download and save). E.g.: http://public.perforce.com/guest/tony_smith/perforce/API/Perl/current/p4perl56-setup.exe or http://public.perforce.com/guest/tony_smith/perforce/API/Perl/current/p4perl58-setup.exe \n"; exit(1); } # Check for parameter to avoid asking questions my $confirm = shift(@ARGV); $confirm = "" if (!defined($confirm)); # check that p4 is operational, warn if version does not support -f print "Running p4 info.\n"; my $p4info=convert::p4run(" info"); # note: p4 info prints errors to stderr, so we deduce an error from the lack # of output saying anything about the server if( $p4info !~ m@server@si) { print "\np4 info returned an error which must be fixed before proceeding. Check the installation section of the Perforce manual. Most likely you haven't started a Perforce server or you haven't set P4PORT to point to the server. You can obtain Perforce documentation from http://www.perforce.com\n\n"; print "Here's what p4 info returned:\n$p4info" if($p4info); exit(1); } if( $p4info =~ m@\nServer version:\s+[^\s]+/([0-9]+) @s) { my $change_number = $1; my $magic_number = 4761; # first release of 97.3 if( $change_number < $magic_number ) { print "Detected Perforce server version with change number $change_number. The StarTeam converter requires a 97.3 or later server. You can download Perforce from http://www.perforce.com/\n"; exit(2); } } else { # Server version line not recognized print "The Perforce server version was not detected - either you have a really old version (you can get the latest version from http://www.perforce.com) or the format of the output of p4 info has changed and no one updated this script to match (in which case, we'd appreciate it if you let us know - send email to support\@perforce.com). The StarTeam converter requires a 97.3 or later server. You can download Perforce from http://www.perforce.com/ "; if ($confirm !~ /\-[yY]/) { print "Do you wish to proceed with your existing server? (y/n) "; exit(3) if(<STDIN> !~ /y/); } } # check no opened files... print "Checking for no opened files.\n"; if(convert::p4run(" opened")) { print "************************** ERROR You have a variety of opened files - conversion cannot proceed. Please revert them and try again: "; print convert::p4run(" opened"); exit(4); } # check that the depot is empty print "Checking that the depot is empty.\n"; if(convert::p4run(" changes -m 1") || convert::p4run(" labels")) { my $port = $p4info; $port =~ s@.*\nServer address:\s*(\S+).*@$1@s; print "The Perforce depot stored by the server at '$port' is not empty! Running this import process will import changes with earlier timestamps than existing changes in the depot. Be careful!! "; if ($confirm !~ /-[yY]/) { print "Are you sure you want to proceed? "; exit(4) if(<STDIN> !~ /y/); } } # Check if we are being asked to ignore changes - dangerous!! if($convert::start_time != 0) { print "************* WARNING You have specified a start_time before which to ignore changelists. This is potentially dangerous because if you have not correctly specified the time stamp, you will get duplicate changelists! "; print "Are you sure you want to proceed? "; exit(4) if(<STDIN> !~ /y/); } # Check that the user has superuser or admin protections if(!convert::p4run("protect -o")) { print "You do not have superuser permissions for this Perforce repository. The converter updates the date and time on imported changelists which requires superuser or administrator permissions. "; print "Are you sure you want to proceed? "; exit(4) if(<STDIN> !~ /y/); } # Timestamp print "Conversion started " . scalar(localtime()) . "\n"; # set up user name and client $ENV{P4PORT} = $convert::p4port; $ENV{P4USER} = $convert::p4user; $ENV{P4CLIENT} = $convert::p4client; print "\nUsing port/client/user '$ENV{P4PORT}/$ENV{P4CLIENT}/$ENV{P4USER}'.\n\n"; my $client_view = "//$convert::depot/$convert::depot_root/... //$ENV{P4CLIENT}/$convert::depot_root/...\n"; print "...creating/updating client $ENV{P4CLIENT} with:\n"; print " root $convert::client_root.\n"; print " view $client_view\n"; my $form = convert::p4run(" client -o $ENV{P4CLIENT}"); # Update the root and view $form =~ s@(\nRoot:\s*)\s+\S[^\n]*\n@$1 $convert::client_root@s; $form =~ s@(\nView:\s*)\n\s+.*\n$@$1\n\t$client_view@s; convert::p4run(" client -i", $form); if ($convert::bypass_metadata) { # If a bypass is requested, verify that the files are there. $convert::bypass_metadata = -f "$convert::metadata_dir/files" && -f "$convert::metadata_dir/labels_summary" && -f "$convert::metadata_dir/changes"; } if ($convert::bypass_metadata) { print "BYPASSING the re-creation of the metadata/ files.\n"; } else { print "Extracting metadata... " . scalar(localtime()) . "\n"; print "...from all StarTeam projects at and below project: $convert::root\n"; runcmd("perl readhist.pl"); # Sort the metadata print "Sorting the metadata. " . scalar(localtime()) . "\n"; runcmd("perl sortmeta.pl"); # Improve the metadata - group changes, etc. print "Improving the metadata. " . scalar(localtime()) . "\n"; runcmd("perl improve.pl"); } # And now, what you've all been waiting for.. print "Creating the Perforce depot. " . scalar(localtime()) . "\n"; runcmd("perl mkdepot.pl"); # Some post-processing print "Sorting the mapping file. " . scalar(localtime()) . "\n"; runcmd("perl sortmap.pl"); # Verification step if ($convert::perform_verify) { print "\nVerifying the result. " . scalar(localtime()) . "\n"; runcmd("perl verify.pl"); } # Timestamp print "Conversion finished " . scalar(localtime()) . "\n"; sub runcmd { my $cmd = shift; convert::closelog(); my $result = system($cmd); if ($result) { die "***** Failed to run command: $cmd\n"; } convert::openlog('reopen'); } #eof
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#6 | 4818 | Jeffery G. Smith |
Finished extracting metadata. Improved logging subsystem. |
||
#5 | 4795 | Jeffery G. Smith | Worked on first phase of metadata collection. | ||
#4 | 4793 | Jeffery G. Smith | Updated sources to more closely match VSStoP4 baseline. | ||
#3 | 4769 | Jeffery G. Smith | Final population from seed tools. | ||
#2 | 4701 | Jeffery G. Smith | Initial converion to StarTeam. | ||
#1 | 4700 | Jeffery G. Smith | Initialize branch from PVCS converter. | ||
//guest/perforce_software/utils/pvcstop4/main/convert.pl | |||||
#1 | 4664 | Robert Cowham | Branch into permanent location. | ||
//guest/robert_cowham/perforce/utils/pvcstop4/main/convert.pl | |||||
#1 | 4647 | Robert Cowham |
Rename //guest/robert_cowham/perforce/utils/pvcstop4/... To //guest/robert_cowham/perforce/utils/pvcstop4/main/... |
||
//guest/robert_cowham/perforce/utils/pvcstop4/convert.pl | |||||
#4 | 3721 | Robert Cowham |
Various changes (tested at a client): - Use PCLI to read file location info (e.g. if moved) - Use P4Perl for speed - Removed DB_File as it has a bug - Do labels differently for vastly improved speed |
||
#3 | 3638 | Robert Cowham |
Renamed some files with windows extensions. Imported changes from Vsstop4 scripts: - Use P4Perl if installed - Use DB_File if installed - Rework labelling algorithm for speed Net result should be much improved performance. Next step is to use pcli. |
||
#2 | 2290 | Robert Cowham |
Merged in some changes from the VSStoP4 scripts: - allow specification of depot and path within depot - cope with repository already existing - cope with multiple concurrent updates to server - slightly improved error detection Note this hasn't been tested with a branch configuration. |
||
#1 | 2289 | Robert Cowham | Initial version from Perforce web page |