23

I'm using arch linux.

Is there a way to list optional dependencies of all installed packages? And if yes, can I filter this list to see only the missing (not installed) packages?

  • 1
    I haven't used Arch, but "dependency" doesn't sound optional (it's not in other distros). – jordanm Oct 28 '12 at 4:27
  • AFAIK, I don't think you can do that with pacman straight away. But it is very possible to write a small script to do it. Query pacman for list of installed packages. Have Yaourt fetch their PKGBUILDs and read the list of optdeps. The latest version of pacman-git has a commit that states whether the optdeps have already been installed. – darnir Oct 28 '12 at 5:09
  • @jordanm: As has build dependencies and optional dependencies. Optdeps are required only for certain features of a package. So, unless you are using that feature, you don't really need to bloat your system with a load of dependencies. – darnir Oct 28 '12 at 5:11
5

You can use expac to query the pacmandatabase.

Something like:

awk 'NF>=2' <(expac "%n %O") > optdeps

will print a list of all the installed packages on your machine and the optdepends for each one (%O)1 to a file called optdeps. You could then sort this against a list of installed optdepends packages.

See man expac for the complete list of options.


1. That is an upper case O, not a zero. Because we can't have a font that distinguished between the two...

  • [poke] We do have such a font now. :) – muru Dec 8 '14 at 18:35
4

There is a nice utility in the AUR-Repository (aur/pacdep).

pacdep has a lot of options - just one example - find out optional packages for "thunar-archive-plugin":

> pacdep -oppp thunar-archive-plugin
[...]
Optional dependencies:    6.16 MiB
  extra/file-roller     3.89 MiB
  extra/kdeutils-ark    1.12 MiB
  community/xarchiver   1.16 MiB
[...]

The output above means that none of the optional packages are installed. After installing "xarchiver" the output looks like

[...]
Optional dependencies:    6.16 MiB
 local:    1.16 MiB
  xarchiver            1.16 MiB
 sync:     5.01 MiB
  extra/file-roller    3.89 MiB
  extra/kdeutils-ark   1.12 MiB
[...]

I found (the first part of) this answer on
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies

3

This is not exactly efficient, but will find what you want (in COLOR!):

pacman -Q > /tmp/paccache
for pkg in $(awk '{print $1}' /tmp/paccache) ; do 
   echo -n "$pkg => "; 
   for dep in $(pacman -Qi $pkg | awk -F: '/Optional Deps/{gsub(/[\<\>=].*/,"");print $NF;}' ) ; do 
       grep -q "$dep" /tmp/paccache && COLOR=32 ; echo -en "\e[1;${COLOR:-31}m${dep}\e[0;m " ; unset COLOR ; 
   done 
   echo
done 
  • I'm not perfectly sure, but shouldn't that be || instead of && after the grep, and then parentheses around the rest of the line? – Rörd Nov 20 '12 at 21:10
  • And more importantly, this should probably use the "Optional Deps" section instead of the "Depends On" section of the pacman output. – Rörd Nov 20 '12 at 22:28
  • For example with xmms2: pacman -Qi xmms2 | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1 | cut -c19- | cut -d: -f1 – i336_ Mar 2 '16 at 2:18
2

Though I've had to notice that @DarkHeart's solution doesn't really work, it inspired me to make a working one. (no colours, though)

I'm using package-query, a similar tool instead of expac which was suggested by @jasonwryan, because I've had it already installed (it's a dependency of yaourt). It should be trivial to change this to use expac instead.

The listing of all optional dependencies is mostly done by the call to package-query. The first for-loop removes the explanations, so just the package names for the optional dependencies remain; the second for-loop removes the already installed dependencies in its first line before printing the results in the second one.

#!/usr/bin/perl
use strict;
use warnings;

my %deps;
for (`package-query -Q -f'%n %O'`) {
    $deps{ (/^(\S+)/)[0] } = [/(\S+):/g];
}
my @pkgs = keys %deps;
for my $pkg (@pkgs) {
    my @missing_deps = grep { !($_ ~~ @pkgs) } @{ $deps{$pkg} };
    print "$pkg => @missing_deps\n" if @missing_deps;
}
2

This should do the trick:

comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)

First input to comm lists all optional dependencies, second input all installed packages and their 'provide' attributes. Both lists are sorted and contain each element only once due to sort -u. Then only lines are shown that are contained in the first but not in the second list.

(edited to incorporate @Archemar's suggestion)

0

Sometimes you have to work backwards... first find all non-optional depends, then cross-reference with full list, then use uniq. This will generate a list of installed optional depends.

Find all installed

pacman -Q

Find all non-optional:

pacman -Qent

Unique entries must therefore be optional:

(pacman -Q; pacman -Qent) | sort | uniq -u 

Generate list of missing optional depends with descriptions, not pretty, but it works.

pacman -Q > /tmp/paccache; for pkg in $(awk '{print $1}' /tmp/paccache); do pacman -Qi $pkg | grep "^Optional Deps" | grep -v None >/dev/null && echo $pkg >> /tmp/hasdeps; done

for pkg in $(awk '{print $1}' /tmp/hasdeps); do echo -ne "Package: $pkg ___ "; (pacman -Qi $pkg | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1) | grep -v installed; echo ___; done | grep -v "___ ___" | sed -e 's/Optional Deps/ /' -e 's/___//' | sed -e 's/ \+/ /g'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.