#!/usr/bin/perl # $Id: html-install.in,v 1.4 2002/11/17 22:45:16 cjwatson Exp $ # Takes 1 argument - directory tree to install into # Tree _must_ be synch'd with one used by db2html to generate file use POSIX; $config_path = '/etc/debbugs'; require("$config_path/config"); $ENV{'PATH'} = $lib_path.':'.$ENV{'PATH'}; $dirtree= shift(@ARGV); defined($dirtree) or die 'usage'; chdir $dirtree or die $!; $filenamere= '[0-9a-z]{2}/[0-9a-z][-+_:,.0-9a-zA-Z]*'; opendir(D,".") or die " opendir: $!"; while ($dir=readdir(D)) { next if $dir =~ m/^\.\.?$/; if (-f $dir) { $remove{$dir}= 1; } else { opendir(E,"$dir") or die " opendir $dir: $!"; while ($_=readdir(E)) { next if $_ =~ m/^\.\.?$/; $remove{"$dir/$_"}= 1; } closedir(E) or die " closedir $dir: $!"; $rmdir{$dir}= 1; } } closedir(D) or die " closedir: $!"; while(<>) { chomp; if (m/^end$/) { print "end, removing\n"; for $k (keys %remove) { unlink($k) || $!==&ENOENT or die "$k: $!"; } for $k (keys %rmdir) { rmdir($k) || $!==&ENOTEMPTY || $!==EEXIST or die "$k: $!"; } exit 0; } elsif (s/^progress //) { y/-+:._!#=,0-9a-zA-Z //cd; print " progress $_\n"; } elsif (m/^preserve ($filenamere)$/o) { delete $remove{$1}; delete $remove{"$1.ref"}; print " preserve $1\n"; } elsif (m/^(file|diff) (\d+) (ref|def|non) ($filenamere)$/o) { $filediff= $1; $linestodo= $2; $ii= $3; $file= $4; print " $filediff $ii $file\n"; delete $remove{$file}; delete $remove{"$file.ref"} if $ii eq 'ref'; $file =~ m,^(..)/, or die $file; mkdir($1,0777) || $!==EEXIST or die $!; $tranfile= $file; $tranfile.= '.ref' if $ii eq 'ref'; open(DT,"> recv.tmp") or die $!; if ($filediff eq 'diff') { print DT "r $tranfile\n" or die $!; } $indata= 0; while ($linestodo--) { $z=; if ($filediff eq 'diff') { if ($indata) { $indata=0 if $incmd && m/^\.$/; } elsif ($z =~ m/^[0-9,]+[ac]/) { $indata= 1; } elsif ($z !~ m/^[0-9,]+[ds]/) { die "SECURITY $file >$z<"; } } print DT $z or die $!; } if ($filediff eq 'diff') { print DT "w new.tmp\nq\n" or die $!; } close(DT) or die $!; ($z=) eq "that$filediff $file\n" or die die "not confirmed >$z<"; if ($filediff eq 'diff') { $q= `ed -s &1`; length($q) || $? and die "ed $q $?"; rename("new.tmp","$tranfile") or die "$tranfile $!"; unlink("recv.tmp") or die $!; } else { rename("recv.tmp","$tranfile") or die "$tranfile $!"; } if ($ii eq 'ref') { open(I,"$tranfile") or die $!; open(O,"> ref.tmp") or die $!; while () { if (m/^\<\!\-\-ii (\d+)\-\-\>$/) { defined($iival{$1}) or die "$tranfile $1"; print O $iival{$1} or die $!; } else { print O or die $!; } } close(I) or die $!; close(O) or die $!; rename("ref.tmp","$file") or die $!; } elsif ($ii eq 'def') { open(I,"$file") or die $!; undef $cdef; $ctext= ''; while () { if (s/^\<\!\-\-iid (\d+)\-\-\>//) { defined($cdef) and die $file; $cdef= $1; $ctext= $_; } elsif (s/\<\!\-\-\/iid\-\-\>\n$//) { defined($cdef) or die $file; $iival{$cdef}= $ctext.$_."\n"; $ctext=''; undef $cdef; } else { $ctext.= $_ if defined($cdef); } } } } elsif (m/^noremoves$/) { print "noremoves\n"; exit 0; } else { die " huh ? $_"; } } die "eof $!";