[tex-live] howto partial svn update?

Staszek Wawrykiewicz staw at gust.org.pl
Wed Jan 24 00:17:22 CET 2007


On Wed, 24 Jan 2007, Norbert Preining wrote:

> On Die, 23 Jan 2007, Staszek Wawrykiewicz wrote:
> > I do not know so many svn tricks, but I always use Reinhard's script
> > (made in Bachotek :-) which makes svn update much faster. I hope that 
> > Rainhard is not against if I send you it (he already gave it to the 
> > community some months ago).
> 
> PLease, send it to the list ...

Attached (public domain). You only need to set TEXLIVE_SVN_ROOT
 
-- 
Staszek Wawrykiewicz
StaW at gust.org.pl

-------------- next part --------------
#!/usr/bin/perl -w

# Copyright 2006 Reinhard Kotucha <reinhard.kotucha at web.de>
# Public domain

# Usage: Set the environmment variable TEXLIVE_SVN_ROOT 
# to the directory where the directories Build and Master reside.


# svncleanup is a script which can be used to run svn cleanup or similar
# commands on the files and dirs which had been updated most recently.
#
$SVNCLEANUP="$ENV{HOME}/svncleanup";

if (defined $ENV{'TEXLIVE_SVN_ROOT'}) {
    die "Directory $ENV{'TEXLIVE_SVN_ROOT'} not found\n" .
	"Check TEXLIVE_SVN_ROOT environment variable.\n" 
	unless (-d $ENV{'TEXLIVE_SVN_ROOT'});
} else {
    die "Environment variable TEXLIVE_SVN_ROOT not set.\n";
}

sub initialize_cleanup {
    open CLEANUP, "> $SVNCLEANUP" or die "Can't open $SVNCLEANUP";
    print CLEANUP "\#!/bin/sh\n\n" .
	"function CMD () { svn cleanup \"\$1\"; }\n\n";
    close CLEANUP;
}

sub append_cleanup {
    my $file=shift;
    open CLEANUP, ">> $SVNCLEANUP" or die "cant open $SVNCLEANUP";
    print CLEANUP "CMD $file\n";
    close CLEANUP;
}

initialize_cleanup;

# if the number of slashes in a particular (relative) path is smaller
# than $dirlevel we update the files separately instead of the whole
# subtree.
#
$dirlevel=3;

open LOG, "svn log -vq -rBASE:HEAD $ENV{'TEXLIVE_SVN_ROOT'} |";
#open LOG, "svn log -vq -r1500:HEAD $ENV{'TEXLIVE_SVN_ROOT'} |";
while (<LOG>) {
    chop;
    if (/\s{3}[AMDUCG]\s\/trunk\/([^\s]+).*/) {
	$foundfile=$1;
	($slashes=$foundfile)=~s/[^\/]//g;
	
	if (length ("$slashes") < $dirlevel) {
	    $files{$foundfile}=0;
	} else {
	    ($founddir=$foundfile)=~s/(.*)\/.*/$1/;
	    $dirs{$founddir}=0;
	}
    }
}
close LOG;

foreach $dir (keys %dirs) {
    push @alldirs, $dir;
}

# sort directories in order to get:
#  a/b/c
#  a/b/c/x
#  a/b/c/y
#
# We will skip directories x and y.  This increases performance significantly.

@sorted_dirs=sort @alldirs;

$lastdir="--nodir--";

foreach $dir (@sorted_dirs) {
# skip subdirs which had been processed alreay
    next if ($dir=~/^$lastdir/);
    $lastdir=$dir;
    print "d: svn update $ENV{'TEXLIVE_SVN_ROOT'}/$dir\n";
    append_cleanup "$ENV{'TEXLIVE_SVN_ROOT'}/$dir";
    system "svn update $ENV{'TEXLIVE_SVN_ROOT'}/$dir";
}

foreach $file (keys %files) {
    print "f: svn update $ENV{'TEXLIVE_SVN_ROOT'}/$file\n";
    append_cleanup "$ENV{'TEXLIVE_SVN_ROOT'}/$file";
    system "svn update $ENV{'TEXLIVE_SVN_ROOT'}/$file";
}

system "svn update -N $ENV{'TEXLIVE_SVN_ROOT'}";


More information about the tex-live mailing list