summaryrefslogtreecommitdiff
path: root/bin/apt-perl
blob: 3046aa695bb3fae29bdb2f3a1ea4d35f8ba27593 (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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env perl
use strict;
use warnings;
use AptPkg::Cache;
use Switch;

my $cache = AptPkg::Cache->new;
my $query = shift or die("No action given");
my $packagename = shift or die("No packagename given");
my $package = $cache->{$packagename};

unless($package) {
	print "E: Package not found: $packagename";
	exit(100);
}

sub revdeps {
	my $rdepsref = shift;
	my $depsref;
	my $parent;

	foreach(@$rdepsref) {
		undef($parent);
		$parent->{name} = $_->{ParentPkg}{Name};
		$parent->{ver} = $_->{ParentVer}{VerStr};
		$parent->{current_state} = $cache->{$_->{ParentPkg}{Name}}->{CurrentState};
		$parent->{selected_state} = $cache->{$_->{ParentPkg}{Name}}->{SelectedState};
		$parent->{deptype} = $_->{DepType};
		$parent->{targetname} = $_->{TargetPkg}{Name};
		if ($_->{TargetVer}) {
			$parent->{depsign} = $_;
			$parent->{depver} = $_;
		}
		$depsref->{$parent->{name}} = $parent;
	}
	return($depsref);
}

sub why {
	my $revdeps = revdeps(shift);
	my $why;
	foreach(keys(%$revdeps)) {
		if ($revdeps->{$_}->{current_state} eq 'Installed' and $revdeps->{$_}->{deptype} !~ /^(Conflicts|Replaces|Obsoletes)$/) {
			$why->{$_} = $revdeps->{$_};
		}
	}
	return($why);
}

sub why_not {
	my $revdeps = revdeps(shift);
	my $why_not;
	foreach(keys(%$revdeps)) {
		if ($revdeps->{$_}->{current_state} eq 'Installed' and $revdeps->{$_}->{deptype} =~ /^(Conflicts|Replaces|Obsoletes)$/) {
			$why_not->{$_} = $revdeps->{$_};
		}
	}
	return($why_not);
}

sub short_states {
	my $pkg = shift;
	my $state = '';
	switch($pkg->{selected_state}) {
		case('Unkwnon') {
			$state .= ' ';
		} case('Install') {
			$state .= 'i';
		} case('Hold') {
			$state .= 'h';
		} case('DeInstall') {
			$state .= 'r';
		} case('Purge') {
			$state .= 'p';
		}
	}
	switch($pkg->{current_state}) {
		case('Installed') {
			$state .= 'i';
		} case('UnPacked') {
			$state .= 'u';
		} case('HalfConfigured') {
			$state .= 'f';
		} case('HalfInstalled') {
			$state .= 'h';
		} case('ConfigFiles') {
			$state .= 'c';
		} case('NotInstalled') {
			$state .= ' ';
		}
	}
	return($state);
}


sub print_deps {
	my $deps = shift;
	foreach(keys(%$deps)) {
		printf "%-2s  %-30s %-15s %s\n", short_states($deps->{$_}), $deps->{$_}->{name}, $deps->{$_}->{deptype}, $deps->{$_}->{targetname};
	}
}

if ($query eq 'why') {
	print_deps(why($package->{RevDependsList}));
} elsif ($query eq 'why-not') {
	print_deps(why_not($package->{RevDependsList}));
} elsif ($query eq 'rdeps') {
	print_deps(revdeps($package->{RevDependsList}));
}