aboutsummaryrefslogtreecommitdiff
path: root/findpkgconflicts.pl
blob: 1446f1b2c0831c28b21957d881214273b38d36a2 (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
#!/usr/bin/perl -w

($SELF = $0) =~ s,.*/,,;

sub usage() {
	print <<EOF;
Usage: $SELF [-s]

Finds conflicting files in Slackware packages.

Options:
  -s  Ignore 3rd-party packages (core Slackware only).
  -a  Include aaa_* packages and openssl-solibs (normally ignored).
EOF
}

$slackware_only = 0;
$ignore_aaa = 1;

for(@ARGV) {
	last unless defined;
	/^-s$/ && do { $slackware_only++; next; };
	/^-a$/ && do { $ignore_aaa = 0; next; };
	/^(?:-h|--help)$/ && do { usage(); };
	die "Unknown argument '$_', try --help.\n";
}

$pkgdir = $ENV{PACKAGE_DIR} || "/var/log/packages";

chdir $pkgdir or die "$!\n";

$conflicts = $files = $packages = 0;

for $pkg (<*>) {
	next if ($ignore_aaa && $pkg =~ /^(?:aaa_|openssl-solibs-)/);
	next if ($slackware_only && $pkg !~ /(?:\d|slack[\d.]+)$/);
	my $fh;
	if(!open $fh, '<', $pkg) {
		warn "can't read $pkg: $!\n";
		next;
	}
	$packages++;
	while(<$fh>) {
		last if /^FILE LIST:/;
	}
	while(<$fh>) {
		chomp;
		next if m{/$};
		next if m{^install/};
		push @{$files{$_}}, $pkg;
		$files++;
	}
	close $fh;
}

for(sort keys %files) {
	my @pkgs = @{$files{$_}};
	next unless @pkgs > 1;
	$conflicts++;
	print "$_:\n\t" . join("\n\t", @pkgs) . "\n";
}

print "\n== Found $conflicts conflicts in $files files (in $packages packages)\n";