@rem = 'Perl from *.bat boilerplate @echo off setlocal set file=%0.bat set args=%1 %2 %3 %4 %5 %6 %7 %8 %9 :loop shift set args=%args% %9 if not "%9"=="" goto loop perl -S %file% %args% goto endofperl '; #=============================================================================== # This script copies a SLM source file from one location to another while # preserving history. $usage =< The smove command moves a SLM source file to another location while preserving history and revision information. Note that it does not delfile the original source file, so it's actually closer to a copy command -- you'll have to perform the delfile yourself after you're satisfied that the move went successfully. As an exmaple, "smove foo.xxx ../gargle/mutter" will create a new file ../gargle/mutter/foo.xxx with the same history information as the original foo.xxx. The destination may be either a new file name, or a directory. If the destination is a directory, the old file name will be used. END ; die $usage if ($#ARGV != 1); $src = $ARGV[0]; $dest = $ARGV[1]; # Ensure that the destination is a relative path. if (($dest =~ /^\\/) || ($dest =~ /^\//)) { die "smove: Destination must be a relative pathname.\n"; } # Ensure that the source file exists. die "smove: Source file \"$src\" not found.\n" if (! -f $src); # If the destination is a directory, form the full destination path. if (-d $dest) { ($basename = $src) =~ s:.*/::; ($dest = "$dest/$basename") =~ s://:/:g; } # Ensure that the destination doesn't already exist. if (-e $dest) { die "smove: \"$dest\" already exists.\n"; } print "\nMoving $src to $dest.\n\n"; # Open a stream from the SLM log command to get information for each version # of the source file we're copying from. This information will contain the # timestamp, originating machine name, SLM source name, version number, and # revision comment. open (LOG, "log -999 -z $src |") || die "Couldn't run \"log -999 -z $src\".\n"; @log = (); # Add each revision record to a list of strings for later processing. while () { chop; $time = substr ($_, 0, 14); ($machine = substr ($_, 16, 8)) =~ s/ .*//; ($remainder = substr ($_, 43)) =~ s/ +/ /g; $remainder =~ s/ *$//; ($original, $version, $comment) = split (/ /, $remainder, 3); $original =~ s:\\:/:g; $version = substr ($version, 1); push (@log, "$original\n$version\n$time\n$machine\n$comment"); } $sep = "--------------------------------------------------------------------\n"; # Take the first version and use it to 'addfile' the new destination file. ($original, $version, $time, $machine, $comment) = split(/\n/, shift(@log)); die "smove: \"$src\" doesn't seem to be in the project.\n" if ($version eq ""); &printinfo ($original, $version, $time, $machine, $comment); &slmcmd ("catsrc $src\@v$version >$dest"); &slmcmd ("addfile -c \"$comment (from $original $time $machine)\" $dest"); # For each remaining revision, check out the file, update the contents, and # check it back in with the revision information. foreach (@log) { ($original, $version, $time, $machine, $comment) = split(/\n/); &printinfo ($original, $version, $time, $machine, $comment); &slmcmd ("out $dest"); &slmcmd ("catsrc $src\@v$version >$dest"); &slmcmd ("in -c \"$comment (from $original $time $machine)\" $dest"); } close (LOG); # All done. ############################################################################## # This subroutine prints and executes a SLM command. If the command fails # (probably because of a network error or a project lock), it will wait a bit # and then retry until successful. ############################################################################## sub slmcmd { $cmd = $_[0]; print "$cmd\n"; while (0 != system ($cmd)) { print "SLM command failed; will retry.\n"; sleep (5); } } ############################################################################## sub printinfo { print "------------------------------------------------------------------------------\n"; print "Original \"$_[0]\"\n"; print "Version \"$_[1]\"\n"; print "Time \"$_[2]\"\n"; print "Machine \"$_[3]\"\n"; print "Comment \"$_[4]\"\n\n"; } __END__ #=============================================================================== :endofperl endlocal