#!/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/hari_krishna_dara/perforce/utils/vsstop4/main/convert.pl#1 $ # require 5.0; 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 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 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 | |
---|---|---|---|---|---|
#1 | 5093 | Hari Krishna Dara |
Populating perforce branch. I will be adding p4admin files to it. |
||
//guest/perforce_software/utils/vsstop4/main/convert.pl | |||||
#10 | 4024 | Robert Cowham | Make slightly more robust - ignore VSS prompts for input by using the -I- flag to commands. | ||
#9 | 4000 | Robert Cowham |
Remove changes for non-P4Perl version. Improved Web page with download links. |
||
#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 |