From ec1fc664c9e806b1850a637336ad7c56a8931962 Mon Sep 17 00:00:00 2001 From: Judd Vinet Date: Thu, 2 Feb 2006 23:39:53 +0000 Subject: Imported from pacman-2.9.8.tar.gz --- ChangeLog | 16 ++- Makefile.in | 2 +- doc/makepkg.8.in | 47 ++++++- doc/pacman.8.in | 16 ++- etc/makepkg.conf | 61 ++++++--- etc/pacman.conf | 6 +- scripts/aurbuild | 24 ++++ scripts/gensync | 36 ++++-- scripts/makepkg | 137 ++++++++++++++------ scripts/makeworld | 25 +++- scripts/pacman-optimize | 8 +- scripts/updatesync | 37 ++++-- src/convertdb.c | 2 +- src/db.c | 6 +- src/db.h | 2 +- src/list.c | 2 +- src/list.h | 2 +- src/md5.c | 24 ++-- src/pacconf.h | 4 +- src/package.c | 17 ++- src/package.h | 2 +- src/pacman.c | 336 +++++++++++++++++++++++++++++++++++++----------- src/pacman.h | 2 +- src/pacsync.c | 7 +- src/pacsync.h | 2 +- src/rpmvercmp.c | 2 +- src/rpmvercmp.h | 2 +- src/util.c | 8 +- src/util.h | 2 +- src/vercmp.c | 2 +- 30 files changed, 620 insertions(+), 219 deletions(-) create mode 100755 scripts/aurbuild diff --git a/ChangeLog b/ChangeLog index ea8162dc..02613045 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,21 @@ VERSION DESCRIPTION ----------------------------------------------------------------------------- +2.9.8 - Changed behaviour with original=X,current=Y,new=Z scenario + - keep old in place, install new as .pacnew + - Search package provides when finding matching targets with -S + - Frugalware: added -Qm option to find foreign packages + - Frugalware: added DistCC support to makepkg + - bugfix: before searching databases for a dependency, make sure + one of the packages in the final list doesn't already provide + that dependency + - fix for segfaults that occurred when propagating requiredby + fields to replaced packages where one package depended on + another replaced package + - a better fix for pacman-optimize integrity checks + - fix for regex searches with -Ss (Miklos Vajna) + - added a --noprogressbar for scripts to use 2.9.7 - fixed the dupe listings of packages when dealing w/ groups - - patches from Miklos Vanja: + - patches from Miklos Vajna: - add regexp search support for -Qs and -Ss - fixed md5sums on x86_64 - add --sudosync to makepkg diff --git a/Makefile.in b/Makefile.in index ed8d2190..ce59b6e3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -34,7 +34,7 @@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) INSTALL_DATA = @INSTALL_DATA@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ -PACVER = 2.9.7 +PACVER = 2.9.8 TOPDIR = @srcdir@ SRCDIR = $(TOPDIR)/src/ diff --git a/doc/makepkg.8.in b/doc/makepkg.8.in index ea0c44f8..8561f4c6 100644 --- a/doc/makepkg.8.in +++ b/doc/makepkg.8.in @@ -1,4 +1,4 @@ -.TH makepkg 8 "August 3, 2004" "makepkg #VERSION#" "" +.TH makepkg 8 "January 30, 2006" "makepkg #VERSION#" "" .SH NAME makepkg \- package build utility .SH SYNOPSIS @@ -236,9 +236,26 @@ This is the release number specific to Arch Linux packages. This should be a brief description of the package and its functionality. .TP -.B force -This is used to force the package to be upgraded by \fB--sysupgrade\fP, even +.B options +This array allows you to override some of makepkg's default behaviour +when building packages. To set an option, just include the option name +in the \fBoptions\fP array. +.TP +.RS +\fIAvailable Options:\fP +.RS +.TP +.B FORCE +force the package to be upgraded by \fB--sysupgrade\fP, even if its an older version. +.TP +.B KEEPDOCS +do not remove /usr/share/doc and /usr/share/info directories. +.TP +.B NOSTRIP +do not strip debugging symbols from binaries and libraries. +.RE +.RE .TP .B url @@ -247,8 +264,17 @@ being packaged. This is typically the project's website. .TP .B license -Sets the license type (eg, "GPL", "BSD", "NON-FREE"). (\fBNote\fP: This -option is still in development and may change in the future) +This field specifies the license(s) that apply to the package. Commonly-used +licenses are typically found in \fI/usr/share/licenses/common\fP. If you +see the package's license there, simply reference it in the license field +(eg, \fBlicense="GPL"\fP). If the package provides a license not found in +\fI/usr/share/licenses/common\fP, then you should include the license in +the package itself and set \fBlicense="custom"\fP or \fBlicense="custom:LicenseName"\fP. +The license itself should be placed in a directory called +\fI$startdir/pkg/usr/share/licenses/$pkgname\fP. +.TP +.RE +If multiple licenses are applied, use the array form: \fBlicenses=('GPL' 'FDL')\fP .TP .B install @@ -271,7 +297,7 @@ If this field is present, it should contain an MD5 hash for every source file specified in the \fIsource\fP array (in the same order). makepkg will use this to verify source file integrity during subsequent builds. To easily generate md5sums, first build using the PKGBUILD then run -\fBmakepkg -g >>PKGBILD\fP. Then you can edit the PKGBUILD and move the +\fBmakepkg -g >>PKGBUILD\fP. Then you can edit the PKGBUILD and move the \fImd5sums\fP line from the bottom to an appropriate location. .TP @@ -400,6 +426,15 @@ build as root to use dependency auto-resolution. .B "\-w " Write the resulting package file to the directory \fI\fP instead of the current working directory. +.TP +.B "\-\-noconfirm" +When calling pacman to resolve dependencies or conflicts, makepkg can pass +the \fI--noconfirm\fP option to it so it does not wait for any user +input before proceeding with operations. +.TP +.B "\-\-noprogressbar" +When calling pacman, makepkg can pass the \fI--noprogressbar\fP option to it. +This is useful if one is directing makepkg's output to a non-terminal (ie, a file). .SH CONFIGURATION Configuration options are stored in \fI/etc/makepkg.conf\fP. This file is parsed diff --git a/doc/pacman.8.in b/doc/pacman.8.in index a09c1de5..3ca7fa0f 100644 --- a/doc/pacman.8.in +++ b/doc/pacman.8.in @@ -1,4 +1,4 @@ -.TH pacman 8 "July 6, 2005" "pacman #VERSION#" "" +.TH pacman 8 "January 21, 2006" "pacman #VERSION#" "" .SH NAME pacman \- package manager utility .SH SYNOPSIS @@ -83,6 +83,10 @@ Specify an alternate configuration file. .B "\-\-noconfirm" Bypass any and all "Are you sure?" messages. It's not a good idea to do this unless you want to run pacman from a script. +.TP +.B "\-\-noprogressbar" +Do not show a progress bar when downloading files. This can be useful for +scripts that call pacman and capture the output. .SH SYNC OPTIONS .TP .B "\-c, \-\-clean" @@ -174,6 +178,10 @@ option then the .PKGINFO file will be printed. List all files owned by . Multiple packages can be specified on the command line. .TP +.B "\-m, \-\-foreign" +List all packages that were not found in the sync database(s). Typically these +are packages that were downloaded manually and installed with --add. +.TP .B "\-o, \-\-owns " Search for the package that owns . .TP @@ -210,9 +218,9 @@ original=\fBX\fP, current=\fBY\fP, new=\fBY\fP The new one is identical to the current one. Win win. Install the new file. .TP original=\fBX\fP, current=\fBY\fP, new=\fBZ\fP -All three files are different. So we install the new file, but back up the -old one to a .pacsave extension. This way the user can move the old configuration -file back into place if he wishes. +All three files are different, so we install the new file with a .pacnew +extension and warn the user, so she can manually move the file into place +after making any necessary customizations. .SH CONFIGURATION pacman will attempt to read \fI/etc/pacman.conf\fP each time it is invoked. This configuration file is divided into sections or \fIrepositories\fP. Each section diff --git a/etc/makepkg.conf b/etc/makepkg.conf index 081ad038..792d1dac 100644 --- a/etc/makepkg.conf +++ b/etc/makepkg.conf @@ -2,35 +2,58 @@ # /etc/makepkg.conf # -# The FTP/HTTP download utility that makepkg should use to acquire sources -export FTPAGENT="/usr/bin/wget --continue --passive-ftp --tries=3 --waitretry=3" +######################################################################### +# SOURCE ACQUISITION +######################################################################### +# +#-- The FTP/HTTP download utility that makepkg should use to acquire sources +export FTPAGENT="/usr/bin/wget --continue --passive-ftp --tries=3 --waitretry=3 --no-check-certificate" #export FTPAGENT="/usr/bin/snarf" #export FTPAGENT="/usr/bin/lftpget -c" +######################################################################### +# ARCHITECTURE, COMPILE FLAGS +######################################################################### +# export CARCH="i686" export CHOST="i686-pc-linux-gnu" - -# Pentium Pro/Pentium II/Pentium III+/Pentium 4/Athlon exclusive (binaries -# will use the P6 instruction set and only run on P6+ systems) +#-- Exclusive: will only run on i686 or higher (P6, Athlon) export CFLAGS="-march=i686 -O2 -pipe" export CXXFLAGS="-march=i686 -O2 -pipe" -# Pentium Pro/Pentium II/Pentium III+/Pentium 4/Athlon optimized (but binaries -# will run on any x86 system) -#export CFLAGS="-mtune=i686 -O2 -pipe" -#export CXXFLAGS="-mtune=i686 -O2 -pipe" - -# SMP Systems -#export MAKEFLAGS="-j 2" - -# Enable fakeroot for building packages as a non-root user +#-- Optimized: will run on any x86, but optimized for i686 +#export CFLAGS="-mcpu=i686 -O2 -pipe" +#export CXXFLAGS="-mcpu=i686 -O2 -pipe" +#-- Make Flags: change this for DistCC/SMP systems +#export MAKEFLAGS="-j2" + +######################################################################### +# BUILD ENVIRONMENT +######################################################################### +# +#-- Fakeroot: for building packages as a non-root user export USE_FAKEROOT="y" - -# Enable colorized output messages +#-- DistCC: a distributed C/C++/ObjC compiler (modify MAKEFLAGS too) +export DISTCC="n" +#-- A space-delimited list of hosts running in the DistCC cluster +export DISTCC_HOSTS="" +#-- Colorized output messages export USE_COLOR="y" -# Specify a fixed directory where all packages will be placed +######################################################################### +# GLOBAL PACKAGE OPTIONS +######################################################################### +# +#-- Don't strip symbols from binaries/libraries +#export NOSTRIP="1" +#-- Keep doc and info directories +#export KEEPDOCS="1" + +######################################################################### +# PACKAGE OUTPUT +######################################################################### +# +#-- Destination: specify a fixed directory where all packages will be placed #export PKGDEST=/home/packages - -# If you want your name to show up in the packages you build, set this. +#-- Packager: name/email of the person or organization building packages #export PACKAGER="John Doe " diff --git a/etc/pacman.conf b/etc/pacman.conf index 42578338..345eb8c1 100644 --- a/etc/pacman.conf +++ b/etc/pacman.conf @@ -19,10 +19,10 @@ [options] LogFile = /var/log/pacman.log NoUpgrade = etc/passwd etc/group etc/shadow etc/sudoers -NoUpgrade = etc/fstab etc/raidtab etc/ld.so.conf -NoUpgrade = etc/rc.conf etc/rc.local +NoUpgrade = etc/fstab etc/raidtab etc/mdadm.conf etc/ld.so.conf +NoUpgrade = etc/inittab etc/rc.conf etc/rc.local NoUpgrade = etc/modprobe.conf etc/modules.conf -NoUpgrade = etc/lilo.conf boot/grub/menu.lst +NoUpgrade = etc/lilo.conf boot/grub/menu.lst etc/mkinitrd.conf HoldPkg = pacman glibc #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u diff --git a/scripts/aurbuild b/scripts/aurbuild new file mode 100755 index 00000000..02346d8d --- /dev/null +++ b/scripts/aurbuild @@ -0,0 +1,24 @@ +#!/bin/bash + +die() { + echo $* + exit 1 +} + +if [ "$1" == "" ]; then + echo "usage: aurbuild " + echo + exit 1 +fi +pkgname=$1 +[ -d $pkgname ] && die "Directory '$pkgname' already exists" +[ -f $pkgname ] && die "File '$pkgname' already exists" + +echo "Downloading $pkgname.tar.gz" +wget -q http://aur.archlinux.org/packages/$pkgname/$pkgname.tar.gz || die "Failed to fetch $1.pkg.tar.gz" + +tar zxf $pkgname.tar.gz || die "Extraction failed" +rm -f $pkgname.tar.gz +cd $pkgname || die "Failed to cwd" +makepkg + diff --git a/scripts/gensync b/scripts/gensync index 3cfcbcaa..b80367f3 100755 --- a/scripts/gensync +++ b/scripts/gensync @@ -2,7 +2,7 @@ # # gensync # -# Copyright (c) 2002-2005 by Judd Vinet +# Copyright (c) 2002-2006 by Judd Vinet # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ # USA. # -myver='2.9.7' +myver='2.9.8' usage() { echo "gensync $myver" @@ -51,6 +51,18 @@ die() { exit 1 } +check_option() { + local i + for i in ${options[@]}; do + local uc=`echo $i | tr [:lower:] [:upper:]` + local lc=`echo $i | tr [:upper:] [:lower:]` + if [ "$uc" = "$1" -o "$lc" = "$1" ]; then + echo $1 + return + fi + done +} + get_md5checksum() { if [ "$pkgdir" != "" ]; then @@ -69,7 +81,7 @@ get_md5checksum() db_write_entry() { unset pkgname pkgver pkgrel pkgdesc force - unset groups replaces provides depends conflicts + unset groups replaces provides depends conflicts options source $1 || return 1 cd $gstmpdir mkdir $pkgname-$pkgver-$pkgrel || return 1 @@ -107,7 +119,7 @@ db_write_entry() done echo "" >>desc fi - if [ "$force" = "y" -o "$force" = "Y" ]; then + if [ "$force" = "y" -o "$force" = "Y" -o "`check_option FORCE`" ]; then echo "%FORCE%" >>desc echo "" >>desc fi @@ -140,7 +152,7 @@ db_write_entry() if [ $# -lt 2 ]; then usage - exit 0 + exit 1 fi if [ "$1" = "-h" -o "$1" = "--help" ]; then @@ -169,12 +181,14 @@ for file in `find $rootdir/* -name PKGBUILD`; do else pkgfile="$destdir/$pkgname-$pkgver-$pkgrel.pkg.tar.gz" fi - [ -f $pkgfile ] || die "missing package file: $pkgfile" - csize=`du -b $pkgfile | cut -f1` - pkgmd5sum=`get_md5checksum $pkgfile` - [ -z $pkgmd5sum ] && die "error generating checksum for $pkgfile" - db_write_entry $file - [ $? -gt 0 ] && die "error writing entry for $file" + if [ -f $pkgfile ]; then + csize=`du -b $pkgfile | cut -f1` + pkgmd5sum=`get_md5checksum $pkgfile` + [ -z $pkgmd5sum ] && die "error generating checksum for $pkgfile" + db_write_entry $file || die "error writing entry for $file" + else + echo "gensync: missing package: $pkgfile" >&2 + fi done echo "gensync: compressing to $destfile..." >&2 diff --git a/scripts/makepkg b/scripts/makepkg index 6b578524..7ef28e54 100755 --- a/scripts/makepkg +++ b/scripts/makepkg @@ -2,7 +2,7 @@ # # makepkg # -# Copyright (c) 2002-2005 by Judd Vinet +# Copyright (c) 2002-2006 by Judd Vinet # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,11 +20,31 @@ # USA. # -myver='2.9.7' +myver='2.9.8' startdir=`pwd` PKGDEST=$startdir USE_COLOR="n" +# Options +BUILDSCRIPT="./PKGBUILD" +CLEANUP=0 +CLEANCACHE=0 +DEP_BIN=0 +DEP_SRC=0 +DEP_SUDO=0 +FORCE=0 +GENMD5=0 +INSTALL=0 +KEEPDOCS=0 +NOBUILD=0 +NOCCACHE=0 +NODEPS=0 +NOEXTRACT=0 +NOSTRIP=0 +RMDEPS=0 + +PACMAN_OPTS= + # source Arch's abs.conf if it's present [ -f /etc/abs/abs.conf ] && source /etc/abs/abs.conf @@ -72,11 +92,25 @@ strip_url() { echo $1 | sed 's|^.*://.*/||g' } +check_option() { + local i + for i in ${options[@]}; do + local uc=`echo $i | tr [:lower:] [:upper:]` + local lc=`echo $i | tr [:upper:] [:lower:]` + if [ "$uc" = "$1" -o "$lc" = "$1" ]; then + echo $1 + return + fi + done +} + checkdeps() { local missdep="" local deplist="" - missdep=`pacman -T $*` + [ $# -gt 0 ] || return + + missdep=`pacman $PACMAN_OPTS -T $*` ret=$? if [ "$ret" != "0" ]; then if [ "$ret" = "127" ]; then @@ -116,7 +150,7 @@ handledeps() { if [ "$DEP_BIN" = "1" ]; then # install missing deps from binary packages (using pacman -S) msg "Installing missing dependencies..." - pacman -D $deplist + pacman $PACMAN_OPTS -D $deplist if [ "$?" = "127" ]; then error "Failed to install missing dependencies." exit 1 @@ -131,9 +165,9 @@ handledeps() { FAKEROOTKEY2=$FAKEROOTKEY unset FAKEROOTKEY fi - sudo pacman -D $deplist + sudo pacman $PACMAN_OPTS -D $deplist if [ "$INFAKEROOT" = "1" ]; then - FAKEROOTKEY=$FAKEROOTKEY2 + export FAKEROOTKEY=$FAKEROOTKEY2 unset FAKEROOTKEY2 fi if [ "$?" = "127" ]; then @@ -192,8 +226,10 @@ handledeps() { usage() { echo "makepkg version $myver" - echo "usage: $0 [options]" - echo "options:" + echo + echo "Usage: $0 [options]" + echo + echo "Options:" echo " -b, --builddeps Build missing dependencies from source" echo " -B, --noccache Do not use ccache during build" echo " -c, --clean Clean up work files after build" @@ -214,33 +250,23 @@ usage() { echo " -S, --sudosync Install missing dependencies with pacman and sudo" echo " -w Write package to instead of the working dir" echo - echo " if -p is not specified, makepkg will look for a PKGBUILD" - echo " file in the current directory." + echo "These options can be passed to pacman:" + echo + echo " --noconfirm Do not ask for confirmation when resolving dependencies" + echo " --noprogressbar Do not show a progress bar when downloading files" + echo + echo "If -p is not specified, makepkg will look for ./PKGBUILD" echo } - -# Options -BUILDSCRIPT="./PKGBUILD" -CLEANUP=0 -CLEANCACHE=0 -DEP_BIN=0 -DEP_SRC=0 -DEP_SUDO=0 -FORCE=0 -GENMD5=0 -INSTALL=0 -NOBUILD=0 -NOCCACHE=0 -NODEPS=0 -NOEXTRACT=0 -NOSTRIP=0 -RMDEPS=0 - ARGLIST=$@ while [ "$#" -ne "0" ]; do case $1 in +# pacman + --noconfirm) PACMAN_OPTS="$PACMAN_OPTS --noconfirm" ;; + --noprogressbar) PACMAN_OPTS="$PACMAN_OPTS --noprogressbar" ;; +# makepkg --clean) CLEANUP=1 ;; --cleancache) CLEANCACHE=1 ;; --syncdeps) DEP_BIN=1 ;; @@ -335,6 +361,9 @@ fi unset pkgname pkgver pkgrel pkgdesc url license groups provides md5sums force unset replaces depends conflicts backup source install build makedepends +unset options +# some applications (eg, blackbox) will not build with some languages +unset LC_ALL LANG umask 0022 if [ ! -f $BUILDSCRIPT ]; then @@ -361,7 +390,8 @@ fi if [ -f $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz -a "$FORCE" = "0" -a "$GENMD5" = "0" ]; then if [ "$INSTALL" = "1" ]; then warning "a package has already been built, installing existing package." - pacman --upgrade $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz + echo pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz + pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz exit $? else error "a package has already been built. (use -f to overwrite)" @@ -506,7 +536,7 @@ if [ "$GENMD5" = "0" ]; then case $file in *.tar.gz|*.tar.Z|*.tgz) cmd="tar --use-compress-program=gzip -xf $file" ;; - *.tar.bz2) + *.tar.bz2|*.tbz2) cmd="tar --use-compress-program=bzip2 -xf $file" ;; *.tar) cmd="tar -xf $file" ;; @@ -571,7 +601,6 @@ else exit 0 fi - if [ "`id -u`" = "0" ]; then # chown all source files to root.root chown -R root.root $startdir/src @@ -589,6 +618,15 @@ if [ "$NOBUILD" = "1" ]; then exit 0 fi +# use distcc if requested +if [ "$DISTCC" = "y" ]; then + [ -d /usr/lib/distcc/bin ] && export PATH=/usr/lib/distcc/bin:$PATH + if [ "$INCHROOT" = "1" ]; then + [ -d /var/tmp/fst/.distcc ] || mkdir /var/tmp/fst/.distcc + export DISTCC_DIR=/var/tmp/fst/.distcc + fi +fi + # use ccache if it's available if [ "$NOCCACHE" = "0" ]; then [ -d /usr/lib/ccache/bin ] && export PATH=/usr/lib/ccache/bin:$PATH @@ -602,11 +640,14 @@ if [ $? -gt 0 ]; then exit 2 fi -# remove info/doc files -cd $startdir -rm -rf pkg/usr/info pkg/usr/share/info -rm -rf pkg/usr/doc pkg/usr/share/doc -rm -rf pkg/{usr,opt/gnome}/share/gtk-doc +if [ ! "`check_option KEEPDOCS`" -a "$KEEPDOCS" = "0" ]; then + # remove info/doc files + msg "Removing info/doc files..." + cd $startdir + rm -rf pkg/usr/info pkg/usr/share/info + rm -rf pkg/usr/doc pkg/usr/share/doc + rm -rf pkg/{usr,opt/gnome}/share/gtk-doc +fi # move /usr/share/man files to /usr/man if [ -d pkg/usr/share/man ]; then @@ -641,7 +682,7 @@ done cd $startdir # strip binaries -if [ "$NOSTRIP" = "0" ]; then +if [ ! "`check_option NOSTRIP`" -a "$NOSTRIP" = "0" ]; then msg "Stripping debugging symbols from libraries..." find pkg/{,usr,usr/local,opt/*}/lib -type f -not -name "*.dll" -not -name "*.exe" \ -exec /usr/bin/strip --strip-debug '{}' \; 2>&1 \ @@ -652,6 +693,18 @@ if [ "$NOSTRIP" = "0" ]; then | grep -v "No such file" | grep -v "format not recognized" fi +# remove libtool (.la) files +if [ "`check_option NOLIBTOOL`" ]; then + msg "Removing libtool .la files..." + find pkg -type f -name "*.la" -exec rm -f -- '{}' \; +fi + +# remove empty directories +if [ "`check_option NOEMPTYDIRS`" ]; then + msg "Removing empty directories..." + find pkg -mindepth 1 -type d -empty -exec rmdir {} \; +fi + # get some package meta info builddate=`LC_ALL= ; LANG= ; date -u "+%a %b %e %H:%M:%S %Y"` if [ "$PACKAGER" != "" ]; then @@ -729,16 +782,16 @@ fi if [ "$RMDEPS" = "1" -a "`id -u`" = "0" -a "$INFAKEROOT" != "1" -a \( ! -z "$deplist" -o ! -z "$makedeplist" \) ]; then msg "Removing installed dependencies..." - pacman -R $makedeplist $deplist + pacman $PACMAN_OPTS -R $makedeplist $deplist elif [ "$RMDEPS" = "1" -a "$DEP_SUDO" = "1" ]; then msg "Removing installed dependencies..." if [ "$INFAKEROOT" = "1" ]; then FAKEROOTKEY2=$FAKEROOTKEY unset FAKEROOTKEY fi - sudo pacman -R $makedeplist $deplist + sudo pacman $PACMAN_OPTS -R $makedeplist $deplist if [ "$INFAKEROOT" = "1" ]; then - FAKEROOTKEY=$FAKEROOTKEY2 + export FAKEROOTKEY=$FAKEROOTKEY2 unset FAKEROOTKEY2 fi fi @@ -746,8 +799,8 @@ fi msg "Finished making: $pkgname (`date`)" if [ "$INSTALL" = "1" -a "`id -u`" = "0" -a "$INFAKEROOT" != "1" ]; then - msg "Running pacman --upgrade..." - pacman --upgrade $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz + msg "Installing package with pacman -U..." + pacman $PACMAN_OPTS -U $PKGDEST/${pkgname}-${pkgver}-${pkgrel}.pkg.tar.gz exit $? fi diff --git a/scripts/makeworld b/scripts/makeworld index 7d4c762c..714ca475 100755 --- a/scripts/makeworld +++ b/scripts/makeworld @@ -2,7 +2,7 @@ # # makeworld # -# Copyright (c) 2002-2005 by Judd Vinet +# Copyright (c) 2002-2006 by Judd Vinet # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,13 +20,15 @@ # USA. # -version="2.9.7" +version="2.9.8" toplevel=`pwd` usage() { echo "makeworld version $version" - echo "usage: $0 [options] [category] ..." - echo "options:" + echo + echo "Usage: $0 [options] [category] ..." + echo + echo "Options:" echo " -b, --builddeps Build missing dependencies from source" echo " -c, --clean Clean up work files after build" echo " -d, --nodeps Skip all dependency checks" @@ -36,10 +38,15 @@ usage() { echo " -r, --rmdeps Remove installed dependencies after a successful build" echo " -s, --syncdeps Install missing dependencies with pacman" echo - echo " where is one or more directory names under the ABS root" - echo " eg: makeworld -c /packages base lib editors" + echo "These options can be passed to pacman:" + echo + echo " --noconfirm Do not ask for confirmation when resolving dependencies" + echo " --noprogressbar Do not show a progress bar when downloading files" + echo + echo "Where is one or more directory names under the ABS root" + echo "eg: makeworld -c /packages base lib editors" echo - echo " this should be run from the toplevel directory of ABS (usually /var/abs)" + echo "This should be run from the toplevel directory of ABS (usually /var/abs)" } if [ $# -lt 2 ]; then @@ -50,6 +57,10 @@ fi MAKEPKG_OPTS= for arg in $*; do case $arg in +# pacman + --noconfirm) MAKEPKG_OPTS="$MAKEPKG_OPTS --noconfirm" ;; + --noprogressbar) MAKEPKG_OPTS="$MAKEPKG_OPTS --noprogressbar" ;; +# makepkg --clean) MAKEPKG_OPTS="$MAKEPKG_OPTS -c" ;; --install) MAKEPKG_OPTS="$MAKEPKG_OPTS -i" ;; --syncdeps) MAKEPKG_OPTS="$MAKEPKG_OPTS -s" ;; diff --git a/scripts/pacman-optimize b/scripts/pacman-optimize index cb321f2c..74f3e64b 100755 --- a/scripts/pacman-optimize +++ b/scripts/pacman-optimize @@ -2,7 +2,7 @@ # # pacman-optimize # -# Copyright (c) 2002-2005 by Judd Vinet +# Copyright (c) 2002-2006 by Judd Vinet # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ # USA. # -myver='2.9.7' +myver='2.9.8' usage() { echo "pacman-optimize $myver" @@ -77,7 +77,7 @@ touch /tmp/pacman.lck # step 1: sum the old db echo "==> md5sum'ing the old database..." -tar --same-order -c $dbroot 2>/dev/null | md5sum >/tmp/pacsums.old +find $dbroot -type f | sort | xargs md5sum >/tmp/pacsums.old # step 1: copy the entire db directory to a new one echo "==> copying $dbroot..." @@ -87,7 +87,7 @@ cp -a $dbroot $dbroot.new || die_r "error copying $dbroot" echo "==> md5sum'ing the new database..." mv $dbroot $dbroot.bak || die_r "error renaming $dbroot" mv $dbroot.new $dbroot || die_r "error renaming $dbroot.new" -tar --same-order -c $dbroot 2>/dev/null | md5sum >/tmp/pacsums.new +find $dbroot -type f | sort | xargs md5sum >/tmp/pacsums.new # step 3: compare sums echo "==> checking integrity..." diff --git a/scripts/updatesync b/scripts/updatesync index 5385ed66..2f6866d4 100755 --- a/scripts/updatesync +++ b/scripts/updatesync @@ -3,7 +3,7 @@ # updatesync # # Copyright (c) 2004 by Jason Chu -# Derived from gensync (c) 2002-2005 Judd Vinet +# Derived from gensync (c) 2002-2006 Judd Vinet # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -21,7 +21,7 @@ # USA. # -myver='2.9.7' +myver='2.9.8' usage() { echo "updatesync $myver" @@ -54,6 +54,18 @@ die() exit 1 } +check_option() { + local i + for i in ${options[@]}; do + local uc=`echo $i | tr [:lower:] [:upper:]` + local lc=`echo $i | tr [:upper:] [:lower:]` + if [ "$uc" = "$1" -o "$lc" = "$1" ]; then + echo $1 + return + fi + done +} + get_md5checksum() { if [ "$pkgdir" != "" ]; then @@ -72,7 +84,7 @@ get_md5checksum() db_write_entry() { unset pkgname pkgver pkgrel pkgdesc force - unset groups replaces provides depends conflicts + unset groups replaces provides depends conflicts options source $1 || return 1 cd $ustmpdir mkdir $pkgname-$pkgver-$pkgrel || return 1 @@ -110,7 +122,7 @@ db_write_entry() done echo "" >>desc fi - if [ "$force" = "y" -o "$force" = "Y" ]; then + if [ "$force" = "y" -o "$force" = "Y" -o "`check_option FORCE`" ]; then echo "%FORCE%" >>desc echo "" >>desc fi @@ -157,7 +169,7 @@ delete_entry() if [ $# -lt 3 ]; then usage - exit 0 + exit 1 fi if [ "$1" = "-h" -o "$1" = "--help" ]; then @@ -210,12 +222,15 @@ if [ "$action" = "upd" ]; then else pkgfile="$destdir/$pkgname-$pkgver-$pkgrel.pkg.tar.gz" fi - [ -f $pkgfile ] || die "missing package file: $pkgfile" - csize=`du -b $pkgfile | cut -f1` - pkgmd5sum=`get_md5checksum $pkgfile` - [ -z $pkgmd5sum ] && die "error generating checksum for $pkgfile" - echo "updatesync: creating entry for $option" >&2 - db_write_entry $option || die "error writing entry for $option" + if [ -f $pkgfile ]; then + csize=`du -b $pkgfile | cut -f1` + pkgmd5sum=`get_md5checksum $pkgfile` + [ -z $pkgmd5sum ] && die "error generating checksum for $pkgfile" + echo "updatesync: creating entry for $option" >&2 + db_write_entry $option || die "error writing entry for $option" + else + echo "updatesync: missing package: $pkgfile" >&2 + fi else # DELETE delete_entry $option diff --git a/src/convertdb.c b/src/convertdb.c index 6fbebb23..74011493 100644 --- a/src/convertdb.c +++ b/src/convertdb.c @@ -1,7 +1,7 @@ /* * convertdb.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/db.c b/src/db.c index 6bcd0530..0c96c3cc 100644 --- a/src/db.c +++ b/src/db.c @@ -1,7 +1,7 @@ /* * db.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -651,14 +651,12 @@ void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles for(i = needles; i; i = i->next) { char *targ = strdup(i->data); - strtoupper(targ); for(j = cache; j; j = j->next) { pkginfo_t *pkg = (pkginfo_t*)j->data; char *haystack; int match = 0; /* check name */ haystack = strdup(pkg->name); - strtoupper(haystack); if(reg_match(haystack, targ)) { match = 1; } @@ -667,7 +665,6 @@ void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles /* check description */ if(!match) { haystack = strdup(pkg->desc); - strtoupper(haystack); if(reg_match(haystack, targ)) { match = 1; } @@ -681,7 +678,6 @@ void db_search(pacdb_t *db, PMList *cache, const char *treename, PMList *needles if(info != NULL) { for(m = info->provides; m; m = m->next) { haystack = strdup(m->data); - strtoupper(haystack); if(reg_match(haystack, targ)) { match = 1; } diff --git a/src/db.h b/src/db.h index f7d2a1a7..fa728f32 100644 --- a/src/db.h +++ b/src/db.h @@ -1,7 +1,7 @@ /* * db.h * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/list.c b/src/list.c index 1394f321..f4b9f994 100644 --- a/src/list.c +++ b/src/list.c @@ -1,7 +1,7 @@ /* * list.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/list.h b/src/list.h index fec2fcde..de40f570 100644 --- a/src/list.h +++ b/src/list.h @@ -1,7 +1,7 @@ /* * list.h * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/md5.c b/src/md5.c index fcb1611e..b4f5a159 100644 --- a/src/md5.c +++ b/src/md5.c @@ -23,6 +23,7 @@ These notices must be retained in any copies of any part of this documentation and/or software. */ +#include #include "md5.h" /* Constants for MD5Transform routine. @@ -48,8 +49,8 @@ documentation and/or software. static void MD5Transform(UINT4 [4], unsigned char [64]); static void Encode(unsigned char *, UINT4 *, unsigned int); static void Decode(UINT4 *, unsigned char *, unsigned int); -static void MD5_memcpy(POINTER, POINTER, unsigned int); -static void MD5_memset(POINTER, int, unsigned int); +/* static void MD5_memcpy(POINTER, POINTER, unsigned int); */ +/* static void MD5_memset(POINTER, int, unsigned int); */ static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -132,8 +133,7 @@ unsigned int inputLen; /* length of input block */ /* Transform as many times as possible. */ if (inputLen >= partLen) { - MD5_memcpy - ((POINTER)&context->buffer[index], (POINTER)input, partLen); + memcpy ((POINTER)&context->buffer[index], (POINTER)input, partLen); MD5Transform (context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) @@ -145,9 +145,7 @@ unsigned int inputLen; /* length of input block */ i = 0; /* Buffer remaining input */ - MD5_memcpy - ((POINTER)&context->buffer[index], (POINTER)&input[i], - inputLen-i); + memcpy ((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); } /* MD5 finalization. Ends an MD5 message-digest operation, writing the @@ -177,7 +175,7 @@ MD5_CTX *context; /* context */ /* Zeroize sensitive information. */ - MD5_memset ((POINTER)context, 0, sizeof (*context)); + memset ((POINTER)context, 0, sizeof (*context)); } /* MD5 basic transformation. Transforms state based on block. @@ -271,7 +269,7 @@ unsigned char block[64]; /* Zeroize sensitive information. */ - MD5_memset ((POINTER)x, 0, sizeof (x)); + memset ((POINTER)x, 0, sizeof (x)); } /* Encodes input (UINT4) into output (unsigned char). Assumes len is @@ -310,7 +308,7 @@ unsigned int len; /* Note: Replace "for loop" with standard memcpy if possible. */ -static void MD5_memcpy (output, input, len) +/* static void MD5_memcpy (output, input, len) POINTER output; POINTER input; unsigned int len; @@ -321,10 +319,10 @@ unsigned int len; output[i] = input[i]; } - +*/ /* Note: Replace "for loop" with standard memset if possible. */ -static void MD5_memset (output, value, len) +/* static void MD5_memset (output, value, len) POINTER output; int value; unsigned int len; @@ -334,5 +332,5 @@ unsigned int len; for (i = 0; i < len; i++) ((char *)output)[i] = (char)value; } - +*/ /* vim: set ts=2 sw=2 noet: */ diff --git a/src/pacconf.h b/src/pacconf.h index 8c2794ff..94031e3f 100644 --- a/src/pacconf.h +++ b/src/pacconf.h @@ -1,7 +1,7 @@ /* * pacconf.h * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +22,7 @@ #define _PAC_PACCONF_H #ifndef PACVER -#define PACVER "2.9.7" +#define PACVER "2.9.8" #endif #ifndef PACDBDIR diff --git a/src/package.c b/src/package.c index 747a8dd5..42aad7d9 100644 --- a/src/package.c +++ b/src/package.c @@ -1,7 +1,7 @@ /* * package.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -63,21 +63,28 @@ pkginfo_t* load_pkg(char *pkgfile) } if(!strcmp(th_get_pathname(tar), ".PKGINFO")) { char *descfile; + int fd; /* extract this file into /tmp. it has info for us */ descfile = strdup("/tmp/pacman_XXXXXX"); - mkstemp(descfile); + fd = mkstemp(descfile); tar_extract_file(tar, descfile); /* parse the info file */ parse_descfile(descfile, info, &backup, 0); if(!strlen(info->name)) { fprintf(stderr, "load_pkg: missing package name in %s.\n", pkgfile); FREEPKG(info); + unlink(descfile); + FREE(descfile); + close(fd); return(NULL); } if(!strlen(info->version)) { fprintf(stderr, "load_pkg: missing package version in %s.\n", pkgfile); FREEPKG(info); + unlink(descfile); + FREE(descfile); + close(fd); return(NULL); } for(lp = backup; lp; lp = lp->next) { @@ -86,7 +93,9 @@ pkginfo_t* load_pkg(char *pkgfile) } } config = 1; + unlink(descfile); FREE(descfile); + close(fd); continue; } else if(!strcmp(th_get_pathname(tar), "._install") || !strcmp(th_get_pathname(tar), ".INSTALL")) { info->scriptlet = 1; @@ -96,10 +105,11 @@ pkginfo_t* load_pkg(char *pkgfile) FILE *fp; char *fn; char *str; + int fd; MALLOC(str, PATH_MAX); fn = strdup("/tmp/pacman_XXXXXX"); - mkstemp(fn); + fd = mkstemp(fn); tar_extract_file(tar, fn); fp = fopen(fn, "r"); while(!feof(fp)) { @@ -115,6 +125,7 @@ pkginfo_t* load_pkg(char *pkgfile) fprintf(stderr, "warning: could not remove tempfile %s\n", fn); } FREE(fn); + close(fd); filelist = 1; continue; } else { diff --git a/src/package.h b/src/package.h index 6b1b905b..9579d768 100644 --- a/src/package.h +++ b/src/package.h @@ -1,7 +1,7 @@ /* * package.h * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/pacman.c b/src/pacman.c index 53c9d85c..11c8ef34 100644 --- a/src/pacman.c +++ b/src/pacman.c @@ -1,7 +1,7 @@ /* * pacman.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -53,51 +53,53 @@ */ /* command line options */ -char *pmo_root = NULL; -unsigned short pmo_op = PM_MAIN; -unsigned short pmo_verbose = 0; -unsigned short pmo_version = 0; -unsigned short pmo_help = 0; -unsigned short pmo_force = 0; -unsigned short pmo_nodeps = 0; -unsigned short pmo_upgrade = 0; -unsigned short pmo_freshen = 0; -unsigned short pmo_nosave = 0; -unsigned short pmo_noconfirm = 0; -unsigned short pmo_d_vertest = 0; -unsigned short pmo_d_resolve = 0; -unsigned short pmo_q_isfile = 0; -unsigned short pmo_q_info = 0; -unsigned short pmo_q_list = 0; -unsigned short pmo_q_orphans = 0; -unsigned short pmo_q_owns = 0; -unsigned short pmo_q_search = 0; -unsigned short pmo_r_cascade = 0; -unsigned short pmo_r_dbonly = 0; -unsigned short pmo_r_recurse = 0; -unsigned short pmo_s_clean = 0; +char *pmo_root = NULL; +unsigned short pmo_op = PM_MAIN; +unsigned short pmo_verbose = 0; +unsigned short pmo_version = 0; +unsigned short pmo_help = 0; +unsigned short pmo_force = 0; +unsigned short pmo_nodeps = 0; +unsigned short pmo_upgrade = 0; +unsigned short pmo_freshen = 0; +unsigned short pmo_nosave = 0; +unsigned short pmo_noconfirm = 0; +unsigned short pmo_noprogressbar = 0; +unsigned short pmo_d_vertest = 0; +unsigned short pmo_d_resolve = 0; +unsigned short pmo_q_isfile = 0; +unsigned short pmo_q_info = 0; +unsigned short pmo_q_list = 0; +unsigned short pmo_q_foreign = 0; +unsigned short pmo_q_orphans = 0; +unsigned short pmo_q_owns = 0; +unsigned short pmo_q_search = 0; +unsigned short pmo_r_cascade = 0; +unsigned short pmo_r_dbonly = 0; +unsigned short pmo_r_recurse = 0; +unsigned short pmo_s_clean = 0; unsigned short pmo_s_downloadonly = 0; -PMList *pmo_s_ignore = NULL; -unsigned short pmo_s_info = 0; -unsigned short pmo_s_printuris = 0; -unsigned short pmo_s_search = 0; -unsigned short pmo_s_sync = 0; -unsigned short pmo_s_upgrade = 0; -unsigned short pmo_group = 0; +PMList *pmo_s_ignore = NULL; +unsigned short pmo_s_info = 0; +unsigned short pmo_s_printuris = 0; +unsigned short pmo_s_search = 0; +unsigned short pmo_s_sync = 0; +unsigned short pmo_s_upgrade = 0; +unsigned short pmo_group = 0; /* configuration file options */ -char *pmo_dbpath = NULL; -char *pmo_configfile = NULL; -char *pmo_logfile = NULL; -char *pmo_proxyhost = NULL; -unsigned short pmo_proxyport = 0; -char *pmo_xfercommand = NULL; -PMList *pmo_noupgrade = NULL; -PMList *pmo_noextract = NULL; -PMList *pmo_ignorepkg = NULL; -PMList *pmo_holdpkg = NULL; -unsigned short pmo_chomp = 0; -unsigned short pmo_usesyslog = 0; -unsigned short pmo_nopassiveftp = 0; +char *pmo_dbpath = NULL; +char *pmo_configfile = NULL; +char *pmo_logfile = NULL; +char *pmo_proxyhost = NULL; +unsigned short pmo_proxyport = 0; +char *pmo_xfercommand = NULL; +PMList *pmo_noupgrade = NULL; +PMList *pmo_noextract = NULL; +PMList *pmo_ignorepkg = NULL; +PMList *pmo_holdpkg = NULL; +unsigned short pmo_chomp = 0; +unsigned short pmo_usesyslog = 0; +unsigned short pmo_nopassiveftp = 0; /* list of sync_t structs for sync locations */ @@ -256,8 +258,10 @@ int main(int argc, char *argv[]) pm_packages = db_loadpkgs(db_local); /* the operation requires at least one target */ - if (list_count(pm_targets) == 0 && !(pmo_op == PM_QUERY || (pmo_op == PM_SYNC && (pmo_s_sync || pmo_s_upgrade || pmo_s_clean || pmo_group || pmo_q_list)))) + if(list_count(pm_targets) == 0 && !(pmo_op == PM_QUERY || (pmo_op == PM_SYNC && (pmo_s_sync || pmo_s_upgrade || pmo_s_clean || pmo_group || pmo_q_list)))) { + fprintf(stderr, "error: no targets specified\n"); usage(pmo_op, (char*)basename(argv[0])); + } /* start the requested operation */ switch(pmo_op) { @@ -267,9 +271,15 @@ int main(int argc, char *argv[]) case PM_QUERY: ret = pacman_query(db_local, pm_targets); break; case PM_SYNC: ret = pacman_sync(db_local, pm_targets); break; case PM_DEPTEST: ret = pacman_deptest(db_local, pm_targets); break; - case PM_MAIN: ret = 0; break; - default: fprintf(stderr, "error: no operation specified (use -h for help)\n\n"); - ret = 1; + case PM_MAIN: /* fallthrough */ + default: + ret = 0; + if(list_count(pm_targets) > 0) { + fprintf(stderr, "error: no operation specified\n"); + usage(pmo_op, (char*)basename(argv[0])); + ret = 1; + } + break; } db_close(db_local); cleanup(ret); @@ -827,6 +837,36 @@ int pacman_sync(pacdb_t *db, PMList *targets) } } } + if(!found) { + /* target was not found: check provides */ + for(j = databases; !found && j; j = j->next) { + dbsync_t *dbs = (dbsync_t*)j->data; + PMList *p = whatprovides(dbs->db, targ); + if(p) { + /* we only take the first one in the list */ + pkginfo_t *pkg = (pkginfo_t*)p->data; + if(treename == NULL || + (treename && !strcmp(treename, dbs->sync->treename))) { + found = 1; + sync->dbs = dbs; + /* re-fetch the package record with dependency info */ + sync->pkg = db_scan(sync->dbs->db, pkg->name, INFRQ_DESC | INFRQ_DEPENDS); + if(sync->pkg == NULL) { + found = 0; + } + if(pmo_d_resolve) { + /* looks like we're being called from 'makepkg -s' so these are all deps */ + sync->pkg->reason = REASON_DEPEND; + } else { + /* this package was explicitly requested */ + sync->pkg->reason = REASON_EXPLICIT; + } + } + p->data = NULL; + FREELIST(p); + } + } + } if(!found) { if(treename == NULL) { /* target not found: check if it's a group */ @@ -1338,11 +1378,50 @@ int pacman_sync(pacdb_t *db, PMList *targets) depmissing_t* miss = (depmissing_t*)j->data; syncpkg_t *s = find_pkginsync(miss->depend.name, final); if(s == NULL) { - if(allgood) { - fprintf(stderr, "error: this will break the following dependencies:\n"); + int pfound = 0; + /* If miss->depend.name depends on something that miss->target and a + * package in final both provide, then it's okay... */ + pkginfo_t *leavingp = db_scan(db, miss->target, INFRQ_DESC | INFRQ_DEPENDS); + pkginfo_t *conflictp = db_scan(db, miss->depend.name, INFRQ_DESC | INFRQ_DEPENDS); + if(!leavingp || !conflictp) { + fprintf(stderr, "error: something has gone horribly wrong\n"); allgood = 0; + goto sync_cleanup; + } + /* Look through the upset package's dependencies and try to match one up + * to a provisio from the package we want to remove */ + for(k = conflictp->depends; k && !pfound; k = k->next) { + PMList *m; + for(m = leavingp->provides; m && !pfound; m = m->next) { + if(!strcmp(k->data, m->data)) { + /* Found a match -- now look through final for a package that + * provides the same thing. If none are found, then it truly + * is an unresolvable conflict. */ + PMList *n, *o; + for(n = final; n && !pfound; n = n->next) { + syncpkg_t *sp = (syncpkg_t*)n->data; + for(o = sp->pkg->provides; o && !pfound; o = o->next) { + if(!strcmp(m->data, o->data)) { + /* found matching provisio -- we're good to go */ + vprint("Found a matching provides (%s) in %s, conflict aborted\n", + (char*)o->data, sp->pkg->name); + pfound = 1; + } + } + } + } + } + } + FREEPKG(conflictp); + FREEPKG(leavingp); + + if(!pfound) { + if(allgood) { + fprintf(stderr, "error: this will break the following dependencies:\n"); + allgood = 0; + } + printf(" %s: is required by %s\n", miss->target, miss->depend.name); } - printf(" %s: is required by %s\n", miss->target, miss->depend.name); } } FREELIST(i); @@ -1401,7 +1480,6 @@ int pacman_sync(pacdb_t *db, PMList *targets) allgood = !pacman_upgrade(db, files, dependonly); } /* propagate replaced packages' requiredby fields to their new owners */ - /* XXX: segfault */ if(allgood) { for(i = final; i; i = i->next) { syncpkg_t *sync = (syncpkg_t*)i->data; @@ -1420,6 +1498,13 @@ int pacman_sync(pacdb_t *db, PMList *targets) /* replace old's name with new's name in the requiredby's dependency list */ PMList *m; pkginfo_t *depender = db_scan(db, k->data, INFRQ_DEPENDS); + if(depender == NULL) { + /* If the depending package no longer exists in the local db, + * then it must have ALSO conflicted with sync->pkg. If + * that's the case, then we don't have anything to propagate + * here. */ + continue; + } for(m = depender->depends; m; m = m->next) { if(!strcmp(m->data, old->name)) { FREE(m->data); @@ -1866,17 +1951,21 @@ int pacman_add(pacdb_t *db, PMList *targets, PMList *dependonly) if(nb) { char *temp; + int fd; char *md5_local, *md5_pkg; - md5_local = MDFile(expath); /* extract the package's version to a temporary file and md5 it */ temp = strdup("/tmp/pacman_XXXXXX"); - mkstemp(temp); + fd = mkstemp(temp); if(tar_extract_file(tar, temp)) { logaction(stderr, "could not extract %s: %s", pathname, strerror(errno)); errors++; + unlink(temp); + FREE(temp); + close(fd); continue; } + md5_local = MDFile(expath); md5_pkg = MDFile(temp); /* append the new md5 hash to it's respective entry in info->backup * (it will be the new orginal) @@ -1938,15 +2027,10 @@ int pacman_add(pacdb_t *db, PMList *targets, PMList *dependonly) vprint(" action: installing new file\n"); installnew = 1; } else { - char newpath[PATH_MAX]; - vprint(" action: saving current file and installing new one\n"); + vprint(" action: leaving file in place, installing new one as .pacnew\n"); + strncat(expath, ".pacnew", PATH_MAX); + logaction(stderr, "warning: extracting %s%s as %s", pmo_root, pathname, expath); installnew = 1; - snprintf(newpath, PATH_MAX, "%s.pacsave", expath); - if(rename(expath, newpath)) { - logaction(stderr, "error: could not rename %s: %s", expath, strerror(errno)); - } else { - logaction(stderr, "warning: %s saved as %s", expath, newpath); - } } if(installnew) { @@ -1963,6 +2047,7 @@ int pacman_add(pacdb_t *db, PMList *targets, PMList *dependonly) FREE(md5_orig); unlink(temp); FREE(temp); + close(fd); } else { if(!notouch) { /*vprint(" %s\n", expath);*/ @@ -2254,12 +2339,13 @@ int pacman_remove(pacdb_t *db, PMList *targets, PMList *skiplist) info = (pkginfo_t*)targ->data; if(!pmo_upgrade) { - printf("removing %s... ", info->name); - neednl = 1; - fflush(stdout); /* run the pre-remove scriptlet if it exists */ snprintf(pm_install, PATH_MAX, "%s%s/%s/%s-%s/install", pmo_root, pmo_dbpath, db->treename, info->name, info->version); runscriptlet(pm_install, "pre_remove", info->version, NULL); + + printf("removing %s... ", info->name); + neednl = 1; + fflush(stdout); } if(!pmo_r_dbonly) { @@ -2404,8 +2490,33 @@ int pacman_query(pacdb_t *db, PMList *targets) char *package = NULL; char path[PATH_MAX+1]; pkginfo_t *info = NULL; - PMList *targ, *lp, *q; + PMList *targ, *lp, *q, *databases = NULL; int done = 0; + PMList *i, *j; + + if(pmo_q_foreign) + { + /* open sync db(s) */ + PMList *dbp; + for(dbp = pmc_syncs; dbp; dbp = dbp->next) { + pacdb_t *db_sync = NULL; + dbsync_t *dbs = NULL; + sync_t *sync = (sync_t*)dbp->data; + + db_sync = db_open(pmo_root, pmo_dbpath, sync->treename); + if(db_sync == NULL) { + fprintf(stderr, "error: could not open sync database: %s\n", sync->treename); + fprintf(stderr, " have you used --refresh yet?\n"); + return(1); + } + MALLOC(dbs, sizeof(dbsync_t)); + dbs->sync = sync; + dbs->db = db_sync; + /* cache packages */ + dbs->pkgcache = db_loadpkgs(db_sync); + databases = list_add(databases, dbs); + } + } if(pmo_q_search) { db_search(db, pm_packages, "local", targets); @@ -2512,7 +2623,7 @@ int pacman_query(pacdb_t *db, PMList *targets) /* no target */ for(lp = pm_packages; lp; lp = lp->next) { pkginfo_t *tmpp = (pkginfo_t*)lp->data; - if(pmo_q_list || pmo_q_orphans) { + if(pmo_q_list || pmo_q_orphans || pmo_q_foreign) { info = db_scan(db, tmpp->name, INFRQ_ALL); if(info == NULL) { /* something weird happened */ @@ -2528,6 +2639,29 @@ int pacman_query(pacdb_t *db, PMList *targets) printf("%s %s\n", tmpp->name, tmpp->version); } } + if(pmo_q_foreign) { + int match = 0; + for(i = databases; i; i = i->next) { + dbsync_t *dbs = (dbsync_t*)i->data; + for(j = dbs->pkgcache; j; j = j->next) { + pkginfo_t *pkg = (pkginfo_t*)j->data; + char *haystack; + char *needle; + haystack = strdup(pkg->name); + strtoupper(haystack); + needle = strdup(info->name); + strtoupper(needle); + if(strstr(haystack, needle)) { + match = 1; + } + FREE(haystack); + FREE(needle); + } + } + if(match==0) { + printf("%s %s\n", tmpp->name, tmpp->version); + } + } FREEPKG(info); } else { printf("%s %s\n", tmpp->name, tmpp->version); @@ -2592,6 +2726,33 @@ int pacman_query(pacdb_t *db, PMList *targets) if(info->requiredby == NULL) { printf("%s %s\n", info->name, info->version); } + } else if(pmo_q_foreign) { + int match = 0; + info = db_scan(db, package, INFRQ_DESC | INFRQ_DEPENDS); + if(info == NULL) { + fprintf(stderr, "Package \"%s\" was not found.\n", package); + return(2); + } + for(i = databases; i; i = i->next) { + dbsync_t *dbs = (dbsync_t*)i->data; + for(j = dbs->pkgcache; j; j = j->next) { + pkginfo_t *pkg = (pkginfo_t*)j->data; + char *haystack; + char *needle; + haystack = strdup(pkg->name); + strtoupper(haystack); + needle = strdup(info->name); + strtoupper(needle); + if(strstr(haystack, needle)) { + match = 1; + } + FREE(haystack); + FREE(needle); + } + } + if(match==0) { + printf("%s %s\n", info->name, info->version); + } } else { info = db_scan(db, package, INFRQ_DESC); if(info == NULL) { @@ -2802,10 +2963,28 @@ int resolvedeps(pacdb_t *local, PMList *databases, syncpkg_t *syncpkg, PMList *l return(1); } else*/ if(miss->type == DEPEND) { + int provisio_match = 0; syncpkg_t *sync = NULL; MALLOC(sync, sizeof(syncpkg_t)); sync->replaces = NULL; + /* check if one of the packages in *list already provides this dependency */ + for(j = list; j; j = j->next) { + syncpkg_t *sp = (syncpkg_t*)j->data; + if(sp == NULL) { + continue; + } + for(k = sp->pkg->provides; k; k = k->next) { + if(!strcmp(miss->depend.name, k->data)) { + vprint("resolvedeps: %s provides dependency %s\n", sp->pkg->name, miss->depend.name); + provisio_match = 1; + } + } + } + if(provisio_match) { + continue; + } + /* find the package in one of the repositories */ for(j = databases; !found && j; j = j->next) { dbsync_t *dbs = (dbsync_t*)j->data; @@ -2853,7 +3032,7 @@ int resolvedeps(pacdb_t *local, PMList *databases, syncpkg_t *syncpkg, PMList *l FREE(sync); continue; } - vprint("resolving %s\n", sync->pkg->name); + vprint("resolvedeps: resolving %s\n", sync->pkg->name); found = 0; for(j = trail; j; j = j->next) { syncpkg_t *tmp = (syncpkg_t*)j->data; @@ -2886,7 +3065,7 @@ int resolvedeps(pacdb_t *local, PMList *databases, syncpkg_t *syncpkg, PMList *l if(resolvedeps(local, databases, sync, list, trail)) { return(1); } - vprint("adding %s-%s\n", sync->pkg->name, sync->pkg->version); + vprint("resolvedeps: adding %s-%s\n", sync->pkg->name, sync->pkg->version); list = list_add(list, sync); } else { fprintf(stderr, "error: cannot resolve dependencies for \"%s\"\n", miss->target); @@ -2894,7 +3073,7 @@ int resolvedeps(pacdb_t *local, PMList *databases, syncpkg_t *syncpkg, PMList *l } } else { /* cycle detected -- skip it */ - vprint("dependency cycle detected: %s\n", sync->pkg->name); + vprint("resolvedeps: dependency cycle detected: %s\n", sync->pkg->name); FREEPKG(sync->pkg); FREE(sync); } @@ -3014,11 +3193,15 @@ PMList* checkdeps(pacdb_t *db, unsigned short op, PMList *targets) /* CONFLICTS */ for(j = tp->conflicts; j; j = j->next) { + if(!strcmp(tp->name, j->data)) { + /* a package cannot conflict with itself -- that's just not nice */ + continue; + } /* check targets against database */ for(k = pm_packages; k; k = k->next) { int conflict = 0; pkginfo_t *dp = (pkginfo_t*)k->data; - if(!strcmp(dp->name, tp->name)) { + if(!strcmp(tp->name, dp->name)) { /* a package cannot conflict with itself -- that's just not nice */ continue; } @@ -3468,6 +3651,7 @@ int parseargs(int op, int argc, char **argv) {"dbonly", no_argument, 0, 'k'}, {"list", no_argument, 0, 'l'}, {"nosave", no_argument, 0, 'n'}, + {"foreign", no_argument, 0, 'm'}, {"owns", no_argument, 0, 'o'}, {"file", no_argument, 0, 'p'}, {"print-uris", no_argument, 0, 'p'}, @@ -3479,12 +3663,13 @@ int parseargs(int op, int argc, char **argv) {"downloadonly", no_argument, 0, 'w'}, {"refresh", no_argument, 0, 'y'}, {"noconfirm", no_argument, 0, 1000}, + {"noprogressbar", no_argument, 0, 1003}, {"config", required_argument, 0, 1001}, {"ignore", required_argument, 0, 1002}, {0, 0, 0, 0} }; - while((opt = getopt_long(argc, argv, "ARUFQSTDYr:b:vkhscVfnoldepiuwyg", opts, &option_index))) { + while((opt = getopt_long(argc, argv, "ARUFQSTDYr:b:vkhscVfmnoldepiuwyg", opts, &option_index))) { if(opt < 0) { break; } @@ -3493,6 +3678,7 @@ int parseargs(int op, int argc, char **argv) case 1000: pmo_noconfirm = 1; break; case 1001: strcpy(pmo_configfile, optarg); break; case 1002: pmo_s_ignore = list_add(pmo_s_ignore, strdup(optarg)); break; + case 1003: pmo_noprogressbar = 1; break; case 'A': pmo_op = (pmo_op != PM_MAIN ? 0 : PM_ADD); break; case 'R': pmo_op = (pmo_op != PM_MAIN ? 0 : PM_REMOVE); break; case 'U': pmo_op = (pmo_op != PM_MAIN ? 0 : PM_UPGRADE); break; @@ -3514,6 +3700,7 @@ int parseargs(int op, int argc, char **argv) case 'k': pmo_r_dbonly = 1; break; case 'l': pmo_q_list = 1; break; case 'n': pmo_nosave = 1; break; + case 'm': pmo_q_foreign = 1; break; case 'p': pmo_q_isfile = 1; pmo_s_printuris = 1; break; case 'o': pmo_q_owns = 1; break; case 'r': if(realpath(optarg, pmo_root) == NULL) { @@ -3853,6 +4040,7 @@ void usage(int op, char *myname) printf(" -g, --groups view all members of a package group\n"); printf(" -i, --info view package information (use -ii for more)\n"); printf(" -l, --list list the contents of the queried package\n"); + printf(" -m, --foreign list all packages that were not found in the sync db(s)\n"); printf(" -o, --owns query the package that owns \n"); printf(" -p, --file pacman will query the package file [package] instead of\n"); printf(" looking in the database\n"); @@ -3875,6 +4063,7 @@ void usage(int op, char *myname) } printf(" --config set an alternate configuration file\n"); printf(" --noconfirm do not ask for any confirmation\n"); + printf(" --noprogressbar do not show a progress bar when downloading files\n"); printf(" -v, --verbose be verbose\n"); printf(" -r, --root set an alternate installation root\n"); printf(" -b, --dbpath set an alternate database location\n"); @@ -3887,7 +4076,7 @@ void version(void) { printf("\n"); printf(" .--. Pacman v%s\n", PACVER); - printf("/ _.-' .-. .-. .-. Copyright (C) 2002-2005 Judd Vinet \n"); + printf("/ _.-' .-. .-. .-. Copyright (C) 2002-2006 Judd Vinet \n"); printf("\\ '-. '-' '-' '-' \n"); printf(" '--' This program may be freely redistributed under\n"); printf(" the terms of the GNU General Public License\n\n"); @@ -4029,6 +4218,7 @@ void cleanup(int signum) FREE(pmo_logfile); FREE(pmo_proxyhost); FREE(pmo_xfercommand); + FREE(pmo_configfile); FREELIST(pm_targets); diff --git a/src/pacman.h b/src/pacman.h index 79106eb1..f4ec9d81 100644 --- a/src/pacman.h +++ b/src/pacman.h @@ -1,7 +1,7 @@ /* * pacman.h * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/pacsync.c b/src/pacsync.c index 4b1f1b53..0091dbdc 100644 --- a/src/pacsync.c +++ b/src/pacsync.c @@ -1,7 +1,7 @@ /* * pacsync.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -52,6 +52,7 @@ extern char *pmo_xfercommand; extern unsigned short pmo_proxyport; extern unsigned short pmo_nopassiveftp; +extern unsigned short pmo_noprogressbar; extern unsigned short pmo_chomp; /* sync servers */ @@ -483,6 +484,10 @@ static int log_progress(netbuf *ctl, int xfered, void *arg) static unsigned short mouth; static unsigned int lastcur = 0; + if(pmo_noprogressbar) { + return(1); + } + gettimeofday(&t1, NULL); if(xfered+offset == fsz) { t = t0; diff --git a/src/pacsync.h b/src/pacsync.h index eb2505d8..4b3d35ed 100644 --- a/src/pacsync.h +++ b/src/pacsync.h @@ -1,7 +1,7 @@ /* * pacsync.h * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rpmvercmp.c b/src/rpmvercmp.c index 014e09ad..6dbc1199 100644 --- a/src/rpmvercmp.c +++ b/src/rpmvercmp.c @@ -1,7 +1,7 @@ /* * rpmvercmp.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/rpmvercmp.h b/src/rpmvercmp.h index 7c18e912..6fbf13f2 100644 --- a/src/rpmvercmp.h +++ b/src/rpmvercmp.h @@ -1,7 +1,7 @@ /* * rpmvercmp.h * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/util.c b/src/util.c index 528cc91f..ee703754 100644 --- a/src/util.c +++ b/src/util.c @@ -1,7 +1,7 @@ /* * util.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -433,7 +433,11 @@ int reg_match(char *string, char *pattern) int result; regex_t reg; - regcomp(®, pattern, REG_EXTENDED | REG_NOSUB); + if (regcomp(®, pattern, REG_EXTENDED | REG_NOSUB | REG_ICASE) != 0) + { + fprintf(stderr, "error: %s is not a valid regular expression.\n", pattern); + exit(1); + } result = regexec(®, string, 0, 0, 0); regfree(®); return(!(result)); diff --git a/src/util.h b/src/util.h index 2098277d..2f58e387 100644 --- a/src/util.h +++ b/src/util.h @@ -1,7 +1,7 @@ /* * util.h * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/vercmp.c b/src/vercmp.c index 0ed3da2e..8cb7a827 100644 --- a/src/vercmp.c +++ b/src/vercmp.c @@ -1,7 +1,7 @@ /* * vercmp.c * - * Copyright (c) 2002-2005 by Judd Vinet + * Copyright (c) 2002-2006 by Judd Vinet * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by -- cgit v1.2.3-24-g4f1b