1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#!/usr/bin/perl
# Diff two Packages files, comparing version numbers for each package found in the second file.
# Usage example: ./diff-packages [-m] <debian-sid-main-Packages> <pgapt-sid-pgdg-testing-main-Packages>
# -m don't show packages missing in 2nd file
# -t force colored output
# -u show unchanged packages
use strict;
use warnings;
use Dpkg::Version;
Getopt::Long::config('bundling');
my $show_missing = 1;
my $to_term = (-t 1);
GetOptions (
'-m' => sub { $show_missing = 0 },
'-t' => \$to_term,
'-u' => \$unchanged,
) or die;
# enable ansi codes if outputting to a terminal
my ($b, $n) = $to_term ? ("\e[1m", "\e[0m") : ("", "");
die "Syntax: $0 [-m] <packages1> <packages2>" unless (@ARGV == 2);
my ($packages1, $packages2) = @ARGV;
my (%pkg1, %pkg2, %src1, %src2);
$/ = ''; # slurp paragraphs
open S2, $packages2 or die "$packages2: $!";
while (<S2>) {
my ($pkg) = /^Package: (.+)/m or die "$packages2: paragraph without Package: $_";
my ($ver) = /^Version: (.+)/m or die "$packages2: paragraph without Version: $_";
my ($src) = /^Source: (.+)/m;
$src = $pkg unless $src;
my $v = Dpkg::Version->new($ver);
if (not exists $pkg2{$pkg} or $v > $pkg2{$pkg}) {
$pkg2{$pkg} = $v;
$src2{$pkg} = $src;
}
}
close S2;
open S1, $packages1 or die "$packages1: $!";
while (<S1>) {
my ($pkg) = /^Package: (.+)/m or die "$packages1: paragraph without Package: $_";
my ($ver) = /^Version: (.+)/m or die "$packages1: paragraph without Version: $_";
my ($src) = /^Source: (.+)/m;
$src = $pkg unless $src;
my $v = Dpkg::Version->new($ver);
if (not exists $pkg1{$pkg} or $v > $pkg1{$pkg}) {
$pkg1{$pkg} = $v;
$src1{$pkg} = $src;
}
}
close S1;
foreach my $pkg (sort keys %pkg1) {
my $ver1 = my $ver1mangled = $pkg1{$pkg};
$ver1mangled =~ s/.pgdg(?:[\d.]+)?\+\d$//; # remove .pgdg80+1
if (not exists $pkg2{$pkg}) {
print "$src1{$pkg} $pkg $b$ver1$n <missing>\n" if ($show_missing);
next;
}
my $ver2 = my $ver2mangled = $pkg2{$pkg};
$ver2mangled =~ s/.pgdg(?:[\d.]+)?\+\d$//; # remove .pgdg80+1
if (($ver1 eq $ver2) or ($ver1 eq $ver2mangled) or ($ver1mangled eq $ver2)) {
print "OK: $pkg $ver1 $ver2\n" if ($unchanged);
delete $pkg2{$pkg};
next;
}
if ($ver1 > $ver2) {
print "$src1{$pkg} $pkg $b$ver1$n $ver2\n";
} else {
print "$src1{$pkg} $pkg $ver1 $b$ver2$n\n";
}
delete $pkg2{$pkg};
}
foreach my $pkg (sort keys %pkg2) {
print "$src2{$pkg} $pkg <missing> $b$pkg2{$pkg}$n\n";
}
|