Dan McGee wrote:
On Wed, Oct 7, 2009 at 10:14 PM, Allan McRae <[email protected]> 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 <[email protected]> --- 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 packageLooking 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 -l365grep -R "depends" {core,extra}/* | grep perl | wc -l237 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. :)
I always like thinking about the worst case scenario. And I was being ever so slightly facetious... :P
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
Should these be sorted? They are currently sorted within each repo so it will be quite a simple operation.
Allan
