summaryrefslogtreecommitdiff
path: root/repo/bin/diff-packages
blob: 44769e18a8ec5a32957f1ee781abc0da63025d8d (plain)
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";
}