[pacman-dev] [PATCH] Show 'Required By' in -Si output

Dan McGee dpmcgee at gmail.com
Wed Oct 7 23:36:15 EDT 2009


On Wed, Oct 7, 2009 at 10:14 PM, Allan McRae <allan at archlinux.org> wrote:
> Dan McGee wrote:
>>
>> Just as we do in -Qi, we can compute required by information for sync
>> database packages. The behavior seems sane; for a given package, the -Si
>> required by will show all packages in *any* sync database that require it.
>>
>> Implements FS#16244.
>>
>> Signed-off-by: Dan McGee <dan at archlinux.org>
>> ---
>>  lib/libalpm/package.c |   46
>> ++++++++++++++++++++++++++++++++++++----------
>>  src/pacman/package.c  |   13 ++++---------
>>  2 files changed, 40 insertions(+), 19 deletions(-)
>>
>> diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
>> index de17166..b0b6480 100644
>> --- a/lib/libalpm/package.c
>> +++ b/lib/libalpm/package.c
>> @@ -556,6 +556,21 @@ unsigned short SYMEXPORT
>> alpm_pkg_has_scriptlet(pmpkg_t *pkg)
>>        return pkg->scriptlet;
>>  }
>>  +static void find_requiredby(pmpkg_t *pkg, pmdb_t *db, alpm_list_t
>> **reqs)
>> +{
>> +       const alpm_list_t *i;
>> +       for(i = _alpm_db_get_pkgcache(db); i; i = i->next) {
>> +               if(!i->data) {
>> +                       continue;
>> +               }
>> +               pmpkg_t *cachepkg = i->data;
>> +               if(_alpm_dep_edge(cachepkg, pkg)) {
>> +                       const char *cachepkgname =
>> alpm_pkg_get_name(cachepkg);
>> +                       *reqs = alpm_list_add(*reqs,
>> strdup(cachepkgname));
>> +               }
>> +       }
>> +}
>> +
>>  /**
>>  * @brief Compute the packages requiring a given package.
>>  * @param pkg a package
>> @@ -565,18 +580,29 @@ alpm_list_t SYMEXPORT
>> *alpm_pkg_compute_requiredby(pmpkg_t *pkg)
>>  {
>>        const alpm_list_t *i;
>>        alpm_list_t *reqs = NULL;
>> +       pmdb_t *db;
>>  -       pmdb_t *localdb = alpm_option_get_localdb();
>> -       for(i = _alpm_db_get_pkgcache(localdb); i; i = i->next) {
>> -               if(!i->data) {
>> -                       continue;
>> -               }
>> -               pmpkg_t *cachepkg = i->data;
>> -               if(_alpm_dep_edge(cachepkg, pkg)) {
>> -                       const char *cachepkgname =
>> alpm_pkg_get_name(cachepkg);
>> -                       reqs = alpm_list_add(reqs, strdup(cachepkgname));
>> +       if(pkg->origin == PKG_FROM_FILE) {
>> +               /* The sane option; search locally for things that require
>> this. */
>> +               db = alpm_option_get_localdb();
>> +               fprintf(stderr, "db name: %s\n", db->treename);
>> +               find_requiredby(pkg, db, &reqs);
>> +       } else {
>> +               /* We have a DB package. if it is a local package, then we
>> should
>> +                * only search the local DB; else search all known sync
>> databases. */
>> +               db = pkg->origin_data.db;
>> +               if(db->is_local) {
>> +                       fprintf(stderr, "db name: %s\n", db->treename);
>> +                       find_requiredby(pkg, db, &reqs);
>> +               } else {
>> +                       for(i = handle->dbs_sync; i; i = i->next) {
>> +                               db = i->data;
>> +                               fprintf(stderr, "db name: %s\n",
>> db->treename);
>> +                               find_requiredby(pkg, db, &reqs);
>> +                       }
>>                }
>>        }
>> +
>>        return(reqs);
>>  }
>>  diff --git a/src/pacman/package.c b/src/pacman/package.c
>> index 3b14516..e7e2552 100644
>> --- a/src/pacman/package.c
>> +++ b/src/pacman/package.c
>> @@ -83,10 +83,8 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
>>                depstrings = alpm_list_add(depstrings,
>> alpm_dep_compute_string(dep));
>>        }
>>  -       if(level>0) {
>> -               /* compute this here so we don't get a pause in the middle
>> of output */
>> -               requiredby = alpm_pkg_compute_requiredby(pkg);
>> -       }
>> +       /* compute this here so we don't get a pause in the middle of
>> output */
>> +       requiredby = alpm_pkg_compute_requiredby(pkg);
>>          /* actual output */
>>        string_display(_("Name           :"), alpm_pkg_get_name(pkg));
>> @@ -97,11 +95,7 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
>>        list_display(_("Provides       :"), alpm_pkg_get_provides(pkg));
>>        list_display(_("Depends On     :"), depstrings);
>>        list_display_linebreak(_("Optional Deps  :"),
>> alpm_pkg_get_optdepends(pkg));
>> -       /* Only applicable if installed */
>> -       if(level > 0) {
>> -               list_display(_("Required By    :"), requiredby);
>> -               FREELIST(requiredby);
>> -       }
>> +       list_display(_("Required By    :"), requiredby);
>>        list_display(_("Conflicts With :"), alpm_pkg_get_conflicts(pkg));
>>        list_display(_("Replaces       :"), alpm_pkg_get_replaces(pkg));
>>        if(level < 0) {
>> @@ -142,6 +136,7 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
>>        printf("\n");
>>          FREELIST(depstrings);
>> +       FREELIST(requiredby);
>>  }
>>   /* Display the content of a sync package
>>
>
> Looking at this, I can not see a way of turning it off.  I might be missing
> something....
>
>> cd /var/abs
>> grep -R "depends" {core,extra}/* | grep glibc | wc -l
> 365
>> grep -R "depends" {core,extra}/* | grep perl | wc -l
> 237
>
> How many lines of output will that result in?

Obviously glibc is the exception and not the rule, but yeah it is
pretty big. I'm not saying this is the final patch; putting this in
-Sii isn't a bad option (there is no such thing as -Sii right now
however). That is why I submit here first. :)

@Laszlo- I know you are trying to be helpful, but please let me speak
for myself when I am involved in this conversation to begin with.

dmcgee at galway ~/projects/pacman (master)
$ ./src/pacman/pacman -Si glibc
Repository     : core
db name: testing
db name: core
db name: extra
db name: community-testing
db name: community
Name           : glibc
Version        : 2.10.1-4
URL            : http://www.gnu.org/software/libc
Licenses       : GPL  LGPL
Groups         : base
Provides       : None
Depends On     : kernel-headers>=2.6.30.5  tzdata
Optional Deps  : None
Required By    : archboot  aufs2-util  dhcpcd  erlang  fakeroot  gzip
                 iptables  librpcsecgss  mlocate  nfs-utils  perl  popt
                 wpa_actiond  attr  b43-fwcutter  bash  bin86  binutils  bison
                 bridge-utils  bzip2  coreutils  cpio  cracklib  dcron
                 device-mapper  dhcpcd  diffutils  ed  eventlog  expat
                 fakeroot  file  findutils  flex  gawk  gcc-libs  gdbm
                 gen-init-cpio  grep  gzip  hdparm  ifenslave  initscripts
                 iptables  iputils  kbd  libcap  libevent  libgpg-error  libnl
                 libpcap  librpcsecgss  libtirpc  linux-atm  lzo2  m4  mailx
                 make  mdadm  mlocate  module-init-tools  nano  ncurses
                 ndiswrapper-utils  net-tools  nfs-utils  nfsidmap  pam  patch
                 pciutils  pcmciautils  perl  pkgconfig  popt  ppp  pptpclient
                 procinfo  psmisc  readline  rpcbind  run-parts  sdparm  sudo
                 sysfsutils  sysvinit  tar  tcp_wrappers  udev  usbutils  wget
                 which  wireless_tools  wlan-ng26-utils  zlib  a52dec  aalib
                 acct  acpi  acpid  alsa-lib  alsa-oss  anthy  antiword
                 archboot  arj  audiofile  aufs2-util  babl  barcode  beep
                 bftpd  biogrep  biopython  bladeenc  c-ares  cabextract
                 capi4hylafax  capi4k-utils  catdoc  ccache  cd-discid  cdargs
                 cdparanoia  chmlib  compface  cpudyn  ctags  dbh  dcfldd  di
                 diffstat  dmapi  dmidecode  dnsmasq  docker  dosfstools
                 dvdrtools  eject  enscript  erlang  ethtool  faac  faad2
                 fbset  fetchmail  fftw  fftw2  figlet  flac  flite  fping
                 fribidi  ftjam  fuse  glib  gnu-netcat  gnuchess  gnugo  gocr
                 gpart  gsl  hddtemp  hdup  help2man  hexedit  hping  hspell
                 httptunnel  i8kutils  icmake  id3v2  imake  indent
                 isapnptools  jhead  joe  latex2rtf  lcab  lensfun  libao
                 libart-lgpl  libburn  libcdaudio  libcddb  libchewing
                 libdaemon  libdatrie  libdrm  libdvbpsi  libdvdcss
                 libdvdread  libelf  libexif  libffi  libfs  libhangul
                 libical  libice  libidn  libixp  libjpeg  libksba  liblo
                 liblqr  libmad  libmcrypt  libmikmod  libmowgli  libmpcdec
                 libmpdclient  libmpeg2  libmspack  libmusepack  libmythes
                 libnet  libnova  libogg  liboil  libpciaccess  libproxy
                 libraw1394  libsigsegv  libstroke  libtasn1  libusb1  libv4l
                 libvisual  libx86  libxau  libxdmcp  libxmi  libytnef
                 link-grammar  linux_logo  lpsolve  lsof  ltrace  lxsplit  lzo
                 m17n-db  mcpp  mhash  mp3wrap  mpck  mpg123  mt-st  mtx
                 muparser  nasm  ne  netkit-bsd-finger  netselect  nspr
                 nss-mdns  ntfs-3g  ntfsprogs  openal  openjpeg  openslp
                 pdksh  perl-term-readkey  pixman  pm-utils  potrace  procmail
                 proftpd  psutils  pth  pwgen  pyogg  qstat  razor  rcs
                 recode  rpmunpack  rssh  sbcl  sdl  setserial  sg3_utils
                 silc-toolkit  slang  snarf  squashfs-tools  srm  strace
                 streamripper  sysklogd  syslinux  tcl  tidyhtml  time  tpb
                 tree  tsocks  unarj  unison  v86d  valgrind  vconfig  vsftpd
                 watchdog  wavpack  wipe  wmii  xf86-input-aiptek
                 xf86-input-calcomp  xf86-input-citron  xf86-input-digitaledge
                 xf86-input-dmc  xf86-input-dynapro  xf86-input-elo2300
                 xf86-input-elographics  xf86-input-evdev  xf86-input-fpit
                 xf86-input-hyperpen  xf86-input-jamstudio
                 xf86-input-joystick  xf86-input-keyboard  xf86-input-magellan
                 xf86-input-magictouch  xf86-input-microtouch
                 xf86-input-mouse  xf86-input-mutouch  xf86-input-palmax
                 xf86-input-penmount  xf86-input-spaceorb  xf86-input-summa
                 xf86-input-tek4957  xf86-input-ur98  xf86-input-vmmouse
                 xf86-input-void  xf86-video-apm  xf86-video-ark
                 xf86-video-chips  xf86-video-cirrus  xf86-video-dummy
                 xf86-video-fbdev  xf86-video-glint  xf86-video-i128
                 xf86-video-i740  xf86-video-mach64  xf86-video-mga
                 xf86-video-neomagic  xf86-video-nv  xf86-video-r128
                 xf86-video-radeonhd  xf86-video-rendition  xf86-video-s3
                 xf86-video-s3virge  xf86-video-savage
                 xf86-video-siliconmotion  xf86-video-sis  xf86-video-sisusb
                 xf86-video-tdfx  xf86-video-trident  xf86-video-tseng
                 xf86-video-v4l  xf86-video-vesa  xf86-video-vga
                 xf86-video-vmware  xf86-video-voodoo  xsnow  xtermcontrol
                 xvidcore  yasm  yp-tools  zip  nvidia-cg-toolkit  adns
                 anacron  apg  arpack  aumix-gtk  axel  bbpager  bchunk
                 bin2iso  binutils-avr  calc  ccd2iso  ccrypt  chrootuid
                 chrpath  cksfv  confuse  cross-arm-elf-binutils
                 cross-arm-wince-cegcc-cegccdll
                 cross-arm-wince-cegcc-cegccdll-dummy
                 cross-arm-wince-cegcc-cegccthrddll
                 cross-arm-wince-cegcc-docs  cross-arm-wince-cegcc-gcc-base
                 cross-arm-wince-cegcc-importlibs
                 cross-arm-wince-cegcc-libstdcppdll
                 cross-arm-wince-cegcc-newlib  cross-arm-wince-cegcc-profile
                 cross-arm-wince-cegcc-w32api  cutter  cvs-feature  darkhttpd
                 datemath  dgpsip  docbook2x  duff  dumb  eina-svn  embryo-svn
                 esekeyd  fcrackzip  floyd  freedroid  gavl  gnustep-make
                 hashcash  iasl  iniparser  inputattach  ircservices  jbigkit
                 jdk  jre  libasyncns  libcgi  libdlna  libev  libmemcached
                 libnfnetlink  libnsbmp  libnsgif  libparserutils  librcd
                 libtextcat  libtlen  libtrash  libupnp  libvc  libxdg-basedir
                 linuxtv-dvb-apps  mdf2iso  mingw32-binutils  moreutils
                 mp3gain  mxml  nemesis  nrg2iso  oidentd  optipng  pdnsd
                 pptpd  pv  pyid3lib  recoverdm  sarg  scponly
                 selinux-coreutils  selinux-flex  selinux-pam
                 selinux-sysvinit  ser2net  shapelib  shfs-utils  simh  splint
                 sshguard  stegdetect  swarp  synce-libsynce  synce-rra
                 sysstat  t1utils  tclgeomap  tinycdb  toolame  tre
                 ultimate-ircd  unrtf  uptimed  ustr  visitors  xmms-volnorm
                 xvkbd
Conflicts With : None
Replaces       : glibc-xen
Download Size  : 12559.29 K
Installed Size : 35776.00 K
Packager       : Jan de Groot <jgc at archlinux.org>
Architecture   : x86_64
Build Date     : Sun 23 Aug 2009 09:24:37 AM CDT
MD5 Sum        : c9ab969684213e48b8d0b80ae18a89cd
Description    : GNU C Library


More information about the pacman-dev mailing list