On Wed, Oct 7, 2009 at 10:14 PM, Allan McRae <allan@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@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@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@archlinux.org> Architecture : x86_64 Build Date : Sun 23 Aug 2009 09:24:37 AM CDT MD5 Sum : c9ab969684213e48b8d0b80ae18a89cd Description : GNU C Library