#!/usr/bin/perl # Diff two Sources files, comparing version numbers for each package found in the second file. # Usage example: ./diff-dists [-OPTIONS] # -b remove +bN binnmu version suffix before comparing # -p remove pgdg version suffix before comparing # -m don't show packages missing in 2nd file # -t force colored output # -u show unchanged packages use strict; use warnings; use Dpkg::Version; use Getopt::Long; Getopt::Long::config('bundling'); my $mangle_binnmu_version = 0; my $show_missing = 1; my $mangle_pgdg_version = 0; my $print_promotes = 0; my $to_term = (-t 1); my $unchanged = 0; GetOptions ( '-b' => \$mangle_binnmu_version, '-m' => sub { $show_missing = 0 }, '-p' => \$mangle_pgdg_version, '-P' => \$print_promotes, '-t' => \$to_term, '-u' => \$unchanged, ) or die; # enable ansi codes if outputting to a terminal my ($b, $r, $g, $n) = $to_term ? ("\e[1m", "\e[31m", "\e[32m", "\e[0m") : ("", "", "", ""); die "Syntax: $0 [-m] " unless (@ARGV == 2); my ($source1, $source2) = @ARGV; my (%pkg1, %pkg2, %src); $/ = ''; # slurp paragraphs open S2, $source2 or die "$source2: $!"; while () { my ($pkg) = /^Package: (.+)/m or die "$source2: paragraph without Package: $_"; my ($ver) = /^Version: (.+)/m or die "$source2: paragraph without Version: $_"; my ($src) = /^Source: (\S+)/m; my $v = Dpkg::Version->new($ver); $pkg2{$pkg} = $v if (not exists $pkg2{$pkg} or $v > $pkg2{$pkg}); $src{$pkg} = $src if ($src); } close S2; open S1, $source1 or die "$source1: $!"; while () { my ($pkg) = /^Package: (.+)/m or die "$source1: paragraph without Package: $_"; my ($ver) = /^Version: (.+)/m or die "$source1: paragraph without Version: $_"; my ($src) = /^Source: (\S+)/m; my $v = Dpkg::Version->new($ver); $pkg1{$pkg} = $v if (not exists $pkg1{$pkg} or $v > $pkg1{$pkg}); $src{$pkg} = $src if ($src); } close S1; my %promotes; foreach my $pkg (sort keys %pkg1) { my $s = ''; $s = " ($src{$pkg})" if ($src{$pkg} and $src{$pkg} ne $pkg); my $ver1 = my $ver1mangled = $pkg1{$pkg}; $ver1mangled =~ s/\+b\d+$// if ($mangle_binnmu_version); # remove +b1 $ver1mangled =~ s/.pgdg(?:[\d.]+)?\+\d$// if ($mangle_pgdg_version); # remove .pgdg80+1 if (not exists $pkg2{$pkg}) { if ($show_missing and $pkg ne 'pgdg-buildenv') { print "$g$pkg$s$n $b$ver1$n \n"; $promotes{$s ? $src{$pkg} : $pkg} = 1; } next; } my $ver2 = my $ver2mangled = $pkg2{$pkg}; $ver2mangled =~ s/\+b\d+$// if ($mangle_binnmu_version); # remove +b1 $ver2mangled =~ s/.pgdg(?:[\d.]+)?\+\d$// if ($mangle_pgdg_version); # remove .pgdg80+1 if ($ver1mangled eq $ver2mangled) { print "OK: $pkg$s $ver1 $ver2\n" if ($unchanged); delete $pkg2{$pkg}; next; } if ($ver1 > $ver2) { print "$g$pkg$s$n $b$ver1$n $ver2\n"; $promotes{$s ? $src{$pkg} : $pkg} = 1;; } else { print "$r$pkg$s$n $ver1 $b$ver2$n\n"; } delete $pkg2{$pkg}; } foreach my $pkg (sort keys %pkg2) { my $s = ''; $s = " ($src{$pkg})" if ($src{$pkg} and $src{$pkg} ne $pkg); print "$r$pkg$s$n $b$pkg2{$pkg}$n\n"; } if ($print_promotes and %promotes) { for my $pkg (sort keys %promotes) { print "promote $pkg\n"; } }