xref: /aoo42x/main/sysui/desktop/util/pkgdiff.pl (revision cdf0e10c)
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