Windows-Server-2003/tools/sdrestore.cmd

118 lines
3.6 KiB
Batchfile

@echo off
for %%i in (%0.cmd) do perl -w -x %%~dp$PATH:i%0.cmd %*
goto :eof
#!perl
# line 6
#
# FileName: sdrestore.cmd
#
# Usage = sdrestore [-v] <backupdir>
#
# This script does the converse of sdbackup by copying the saved files
# from <backupdir> into the client's SD enlistments. All the files in
# <backupdir> will be checked out on the local machine and the backups
# will be restored.
#
# Currently this script bails out if any of the files in <backupdir> are
# either already checked out or a different version than was backed up.
# Clever diffing and merging could be done here instead.
#
#
use Getopt::Std;
use File::Path;
use File::Spec;
use File::Copy;
#
# initialize globals
#
$opt_v = 0;
%src_revision_list = ();
%dest_revision_list = ();
%src_filelist = ();
%dest_filelist = ();
$Usage = "
USAGE: $0 [-v] backupdir
-v Verbose output
backupdir Supplies directory where files were backed up to with sdbackup
";
getopts('v') or die $Usage;
#
# Check for valid backup directory and log file
#
$backupdir = $ARGV[0] or die $Usage;
-d $backupdir or die "Backup directory $backupdir does not exist\n";
-e "$backupdir\\backup.log" or die "backup logfile $backupdir\\backup.log does not exist\n";
open(LOGFILE, "$backupdir\\backup.log") or die "couldn't open $backupdir\\backuplog: $!\n";
@backupfiles = <LOGFILE>;
foreach $file (@backupfiles) {
$opt_v and print $file;
chomp $file;
($depotfilename, $revision, $srcfile) = split(/\s/,$file);
$depotfilename = lc($depotfilename);
$revision =~ tr/#//d; # get rid of #
$src_revision_list{$depotfilename} = $revision;
$src_filelist{$depotfilename} = File::Spec->catfile($backupdir,$srcfile);
}
#
# now we have a list of depot names. Get the client name and the current
# version by calling sdx have
#
$filelist = join(' ',keys(%src_filelist));
foreach $line (`sdx have $filelist`) {
#
# throw away blank lines, depot specifiers, "not found" lines,
# and lines that start with "-"
#
$line =~ /^[\t\s]*$|^-------|file\(s\) not on client|^-/ and next;
chomp $line;
#
# parse resulting output, it looks like:
# <depotfilename>#<version> - <clientfilename>
$opt_v and print ("line = $line\n");
($depotfilename, $revision, $clientfilename) = split(/#| - /,$line);
$depotfilename = lc($depotfilename);
$opt_v and print ("\tfilename: $depotfilename\n\trevision: $revision\n\tclientfilename: $clientfilename\n\n");
$dest_revision_list{$depotfilename} = $revision;
$dest_filelist{$depotfilename} = $clientfilename;
#
# Now we have a list of the local filenames and versions.
# If a file has the same version in both places and is read-only,
# put it on the checkout list. Otherwise, it needs to be merged
# and is put on the merge list.
#
if (($revision == $src_revision_list{$depotfilename}) &&
(!(-w $clientfilename)))
{
$opt_v and print("Putting $depotfilename on the checkout list\n");
push @checkoutlist, $depotfilename;
} else {
$opt_v and print "Putting $depotfilename on the merge list\n";
$opt_v and print "\tsrcversion $src_revision_list{$depotfilename} destversion $revision\n";
push @mergelist, $depotfilename;
}
}
$opt_v and print "to checkout:\n\t" . join("\n\t", @checkoutlist);
$opt_v and print "\nto merge:\n\t" . join("\n\t", @mergelist) . "\n";
if (@mergelist) {
print "The following files are either checked out or different versions:\n";
foreach $file (@mergelist) {
print "$src_filelist{$file}#$src_revision_list{$file} -> $dest_filelist{$file}#$dest_revision_list{$file}\n";
}
print "sdrestore cannot continue.\n";
exit;
}