1*cdf0e10cSrcweir: # -*- perl -*- 2*cdf0e10cSrcweireval 'exec perl -wS $0 ${1+"$@"}' 3*cdf0e10cSrcweir if 0; 4*cdf0e10cSrcweir 5*cdf0e10cSrcweiruse File::Temp qw/ tempdir /; 6*cdf0e10cSrcweiruse File::Basename; 7*cdf0e10cSrcweiruse Cwd; 8*cdf0e10cSrcweir 9*cdf0e10cSrcweir$tempdir = tempdir(); 10*cdf0e10cSrcweir$dir = cwd(); 11*cdf0e10cSrcweir 12*cdf0e10cSrcweirsub unpack_rpm 13*cdf0e10cSrcweir{ 14*cdf0e10cSrcweir my ($package) = @_; 15*cdf0e10cSrcweir 16*cdf0e10cSrcweir system << "EOF" 17*cdf0e10cSrcweirrpm --query --queryformat "[trigger%{TRIGGERTYPE} script (through %{TRIGGERSCRIPTPROG}) -- %{TRIGGERNAME} %{TRIGGERVERSION}\n%{TRIGGERSCRIPTS}\n]" --package $package > triggers 18*cdf0e10cSrcweirrpm --query --queryformat "%{PREIN}\n" --package $package > prein 19*cdf0e10cSrcweirrpm --query --queryformat "%{POSTIN}\n" --package $package > postin 20*cdf0e10cSrcweirrpm --query --queryformat "%{PREUN}\n" --package $package > preun 21*cdf0e10cSrcweirrpm --query --queryformat "%{POSTUN}\n" --package $package > postun 22*cdf0e10cSrcweirrpm --query --queryformat "[%{FILEMODES:perms} %{FILEUSERNAME}/%{FILEGROUPNAME} .%{FILENAMES} -> %{FILELINKTOS}\n]" --package $package | sed 's/ -> \$//' | sort --key=3 -o filelist 23*cdf0e10cSrcweir 24*cdf0e10cSrcweirrpm2cpio $package | cpio --extract --make-directories 25*cdf0e10cSrcweir 26*cdf0e10cSrcweirrm --force `sed --silent 's|^lrw.r..r..-* root/root \\./\\(.*\\) -> .*|\\1 |p' filelist | tr -d "\\012"` 27*cdf0e10cSrcweirEOF 28*cdf0e10cSrcweir 29*cdf0e10cSrcweir# the last step removes all symbolic links from the extracted file tree as they 30*cdf0e10cSrcweir# are handled by diffing the filelist 31*cdf0e10cSrcweir} 32*cdf0e10cSrcweir 33*cdf0e10cSrcweirsub unpack_deb 34*cdf0e10cSrcweir{ 35*cdf0e10cSrcweir my ($package) = @_; 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir system << "EOF" 38*cdf0e10cSrcweirar x $package control.tar.gz data.tar.gz 39*cdf0e10cSrcweirtar --extract --ungzip --file=control.tar.gz 40*cdf0e10cSrcweirrm --force control control.tar.gz 41*cdf0e10cSrcweirtar --extract --ungzip --file=data.tar.gz 42*cdf0e10cSrcweirtar --list --verbose --ungzip --file=data.tar.gz | sed -e 's| root/root .* \./|- root/root ./|' -e 's|^d\\(.*\\)/\$|d\\1|' | sort --key=3 -o filelist 43*cdf0e10cSrcweirrm --force data.tar.gz 44*cdf0e10cSrcweir 45*cdf0e10cSrcweirrm --force `sed --silent 's|^lrw.r..r..- root/root \\./\\(.*\\) -> .*|\\1 |p' filelist | tr -d "\\012"` 46*cdf0e10cSrcweirEOF 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir# the last step removes all symbolic links from the extracted file tree as they 49*cdf0e10cSrcweir# are handled by diffing the filelist 50*cdf0e10cSrcweir} 51*cdf0e10cSrcweir 52*cdf0e10cSrcweirsub unpack_solpkg 53*cdf0e10cSrcweir{ 54*cdf0e10cSrcweir my ($package) = @_; 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir system << "EOF" 57*cdf0e10cSrcweirsed -e '1 d' -e 's/[0-9][0-9]* [0-9][0-9]* [0-9]\\{10\\}\$//' $package/pkgmap > filelist 58*cdf0e10cSrcweirgrep -v "^PSTAMP=" $package/pkginfo > pkginfo 59*cdf0e10cSrcweircp $package/install/* . 60*cdf0e10cSrcweirif [ -f $package/archive/none.bz2 ]; then 61*cdf0e10cSrcweir bzcat $package/archive/none.bz2 | cpio -i -d 62*cdf0e10cSrcweirelse 63*cdf0e10cSrcweir cp -pr $package/reloc/* . 64*cdf0e10cSrcweirfi 65*cdf0e10cSrcweirEOF 66*cdf0e10cSrcweir} 67*cdf0e10cSrcweir 68*cdf0e10cSrcweirsub unpack_tgz { 69*cdf0e10cSrcweir my ($package) = @_; 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir system << "EOF" 72*cdf0e10cSrcweircat $package | gunzip | tar -xf - 73*cdf0e10cSrcweirEOF 74*cdf0e10cSrcweir} 75*cdf0e10cSrcweir 76*cdf0e10cSrcweirmy $script = basename($0); 77*cdf0e10cSrcweir 78*cdf0e10cSrcweirdie "Usage: $script <package 1> <package 2>\n" unless $#ARGV == 1; 79*cdf0e10cSrcweir 80*cdf0e10cSrcweirmy @pkgroot = (); 81*cdf0e10cSrcweir 82*cdf0e10cSrcweirwhile ( $#ARGV >= 0 ) 83*cdf0e10cSrcweir{ 84*cdf0e10cSrcweir my $package = shift; 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir # make package paths absolute if necessary 87*cdf0e10cSrcweir $package = $dir . "/" . $package unless $package =~ /^\//; 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir my $basename = basename($package); 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir # when comparing identically named packages, append a "-2" 92*cdf0e10cSrcweir unless ( mkdir "$tempdir/$basename", 0777 ) { 93*cdf0e10cSrcweir $basename = $basename . "-2"; 94*cdf0e10cSrcweir mkdir "$tempdir/$basename", 0777; 95*cdf0e10cSrcweir } 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir # change working directory, unpack the package and change back .. 98*cdf0e10cSrcweir die "Unable to change to unpack directory $tempdir/$basename: $!\n" unless chdir "$tempdir/$basename"; 99*cdf0e10cSrcweir 100*cdf0e10cSrcweir if ( $package =~ /\.rpm$/ ) { unpack_rpm( $package ); } 101*cdf0e10cSrcweir elsif( $package =~ /\.deb$/ ) { unpack_deb( $package ); } 102*cdf0e10cSrcweir elsif( -f "$package/pkgmap" ) { unpack_solpkg( $package ); } 103*cdf0e10cSrcweir elsif( $package =~ /\.tgz$/ ) { unpack_tgz( $package ); } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir push @pkgroot, $basename; 106*cdf0e10cSrcweir chdir $dir; 107*cdf0e10cSrcweir} 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir# print "$0\n"; 110*cdf0e10cSrcweir 111*cdf0e10cSrcweirdie "Unable to change to working directory $tempdir: $!\n" unless chdir $tempdir; 112*cdf0e10cSrcweir 113*cdf0e10cSrcweirsystem "diff -ru @pkgroot[0] @pkgroot[1]"; 114*cdf0e10cSrcweirsystem "rm -rf *"; 115*cdf0e10cSrcweir 116*cdf0e10cSrcweirchdir $dir; 117*cdf0e10cSrcweirrmdir $tempdir; 118*cdf0e10cSrcweir#print STDERR "rm -rf $tempdir\n"; 119*cdf0e10cSrcweir 120