#!/usr/bin/perl -w # # Visual SourceSafe to Perforce converter, top level wrapper (calls all other scripts) # # Copyright 1998 Perforce Software. All rights reserved. # Written by James Strickland, April 1998 # Maintained by Robert Cowham, since 2000 # # $Id: //guest/perforce_software/utils/vsstop4/dev/convert.pl#2 $ # require 5.6; use strict; use lib '.'; use convert; $| = 1; # don't buffer output # 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)); unlink("logfile.log") if ($convert::debug_level>0); # nuke the logfile, if any # 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 VSS 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 VSS 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 that the user has permission to run p4 changes. open(ERROR, "p4 changes -m 1 2>&1 |"); if (<ERROR> =~ m@"permission for this operation"@si) { print "You do not have the proper permissions to run this converter. Please check P4USER to make sure it is set properly. If P4USER is correct, see your Perforce administrator to get the necessary permissions.\n"; close(ERROR); exit(4); } # Timestamp print "Conversion started " . scalar(localtime()) . "\n"; # check no opened files... print "Checking for no opened files.\n"; if(convert::p4run(" opened") !~ /File\(s\) not opened on this client/) { 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") =~ m@"permission for this operation"@si) { 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/); } # 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 VSS projects at and below $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; my $result = system($cmd); if ($result) { die "***** Failed to run command: $cmd\n"; } } #eof
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#2 | 3928 | Robert Cowham | Removing unused code. | ||
#1 | 3927 | Robert Cowham | Dev branch | ||
//guest/perforce_software/utils/vsstop4/main/convert.pl | |||||
#8 | 3926 | Robert Cowham | P4Perl is now required for the scripts to run. | ||
#7 | 3925 | Robert Cowham | Problems as per Michael Shields when not using P4Perl. | ||
#6 | 3639 | Robert Cowham |
Changed filetype and inserted ID string. Fixed typo. |
||
#5 | 3609 | Robert Cowham |
Integrate in changes for: - Use of DB_File for large hashes (if available) - Reworking of label algorithm - MUCH faster - Use of P4Perl (if available) - much faster - Use of VSS OLE Automation (if available) - sometimes faster See README.txt and Performance section for details. |
||
#4 | 3558 | Robert Cowham |
Fixed bug with French date formats. Autoupdate client root and view based on config.ini entries. |
||
#3 | 3556 | Robert Cowham |
Added extra check on time stamp formats. Tidied up readme - will only run on Windows now. Updated comments in config.ini |
||
#2 | 2165 | Robert Cowham | Merged in changes from Guest branch | ||
#1 | 2160 | Robert Cowham | Main version from .zip file from http://www.perforce.com/perforce/loadsupp.html#conv page |