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}));
}
|