diff options
54 files changed, 1097 insertions, 951 deletions
| diff --git a/config.guess b/config.guess index 951383e3..f2a0acfb 100755 --- a/config.guess +++ b/config.guess @@ -1,10 +1,10 @@  #! /bin/sh  # Attempt to guess a canonical system name.  #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -#   Inc. +#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +#   Free Software Foundation, Inc. -timestamp='2007-05-17' +timestamp='2008-01-23'  # This file is free software; you can redistribute it and/or modify it  # under the terms of the GNU General Public License as published by @@ -56,8 +56,8 @@ version="\  GNU config.guess ($timestamp)  Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -330,7 +330,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in      sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)  	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`  	exit ;; -    i86pc:SunOS:5.*:* | ix86xen:SunOS:5.*:*) +    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)  	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`  	exit ;;      sun4*:SunOS:6*:*) @@ -532,7 +532,7 @@ EOF  		echo rs6000-ibm-aix3.2  	fi  	exit ;; -    *:AIX:*:[45]) +    *:AIX:*:[456])  	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`  	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then  		IBM_ARCH=rs6000 @@ -793,12 +793,15 @@ EOF  	exit ;;      *:Interix*:[3456]*)      	case ${UNAME_MACHINE} in -	    x86)  +	    x86)  		echo i586-pc-interix${UNAME_RELEASE}  		exit ;;  	    EM64T | authenticamd)  		echo x86_64-unknown-interix${UNAME_RELEASE}  		exit ;; +	    IA64) +		echo ia64-unknown-interix${UNAME_RELEASE} +		exit ;;  	esac ;;      [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)  	echo i${UNAME_MACHINE}-pc-mks @@ -833,7 +836,14 @@ EOF  	echo ${UNAME_MACHINE}-pc-minix  	exit ;;      arm*:Linux:*:*) -	echo ${UNAME_MACHINE}-unknown-linux-gnu +	eval $set_cc_for_build +	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ +	    | grep -q __ARM_EABI__ +	then +	    echo ${UNAME_MACHINE}-unknown-linux-gnu +	else +	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi +	fi  	exit ;;      avr32*:Linux:*:*)  	echo ${UNAME_MACHINE}-unknown-linux-gnu @@ -954,8 +964,8 @@ EOF      x86_64:Linux:*:*)  	echo x86_64-unknown-linux-gnu  	exit ;; -    xtensa:Linux:*:*) -    	echo xtensa-unknown-linux-gnu +    xtensa*:Linux:*:*) +	echo ${UNAME_MACHINE}-unknown-linux-gnu  	exit ;;      i*86:Linux:*:*)  	# The BFD linker knows what the default object file format is, so @@ -1474,9 +1484,9 @@ This script, last modified $timestamp, has failed to recognize  the operating system you are using. It is advised that you  download the most up to date version of the config scripts from -  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess +  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD  and -  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub +  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD  If the version you run ($0) is already up to date, please  send the following data and any information you think might be @@ -1,10 +1,10 @@  #! /bin/sh  # Configuration validation subroutine script.  #   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, -#   Inc. +#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +#   Free Software Foundation, Inc. -timestamp='2007-04-29' +timestamp='2008-01-16'  # This file is (in principle) common to ALL GNU software.  # The presence of a machine in this file suggests that SOME GNU software @@ -72,8 +72,8 @@ Report bugs and patches to <config-patches@gnu.org>."  version="\  GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -369,10 +369,14 @@ case $basic_machine in  	| v850-* | v850e-* | vax-* \  	| we32k-* \  	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ -	| xstormy16-* | xtensa-* \ +	| xstormy16-* | xtensa*-* \  	| ymp-* \  	| z8k-*)  		;; +	# Recognize the basic CPU types without company name, with glob match. +	xtensa*) +		basic_machine=$basic_machine-unknown +		;;  	# Recognize the various machine names and aliases which stand  	# for a CPU type and a company and sometimes even an OS.  	386bsd) @@ -443,6 +447,14 @@ case $basic_machine in  		basic_machine=ns32k-sequent  		os=-dynix  		;; +	blackfin) +		basic_machine=bfin-unknown +		os=-linux +		;; +	blackfin-*) +		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` +		os=-linux +		;;  	c90)  		basic_machine=c90-cray  		os=-unicos @@ -475,8 +487,8 @@ case $basic_machine in  		basic_machine=craynv-cray  		os=-unicosmp  		;; -	cr16c) -		basic_machine=cr16c-unknown +	cr16) +		basic_machine=cr16-unknown  		os=-elf  		;;  	crds | unos) @@ -668,6 +680,14 @@ case $basic_machine in  		basic_machine=m68k-isi  		os=-sysv  		;; +	m68knommu) +		basic_machine=m68k-unknown +		os=-linux +		;; +	m68knommu-*) +		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` +		os=-linux +		;;  	m88k-omron*)  		basic_machine=m88k-omron  		;; @@ -813,6 +833,14 @@ case $basic_machine in  		basic_machine=i860-intel  		os=-osf  		;; +	parisc) +		basic_machine=hppa-unknown +		os=-linux +		;; +	parisc-*) +		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` +		os=-linux +		;;  	pbd)  		basic_machine=sparc-tti  		;; @@ -1021,6 +1049,10 @@ case $basic_machine in  		basic_machine=tic6x-unknown  		os=-coff  		;; +	tile*) +		basic_machine=tile-unknown +		os=-linux-gnu +		;;  	tx39)  		basic_machine=mipstx39-unknown  		;; diff --git a/configure.ac b/configure.ac index 9587f37b..0b7769dc 100644 --- a/configure.ac +++ b/configure.ac @@ -129,7 +129,6 @@ AC_PROG_CC_C99  AC_PROG_INSTALL  AC_PROG_LN_S  AC_PROG_MAKE_SET -AC_PROG_RANLIB  AC_PROG_LIBTOOL  AC_CHECK_PROGS([PYTHON], [python2.5 python2.4 python], [false]) diff --git a/contrib/.gitignore b/contrib/.gitignore deleted file mode 100644 index e69de29b..00000000 --- a/contrib/.gitignore +++ /dev/null diff --git a/contrib/Makefile.am b/contrib/Makefile.am index 9f01e187..7654848f 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -1,9 +1,11 @@  EXTRA_DIST = \  	PKGBUILD.vim \  	bash_completion \ +	gensync \  	pacdiff \  	pacsearch \  	re-pacman \ +	updatesync \  	vimproject \  	wget-xdelta.sh \  	zsh_completion \ diff --git a/contrib/README b/contrib/README index c9ff86f4..0edeaf7d 100644 --- a/contrib/README +++ b/contrib/README @@ -25,3 +25,7 @@ may need to be updated).  wget-xdelta.sh - A download script for pacman which allows binary deltas  generated with makepkg to be used instead of downloading full binary packages.  This should cut download sizes for some package upgrades significantly. + +gensync, updatesync - The former repository management scripts that have since +been superseded by repo-add and repo-remove. They are here for posterity's +sake, and to show how repo-add and repo-remove can be wrapped in other scripts. diff --git a/contrib/bash_completion b/contrib/bash_completion index 77192858..7f5d1b08 100644 --- a/contrib/bash_completion +++ b/contrib/bash_completion @@ -187,6 +187,7 @@ _pacman ()            dbonly) mod="${mod}k" ;;            nosave) mod="${mod}n" ;;            recursive) mod="${mod}s" ;; +          unneeded) mod="${mod}u" ;;          esac ;;        *) toparse="${a}" ;;      esac @@ -219,6 +220,7 @@ _pacman ()        A|U)          COMPREPLY=( $( compgen -W '\            --asdeps \ +          --asexplicit \            -d --nodeps \            -f --force \            -h --help \ @@ -242,6 +244,7 @@ _pacman ()            -k --dbonly \            -n --nosave \            -s --recursive \ +          -u --unneeded \            --config \            --logfile \            --noconfirm \ @@ -257,6 +260,7 @@ _pacman ()        S)          COMPREPLY=( $( compgen -W '\            --asdeps \ +          --asexplicit \            -c --clean \            -d --nodeps \            -e --dependsonly \ diff --git a/scripts/gensync.sh.in b/contrib/gensync index d5dec275..51d32ceb 100644..100755 --- a/scripts/gensync.sh.in +++ b/contrib/gensync @@ -1,7 +1,6 @@  #!/bin/bash  #  #   gensync -#   @configure_input@  #  #   Copyright (c) 2002-2007 by Judd Vinet <jvinet@zeroflux.org>  # @@ -19,42 +18,35 @@  #   along with this program.  If not, see <http://www.gnu.org/licenses/>.  # -# gettext initialization -export TEXTDOMAIN='pacman' -export TEXTDOMAINDIR='@localedir@' - -myver='@PACKAGE_VERSION@' +myver='3.1.1'  # functions  usage() {  	printf "gensync (pacman) %s\n\n" "$myver" -	printf "$(gettext "Usage: %s <root> <destfile> [package_directory]")\n\n" "$0" -	printf "$(gettext "\ -NOTE: this script is DEPRECATED. It will be removed in the next major\n\ -release of pacman, so please use repo-add and repo-remove instead.\n\n")" -	printf "$(gettext "\ +	printf "Usage: %s <root> <destfile> [package_directory]\n\n" "$0" +	printf "\  gensync will generate a sync database by reading all PKGBUILD files\n\  from <root>. gensync builds the database in a temporary directory\n\ -and then compresses it to <destfile>.\n\n")" -	printf "$(gettext "\ +and then compresses it to <destfile>.\n\n" +	printf "\  gensync will calculate md5sums of packages in the same directory as\n\ -<destfile>, unless an alternate [package_directory] is specified.\n\n")" -	printf "$(gettext "\ +<destfile>, unless an alternate [package_directory] is specified.\n\n" +	printf "\  note: The <destfile> name is important. It must be of the form\n\        {treename}.db.tar.gz where {treename} is the name of the custom\n\        package repository you configured in /etc/pacman.conf. The\n\        generated database must reside in the same directory as your\n\ -      custom packages (also configured in /etc/pacman.conf)\n\n")" -	echo "$(gettext "Example:  gensync /var/abs/local /home/mypkgs/custom.db.tar.gz")" +      custom packages (also configured in /etc/pacman.conf)\n\n" +	echo "Example:  gensync /var/abs/local /home/mypkgs/custom.db.tar.gz"  }  version() {  	printf "gensync (pacman) %s\n" "$myver" -	printf "$(gettext "\ +	printf "\  Copyright (C) 2002-2007 Judd Vinet <jvinet@zeroflux.org>.\n\n\  This is free software; see the source for copying conditions.\n\ -There is NO WARRANTY, to the extent permitted by law.\n")" +There is NO WARRANTY, to the extent permitted by law.\n"  }  error () { @@ -67,26 +59,8 @@ die () {  	exit 1  } -check_force () { -	local i -	for i in ${options[@]}; do -		local lc=$(echo $i | tr [:upper:] [:lower:]) -		if [ "$lc" = "force" ]; then -			true -		fi -	done -	false -} -  # PROGRAM START -# determine whether we have gettext; make it a no-op if we do not -if [ ! $(type -t gettext) ]; then -	gettext() { -		echo "$@" -	} -fi -  if [ "$1" = "-h" -o "$1" = "--help" ]; then  	usage  	exit 0 @@ -103,10 +77,10 @@ if [ $# -lt 2 ]; then  fi  # source system and user makepkg.conf -if [ -r @sysconfdir@/makepkg.conf ]; then -	source @sysconfdir@/makepkg.conf +if [ -r /etc/makepkg.conf ]; then +	source /etc/makepkg.conf  else -	die "$(gettext "%s not found. Can not continue.")" "@sysconfdir@/makepkg.conf" +	die "/etc/makepkg.conf not found. Cannot continue."  fi  if [ -r ~/.makepkg.conf ]; then @@ -124,22 +98,17 @@ if [ "$3" != "" ]; then  	pkgdir="$3"  fi -[ ! -d "$rootdir" ] && die "$(gettext "invalid root dir: %s")" $rootdir - -printf "$(gettext "\ -NOTE: this script is DEPRECATED. It will be removed in the next major\n\ -release of pacman, so please use repo-add and repo-remove instead.\n\n")" +[ ! -d "$rootdir" ] && die "invalid root dir: $rootdir" -echo "$(gettext "gensync: building database entries, generating md5sums...")" >&2 +echo "gensync: building database entries, generating md5sums..." >&2  cd "$destdir"  pkgs="" -forcepkgs=""  for file in $(find "$rootdir"/* -name "$BUILDSCRIPT"); do  	unset pkgname pkgver pkgrel options -	source $file || die "$(gettext "failed to parse %s")" $file +	source $file || die "failed to parse $file"  	if [ "$arch" = 'any' ]; then  		CARCH='any'  	fi @@ -150,20 +119,16 @@ for file in $(find "$rootdir"/* -name "$BUILDSCRIPT"); do  	fi  	if [ ! -f "$pkgfile" ]; then -		error "$(gettext "could not find %s-%s-%s-%s%s - skipping")" $pkgname $pkgver $pkgrel $CARCH $PKGEXT +		error "could not find %s-%s-%s-%s%s - skipping" $pkgname $pkgver $pkgrel $CARCH $PKGEXT  	else -		if check_force; then -			forcepkgs="$forcepkgs $pkgfile" -		else -			pkgs="$pkgs $pkgfile" -		fi +		pkgs="$pkgs $pkgfile"  	fi  done -echo "$(gettext "creating repo DB...")" +echo "creating repo DB..."  # we'll trim the output just a tad, as gensync may be used on large repos -repo-add $destfile $pkgs --force $force_pkgs \ +repo-add $destfile $pkgs \  		| grep -e "package" -e "database"  # vim: set ts=2 sw=2 noet: diff --git a/scripts/updatesync.sh.in b/contrib/updatesync index 5f5cc6c9..f88e8237 100644..100755 --- a/scripts/updatesync.sh.in +++ b/contrib/updatesync @@ -1,7 +1,6 @@  #!/bin/bash  #  #   updatesync -#   @configure_input@  #  #   Copyright (c) 2004 by Jason Chu <jason@archlinux.org>  #   Derived from gensync (c) 2002-2006 Judd Vinet <jvinet@zeroflux.org> @@ -20,40 +19,33 @@  #   along with this program.  If not, see <http://www.gnu.org/licenses/>.  # -# gettext initialization -export TEXTDOMAIN='pacman' -export TEXTDOMAINDIR='@localedir@' - -myver='@PACKAGE_VERSION@' +myver='3.1.1'  # functions  usage() {  	printf "updatesync (pacman) %s\n\n" "$myver" -	printf "$(gettext "Usage: %s <action> <destfile> <option> [package_directory]")\n\n" "$0" -	printf "$(gettext "\ -NOTE: this script is DEPRECATED. It will be removed in the next major\n\ -release of pacman, so please use repo-add and repo-remove instead.\n\n")" -	printf "$(gettext "\ +	printf "Usage: %s <action> <destfile> <option> [package_directory]\n\n" "$0" +	printf "\  updatesync will update a sync database by reading a PKGBUILD and\n\  modifying the destfile. updatesync updates the database in a temporary\n\ -directory and then compresses it to <destfile>.\n\n")" -	printf "$(gettext "There are two types of actions:\n\n")" -	printf "$(gettext "upd - Will update a package's entry or create it if it doesn't exist.\n      It takes the package's PKGBUILD as an option.\n")" -	printf "$(gettext "del - Will remove a package's entry from the db. It takes the package's\n      name as an option.\n")" +directory and then compresses it to <destfile>.\n\n" +	printf "There are two types of actions:\n\n" +	printf "upd - Will update a package's entry or create it if it doesn't exist.\n      It takes the package's PKGBUILD as an option.\n" +	printf "del - Will remove a package's entry from the db. It takes the package's\n      name as an option.\n"  	echo -	printf "$(gettext "\ +	printf "\  updatesync will calculate md5sums of packages in the same directory as\n\ -<destfile>, unless an alternate [package_directory] is specified.\n\n")" -	echo "$(gettext "Example:  updatesync upd /home/mypkgs/custom.db.tar.gz PKGBUILD")" +<destfile>, unless an alternate [package_directory] is specified.\n\n" +	echo "Example:  updatesync upd /home/mypkgs/custom.db.tar.gz PKGBUILD"  }  version() {  	printf "updatesync (pacman) %s\n" "$myver" -	printf "$(gettext "\ +	printf "\  Copyright (C) 2004 Jason Chu <jason@archlinux.org>.\n\n\  This is free software; see the source for copying conditions.\n\ -There is NO WARRANTY, to the extent permitted by law.\n")" +There is NO WARRANTY, to the extent permitted by law.\n"  }  error () { @@ -66,26 +58,8 @@ die () {  	exit 1  } -check_force () { -	local i -	for i in ${options[@]}; do -		local lc=$(echo $i | tr [:upper:] [:lower:]) -		if [ "$lc" = "force" ]; then -			true -		fi -	done -	false -} -  # PROGRAM START -# determine whether we have gettext; make it a no-op if we do not -if [ ! $(type -t gettext) ]; then -	gettext() { -		echo "$@" -	} -fi -  if [ "$1" = "-h" -o "$1" = "--help" ]; then  	usage  	exit 0 @@ -102,10 +76,10 @@ if [ $# -lt 3 ]; then  fi  # source system and user makepkg.conf -if [ -r @sysconfdir@/makepkg.conf ]; then -	source @sysconfdir@/makepkg.conf +if [ -r /etc/makepkg.conf ]; then +	source /etc/makepkg.conf  else -	die "$(gettext "%s not found. Can not continue.")" "@sysconfdir@/makepkg.conf" +	die "/etc/makepkg.conf not found. Cannot continue."  fi  if [ -r ~/.makepkg.conf ]; then @@ -124,39 +98,30 @@ pkgdir="$(pwd)"  if [ "$4" != "" ]; then  	pkgdir="$4"  fi -opt_force="" - -printf "$(gettext "\ -NOTE: this script is DEPRECATED. It will be removed in the next major\n\ -release of pacman, so please use repo-add and repo-remove instead.\n\n")"  if [ "$action" = "upd" ]; then # INSERT / UPDATE  	if [ ! -f "$option" ]; then -		die "$(gettext "%s not found")" $option +		die "$option not found"  	fi  	unset pkgname pkgver pkgrel options -	source $option || die "$(gettext "failed to parse %s")" $option +	source $option || die "failed to parse $option"  	if [ "$arch" = 'any' ]; then  		CARCH='any'  	fi  	pkgfile="$pkgdir/$pkgname-$pkgver-$pkgrel-${CARCH}${PKGEXT}"  	if [ ! -f "$pkgfile" ]; then -		die "$(gettext "could not find %s-%s-%s-%s%s - aborting")" $pkgname $pkgver $pkgrel $CARCH $PKGEXT -	fi - -	if check_force; then -		opt_force="--force" +		die "could not find %s-%s-%s-%s%s - aborting" $pkgname $pkgver $pkgrel $CARCH $PKGEXT  	fi -	repo-add "$pkgdb" $opt_force "$pkgfile" +	repo-add "$pkgdb" "$pkgfile"  else # DELETE  	fname="$(basename $option)"  	if [ "$fname" = "PKGBUILD" ]; then  		if [ ! -f "$option" ]; then -			die "$(gettext "%s not found")" $option +			die "%s not found" $option  		fi  		unset pkgname pkgver pkgrel options diff --git a/contrib/zsh_completion b/contrib/zsh_completion index 8dec06df..e5ad92b7 100644 --- a/contrib/zsh_completion +++ b/contrib/zsh_completion @@ -91,6 +91,7 @@ _pacman_opts_sync_modifiers=(  	'*--ignoregroup[Ignore a group upgrade]:package group:  		_pacman_completions_all_groups'  	'--asdeps[Install packages as non-explicitly installed]' +	'--asexplicit[Install packages as explicitly installed]'  )  # handles --action subcommand diff --git a/doc/Doxyfile b/doc/Doxyfile index 5174c651..3aea8944 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.5.2 +# Doxyfile 1.5.5  #---------------------------------------------------------------------------  # Project related configuration options @@ -29,6 +29,7 @@ STRIP_FROM_PATH        =  STRIP_FROM_INC_PATH    =   SHORT_NAMES            = NO  JAVADOC_AUTOBRIEF      = NO +QT_AUTOBRIEF           = NO  MULTILINE_CPP_IS_BRIEF = NO  DETAILS_AT_TOP         = NO  INHERIT_DOCS           = YES @@ -37,10 +38,14 @@ TAB_SIZE               = 4  ALIASES                =   OPTIMIZE_OUTPUT_FOR_C  = YES  OPTIMIZE_OUTPUT_JAVA   = NO +OPTIMIZE_FOR_FORTRAN   = NO +OPTIMIZE_OUTPUT_VHDL   = NO  BUILTIN_STL_SUPPORT    = NO  CPP_CLI_SUPPORT        = NO +SIP_SUPPORT            = NO  DISTRIBUTE_GROUP_DOC   = NO  SUBGROUPING            = YES +TYPEDEF_HIDES_STRUCT   = NO  #---------------------------------------------------------------------------  # Build related configuration options  #--------------------------------------------------------------------------- @@ -49,6 +54,7 @@ EXTRACT_PRIVATE        = NO  EXTRACT_STATIC         = NO  EXTRACT_LOCAL_CLASSES  = YES  EXTRACT_LOCAL_METHODS  = NO +EXTRACT_ANON_NSPACES   = NO  HIDE_UNDOC_MEMBERS     = NO  HIDE_UNDOC_CLASSES     = NO  HIDE_FRIEND_COMPOUNDS  = NO @@ -60,6 +66,7 @@ SHOW_INCLUDE_FILES     = YES  INLINE_INFO            = YES  SORT_MEMBER_DOCS       = YES  SORT_BRIEF_DOCS        = NO +SORT_GROUP_NAMES       = NO  SORT_BY_SCOPE_NAME     = NO  GENERATE_TODOLIST      = YES  GENERATE_TESTLIST      = YES @@ -126,6 +133,10 @@ HTML_FOOTER            =  HTML_STYLESHEET        =   HTML_ALIGN_MEMBERS     = YES  GENERATE_HTMLHELP      = NO +GENERATE_DOCSET        = NO +DOCSET_FEEDNAME        = "Doxygen generated docs" +DOCSET_BUNDLE_ID       = org.doxygen.Project +HTML_DYNAMIC_SECTIONS  = NO  CHM_FILE               =   HHC_LOCATION           =   GENERATE_CHI           = NO @@ -194,7 +205,9 @@ EXPAND_ONLY_PREDEF     = YES  SEARCH_INCLUDES        = YES  INCLUDE_PATH           = ../..  INCLUDE_FILE_PATTERNS  = *.h -PREDEFINED             = HAVE_CONFIG_H= SYMHIDDEN= SYMEXPORT= +PREDEFINED             = HAVE_CONFIG_H= \ +                         SYMHIDDEN= \ +                         SYMEXPORT=  EXPAND_AS_DEFINED      =   SKIP_FUNCTION_MACROS   = YES  #--------------------------------------------------------------------------- @@ -227,6 +240,7 @@ DOT_IMAGE_FORMAT       = png  DOT_PATH               =   DOTFILE_DIRS           =   DOT_GRAPH_MAX_NODES    = 50 +MAX_DOT_GRAPH_DEPTH    = 3  DOT_TRANSPARENT        = NO  DOT_MULTI_TARGETS      = NO  GENERATE_LEGEND        = YES diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt index f6eb69c3..8a3f675d 100644 --- a/doc/pacman.8.txt +++ b/doc/pacman.8.txt @@ -86,11 +86,16 @@ You can also use `pacman -Su` to upgrade all packages that are out of date. See  Options  -------  *\--asdeps*:: -	Install packages non-explicitly; in other works, fake their install reason +	Install packages non-explicitly; in other words, fake their install reason  	to be installed as a dependency. This is useful for makepkg and other  	build from source tools that need to install dependencies before building  	the package. +*\--asexplicit*:: +	Install packages explicitly; in other words, fake their install reason to +	be explicitly installed. This is useful if you want mark a dependency as +	explictly installed. +  *-b, \--dbpath* <'path'>::  	Specify an alternative database location (a typical default is  	``/var/lib/pacman'').  This should not be used unless you know what you are @@ -228,6 +233,11 @@ Remove Options[[RO]]  	to a backwards '\--sync' operation, and helps keep a clean system without  	orphans. +*-u, \--unneeded*:: +	Removes the targets that are not required by any other packages. +	This is mostly useful when removing a group without using the '-c' option, +	to avoid breaking any dependencies. +  Sync Options[[SO]]  ------------------ diff --git a/doc/repo-add.8.txt b/doc/repo-add.8.txt index 5664949f..80faef46 100644 --- a/doc/repo-add.8.txt +++ b/doc/repo-add.8.txt @@ -16,7 +16,7 @@ repo-add - package database maintenance utility  Synopsis  -------- -repo-add <path-to-db> [--force] <package> ... +repo-add <path-to-db> <package> ...  repo-remove <path-to-db> <packagename> ... @@ -34,16 +34,6 @@ specified on the command line. Multiple packages to remove can be specified  on the command line. -Options -------- -*--force* (repo-add only):: -	Add a force entry to the sync database, which tells pacman to skip version -	number comparison and update the package regardless. This flag can be -	specified in the middle of the command line, with any packages listed -	before the flag being added as normal entries, and any specified after -	being marked as force upgrades. - -  See Also  --------  linkman:makepkg[8], linkman:pacman[8] diff --git a/lib/libalpm/Makefile.am b/lib/libalpm/Makefile.am index 6549066f..6f166bfa 100644 --- a/lib/libalpm/Makefile.am +++ b/lib/libalpm/Makefile.am @@ -28,6 +28,7 @@ libalpm_la_SOURCES = \  	delta.h delta.c \  	deps.h deps.c \  	error.h error.c \ +	graph.h \  	group.h group.c \  	handle.h handle.c \  	log.h log.c \ diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index eddf637e..6c0a1eae 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -79,30 +79,22 @@ int _alpm_add_loadtarget(pmtrans_t *trans, pmdb_t *db, char *name)  	/* check if an older version of said package is already in transaction  	 * packages.  if so, replace it in the list */  	for(i = trans->packages; i; i = i->next) { -		pmpkg_t *pkg = i->data; -		if(strcmp(pkg->name, pkgname) == 0) { -			if(_alpm_versioncmp(pkg->version, pkgver) < 0) { -				pmpkg_t *newpkg; +		pmpkg_t *transpkg = i->data; +		if(strcmp(transpkg->name, pkgname) == 0) { +			if(_alpm_versioncmp(transpkg->version, pkgver) < 0) {  				_alpm_log(PM_LOG_WARNING, _("replacing older version %s-%s by %s in target list\n"), -				          pkg->name, pkg->version, pkgver); -				if((newpkg = _alpm_pkg_load(name, 1)) == NULL) { -					/* pm_errno is already set by pkg_load() */ -					goto error; -				} +				          transpkg->name, transpkg->version, pkgver);  				_alpm_pkg_free(i->data); -				i->data = newpkg; +				i->data = pkg;  			} else { -				_alpm_log(PM_LOG_WARNING, _("newer version %s-%s is in the target list -- skipping\n"), -				          pkg->name, pkg->version); +				_alpm_log(PM_LOG_WARNING, _("skipping %s-%s because newer version %s is in the target list\n"), +				          pkgname, pkgver, transpkg->version); +				_alpm_pkg_free(pkg);  			}  			return(0);  		}  	} -	if(trans->flags & PM_TRANS_FLAG_ALLDEPS) { -		pkg->reason = PM_PKG_REASON_DEPEND; -	} -  	/* add the package to the transaction */  	trans->packages = alpm_list_add(trans->packages, pkg); @@ -143,7 +135,8 @@ int _alpm_add_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data)  			if(data) {  				*data = lp;  			} else { -				FREELIST(lp); +				alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free); +				alpm_list_free(lp);  			}  			RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1);  		} @@ -193,7 +186,8 @@ int _alpm_add_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data)  			if(data) {  				*data = lp;  			} else { -				FREELIST(lp); +				alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_fileconflict_free); +				alpm_list_free(lp);  			}  			RET_ERR(PM_ERR_FILE_CONFLICTS, -1);  		} @@ -667,12 +661,8 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		/* we'll need to save some record for backup checks later */  		oldpkg = _alpm_pkg_dup(local); -		/* copy over the install reason (unless alldeps is set) */ -	if(trans->flags & PM_TRANS_FLAG_ALLDEPS) { -		newpkg->reason = PM_PKG_REASON_DEPEND; -	} else { +		/* copy over the install reason */  		newpkg->reason = alpm_pkg_get_reason(local); -	}  		/* pre_upgrade scriptlet */  		if(alpm_pkg_has_scriptlet(newpkg) && !(trans->flags & PM_TRANS_FLAG_NOSCRIPTLET)) { @@ -693,6 +683,13 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		}  	} +	/* we override any pre-set reason if we have alldeps or allexplicit set */ +	if(trans->flags & PM_TRANS_FLAG_ALLDEPS) { +		newpkg->reason = PM_PKG_REASON_DEPEND; +	} else if(trans->flags & PM_TRANS_FLAG_ALLEXPLICIT) { +		newpkg->reason = PM_PKG_REASON_EXPLICIT; +	} +  	if(oldpkg) {  		/* set up fake remove transaction */  		int ret = upgrade_remove(oldpkg, newpkg, trans, db); diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 4797fcfa..a6807191 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -52,7 +52,6 @@ typedef struct __pmdepend_t pmdepend_t;  typedef struct __pmdepmissing_t pmdepmissing_t;  typedef struct __pmconflict_t pmconflict_t;  typedef struct __pmfileconflict_t pmfileconflict_t; -typedef struct __pmgraph_t pmgraph_t;  /*   * Library @@ -246,16 +245,9 @@ const alpm_list_t *alpm_grp_get_pkgs(const pmgrp_t *grp);   * Sync   */ -/* Types */ -typedef enum _pmsynctype_t { -	PM_SYNC_TYPE_REPLACE = 1, -	PM_SYNC_TYPE_UPGRADE, -	PM_SYNC_TYPE_DEPEND -} pmsynctype_t; - -pmsynctype_t alpm_sync_get_type(const pmsyncpkg_t *sync);  pmpkg_t *alpm_sync_get_pkg(const pmsyncpkg_t *sync); -void *alpm_sync_get_data(const pmsyncpkg_t *sync); +alpm_list_t *alpm_sync_get_removes(const pmsyncpkg_t *sync); +pmpkg_t *alpm_sync_newversion(pmpkg_t *pkg, alpm_list_t *dbs_sync);  int alpm_sync_sysupgrade(pmdb_t *db_local,  		alpm_list_t *dbs_sync, alpm_list_t **syncpkgs); @@ -287,7 +279,9 @@ typedef enum _pmtransflag_t {  	PM_TRANS_FLAG_NOSCRIPTLET = 0x400,  	PM_TRANS_FLAG_NOCONFLICTS = 0x800,  	PM_TRANS_FLAG_PRINTURIS = 0x1000, -	PM_TRANS_FLAG_NEEDED = 0x2000 +	PM_TRANS_FLAG_NEEDED = 0x2000, +	PM_TRANS_FLAG_ALLEXPLICIT = 0x4000, +	PM_TRANS_FLAG_UNNEEDED = 0x8000  } pmtransflag_t;  /* Transaction Events */ @@ -377,13 +371,16 @@ typedef enum _pmdepmod_t {  	PM_DEP_MOD_LT  } pmdepmod_t; -pmdepend_t *alpm_splitdep(const char *depstring);  int alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep);  alpm_list_t *alpm_checkdeps(pmdb_t *db, int reversedeps,  		alpm_list_t *remove, alpm_list_t *upgrade); +alpm_list_t *alpm_deptest(pmdb_t *db, alpm_list_t *targets);  const char *alpm_miss_get_target(const pmdepmissing_t *miss);  pmdepend_t *alpm_miss_get_dep(pmdepmissing_t *miss); +const char *alpm_miss_get_causingpkg(const pmdepmissing_t *miss); + +alpm_list_t *alpm_checkdbconflicts(pmdb_t *db_local);  const char *alpm_conflict_get_package1(pmconflict_t *conflict);  const char *alpm_conflict_get_package2(pmconflict_t *conflict); diff --git a/lib/libalpm/alpm_list.h b/lib/libalpm/alpm_list.h index ae373910..057b6b5c 100644 --- a/lib/libalpm/alpm_list.h +++ b/lib/libalpm/alpm_list.h @@ -19,6 +19,8 @@  #ifndef _ALPM_LIST_H  #define _ALPM_LIST_H +#include <stdlib.h> /* size_t */ +  #ifdef __cplusplus  extern "C" {  #endif diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c index 4cd0985e..d3ec89a4 100644 --- a/lib/libalpm/be_files.c +++ b/lib/libalpm/be_files.c @@ -106,7 +106,7 @@ void _alpm_db_rewind(pmdb_t *db)  	rewinddir(db->handle);  } -static int _alpm_db_splitname(const char *target, char *name, char *version) +static int splitname(const char *target, pmpkg_t *pkg)  {  	/* the format of a db entry is as follows:  	 *    package-version-rel/ @@ -115,10 +115,10 @@ static int _alpm_db_splitname(const char *target, char *name, char *version)  	 */  	char *tmp, *p, *q; -	if(target == NULL) { +	if(target == NULL || pkg == NULL) {  		return(-1);  	} -	tmp = strdup(target); +	STRDUP(tmp, target, RET_ERR(PM_ERR_MEMORY, -1));  	p = tmp + strlen(tmp);  	/* do the magic parsing- find the beginning of the version string @@ -130,14 +130,16 @@ static int _alpm_db_splitname(const char *target, char *name, char *version)  	}  	/* copy into fields and return */ -	if(version) { -		strncpy(version, p+1, PKG_VERSION_LEN); +	if(pkg->version) { +		FREE(pkg->version);  	} +	STRDUP(pkg->version, p+1, RET_ERR(PM_ERR_MEMORY, -1));  	/* insert a terminator at the end of the name (on hyphen)- then copy it */  	*p = '\0'; -	if(name) { -		strncpy(name, tmp, PKG_NAME_LEN); +	if(pkg->name) { +		FREE(pkg->name);  	} +	STRDUP(pkg->name, tmp, RET_ERR(PM_ERR_MEMORY, -1));  	free(tmp);  	return(0); @@ -148,7 +150,6 @@ pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target)  	struct dirent *ent = NULL;  	struct stat sbuf;  	char path[PATH_MAX]; -	char name[PKG_FULLNAME_LEN];  	char *ptr = NULL;  	int found = 0;  	pmpkg_t *pkg = NULL; @@ -168,7 +169,9 @@ pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target)  			/* search for a specific package (by name only) */  			rewinddir(db->handle);  			while(!found && (ent = readdir(db->handle)) != NULL) { -				if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { +				char *name; + +				if(strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) {  					continue;  				}  				/* stat the entry, make sure it's a directory */ @@ -176,7 +179,9 @@ pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target)  				if(stat(path, &sbuf) || !S_ISDIR(sbuf.st_mode)) {  					continue;  				} -				strncpy(name, ent->d_name, PKG_FULLNAME_LEN); + +				STRDUP(name, ent->d_name, return(NULL)); +  				/* truncate the string at the second-to-last hyphen, */  				/* which will give us the package name */  				if((ptr = rindex(name, '-'))) { @@ -185,10 +190,12 @@ pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target)  				if((ptr = rindex(name, '-'))) {  					*ptr = '\0';  				} -				if(!strcmp(name, target)) { +				if(strcmp(name, target) == 0) {  					found = 1;  				} +				FREE(name);  			} +  			if(!found) {  				return(NULL);  			} @@ -199,7 +206,7 @@ pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target)  				if(ent == NULL) {  					return(NULL);  				} -				if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { +				if(strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) {  					isdir = 0;  					continue;  				} @@ -217,7 +224,7 @@ pmpkg_t *_alpm_db_scan(pmdb_t *db, const char *target)  			return(NULL);  		}  		/* split the db entry name */ -		if(_alpm_db_splitname(ent->d_name, pkg->name, pkg->version) != 0) { +		if(splitname(ent->d_name, pkg) != 0) {  			_alpm_log(PM_LOG_ERROR, _("invalid name for database entry '%s'\n"),  					ent->d_name);  			alpm_pkg_free(pkg); @@ -251,7 +258,7 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  		RET_ERR(PM_ERR_DB_NULL, -1);  	} -	if(info == NULL || info->name[0] == 0 || info->version[0] == 0) { +	if(info == NULL || info->name == NULL || info->version == NULL) {  		_alpm_log(PM_LOG_DEBUG, "invalid package entry provided to _alpm_db_read, skipping\n");  		return(-1);  	} @@ -296,120 +303,115 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  				break;  			}  			_alpm_strtrim(line); -			if(!strcmp(line, "%FILENAME%")) { -				if(fgets(info->filename, sizeof(info->filename), fp) == NULL) { +			if(strcmp(line, "%FILENAME%") == 0) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(info->filename); -		  } else if(!strcmp(line, "%DESC%")) { -				if(fgets(info->desc, sizeof(info->desc), fp) == NULL) { +				STRDUP(info->filename, _alpm_strtrim(line), goto error); +		  } else if(strcmp(line, "%DESC%") == 0) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(info->desc); -			} else if(!strcmp(line, "%GROUPS%")) { +				STRDUP(info->desc, _alpm_strtrim(line), goto error); +			} else if(strcmp(line, "%GROUPS%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->groups = alpm_list_add(info->groups, strdup(line)); +					char *linedup; +					STRDUP(linedup, _alpm_strtrim(line), goto error); +					info->groups = alpm_list_add(info->groups, linedup);  				} -			} else if(!strcmp(line, "%URL%")) { -				if(fgets(info->url, sizeof(info->url), fp) == NULL) { +			} else if(strcmp(line, "%URL%") == 0) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(info->url); -			} else if(!strcmp(line, "%LICENSE%")) { +				STRDUP(info->url, _alpm_strtrim(line), goto error); +			} else if(strcmp(line, "%LICENSE%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->licenses = alpm_list_add(info->licenses, strdup(line)); +					char *linedup; +					STRDUP(linedup, _alpm_strtrim(line), goto error); +					info->licenses = alpm_list_add(info->licenses, linedup);  				} -			} else if(!strcmp(line, "%ARCH%")) { -				if(fgets(info->arch, sizeof(info->arch), fp) == NULL) { +			} else if(strcmp(line, "%ARCH%") == 0) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(info->arch); -			} else if(!strcmp(line, "%BUILDDATE%")) { -				char tmp[32]; -				if(fgets(tmp, sizeof(tmp), fp) == NULL) { +				STRDUP(info->arch, _alpm_strtrim(line), goto error); +			} else if(strcmp(line, "%BUILDDATE%") == 0) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(tmp); +				_alpm_strtrim(line); -				char first = tolower(tmp[0]); +				char first = tolower(line[0]);  				if(first > 'a' && first < 'z') {  					struct tm tmp_tm = {0}; //initialize to null incase of failure  					setlocale(LC_TIME, "C"); -					strptime(tmp, "%a %b %e %H:%M:%S %Y", &tmp_tm); +					strptime(line, "%a %b %e %H:%M:%S %Y", &tmp_tm);  					info->builddate = mktime(&tmp_tm);  					setlocale(LC_TIME, "");  				} else { -					info->builddate = atol(tmp); +					info->builddate = atol(line);  				} -			} else if(!strcmp(line, "%INSTALLDATE%")) { -				char tmp[32]; -				if(fgets(tmp, sizeof(tmp), fp) == NULL) { +			} else if(strcmp(line, "%INSTALLDATE%") == 0) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(tmp); +				_alpm_strtrim(line); -				char first = tolower(tmp[0]); +				char first = tolower(line[0]);  				if(first > 'a' && first < 'z') {  					struct tm tmp_tm = {0}; //initialize to null incase of failure  					setlocale(LC_TIME, "C"); -					strptime(tmp, "%a %b %e %H:%M:%S %Y", &tmp_tm); +					strptime(line, "%a %b %e %H:%M:%S %Y", &tmp_tm);  					info->installdate = mktime(&tmp_tm);  					setlocale(LC_TIME, "");  				} else { -					info->installdate = atol(tmp); +					info->installdate = atol(line);  				} -			} else if(!strcmp(line, "%PACKAGER%")) { -				if(fgets(info->packager, sizeof(info->packager), fp) == NULL) { +			} else if(strcmp(line, "%PACKAGER%") == 0) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(info->packager); -			} else if(!strcmp(line, "%REASON%")) { -				char tmp[32]; -				if(fgets(tmp, sizeof(tmp), fp) == NULL) { +				STRDUP(info->packager, _alpm_strtrim(line), goto error); +			} else if(strcmp(line, "%REASON%") == 0) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(tmp); -				info->reason = atol(tmp); -			} else if(!strcmp(line, "%SIZE%") || !strcmp(line, "%CSIZE%")) { +				info->reason = atol(_alpm_strtrim(line)); +			} else if(strcmp(line, "%SIZE%") == 0 || strcmp(line, "%CSIZE%") == 0) {  				/* NOTE: the CSIZE and SIZE fields both share the "size" field  				 *       in the pkginfo_t struct.  This can be done b/c CSIZE  				 *       is currently only used in sync databases, and SIZE is  				 *       only used in local databases.  				 */ -				char tmp[32]; -				if(fgets(tmp, sizeof(tmp), fp) == NULL) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(tmp); -				info->size = atol(tmp); +				info->size = atol(_alpm_strtrim(line));  				/* also store this value to isize if isize is unset */  				if(info->isize == 0) { -					info->isize = atol(tmp); +					info->isize = info->size;  				} -			} else if(!strcmp(line, "%ISIZE%")) { +			} else if(strcmp(line, "%ISIZE%") == 0) {  				/* ISIZE (installed size) tag only appears in sync repositories,  				 * not the local one. */ -				char tmp[32]; -				if(fgets(tmp, sizeof(tmp), fp) == NULL) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -				_alpm_strtrim(tmp); -				info->isize = atol(tmp); -			} else if(!strcmp(line, "%MD5SUM%")) { +				info->isize = atol(_alpm_strtrim(line)); +			} else if(strcmp(line, "%MD5SUM%") == 0) {  				/* MD5SUM tag only appears in sync repositories,  				 * not the local one. */ -				if(fgets(info->md5sum, sizeof(info->md5sum), fp) == NULL) { +				if(fgets(line, 512, fp) == NULL) {  					goto error;  				} -			} else if(!strcmp(line, "%REPLACES%")) { -				/* the REPLACES tag is special -- it only appears in sync repositories, -				 * not the local one. */ +				STRDUP(info->md5sum, _alpm_strtrim(line), goto error); +			} else if(strcmp(line, "%REPLACES%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->replaces = alpm_list_add(info->replaces, strdup(line)); +					char *linedup; +					STRDUP(linedup, _alpm_strtrim(line), goto error); +					info->replaces = alpm_list_add(info->replaces, linedup);  				} -			} else if(!strcmp(line, "%FORCE%")) { -				/* FORCE tag only appears in sync repositories, -				 * not the local one. */ +			} else if(strcmp(line, "%FORCE%") == 0) {  				info->force = 1;  			}  		} @@ -426,13 +428,17 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  		}  		while(fgets(line, 256, fp)) {  			_alpm_strtrim(line); -			if(!strcmp(line, "%FILES%")) { +			if(strcmp(line, "%FILES%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->files = alpm_list_add(info->files, strdup(line)); +					char *linedup; +					STRDUP(linedup, _alpm_strtrim(line), goto error); +					info->files = alpm_list_add(info->files, linedup);  				} -			} else if(!strcmp(line, "%BACKUP%")) { +			} else if(strcmp(line, "%BACKUP%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->backup = alpm_list_add(info->backup, strdup(line)); +					char *linedup; +					STRDUP(linedup, _alpm_strtrim(line), goto error); +					info->backup = alpm_list_add(info->backup, linedup);  				}  			}  		} @@ -450,37 +456,30 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  		while(!feof(fp)) {  			fgets(line, 255, fp);  			_alpm_strtrim(line); -			if(!strcmp(line, "%DEPENDS%")) { +			if(strcmp(line, "%DEPENDS%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					pmdepend_t *dep = alpm_splitdep(line); +					pmdepend_t *dep = _alpm_splitdep(_alpm_strtrim(line));  					info->depends = alpm_list_add(info->depends, dep);  				} -			} else if(!strcmp(line, "%OPTDEPENDS%")) { +			} else if(strcmp(line, "%OPTDEPENDS%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->optdepends = alpm_list_add(info->optdepends, strdup(line)); +					char *linedup; +					STRDUP(linedup, _alpm_strtrim(line), goto error); +					info->optdepends = alpm_list_add(info->optdepends, linedup);  				} -			} else if(!strcmp(line, "%CONFLICTS%")) { +			} else if(strcmp(line, "%CONFLICTS%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->conflicts = alpm_list_add(info->conflicts, strdup(line)); +					char *linedup; +					STRDUP(linedup, _alpm_strtrim(line), goto error); +					info->conflicts = alpm_list_add(info->conflicts, linedup);  				} -			} else if(!strcmp(line, "%PROVIDES%")) { +			} else if(strcmp(line, "%PROVIDES%") == 0) {  				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->provides = alpm_list_add(info->provides, strdup(line)); +					char *linedup; +					STRDUP(linedup, _alpm_strtrim(line), goto error); +					info->provides = alpm_list_add(info->provides, linedup);  				}  			} -			/* TODO: we were going to move these things here, but it should wait. -			 * A better change would be to figure out how to restructure the DB. */ -				/* else if(!strcmp(line, "%REPLACES%")) { -				 * the REPLACES tag is special -- it only appears in sync repositories, -				 * not the local one. * -				while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) { -					info->replaces = alpm_list_add(info->replaces, strdup(line)); -				} -			} else if(!strcmp(line, "%FORCE%")) { -				 * FORCE tag only appears in sync repositories, -				 * not the local one. * -				info->force = 1; -			} */  		}  		fclose(fp);  		fp = NULL; @@ -488,12 +487,13 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  	/* DELTAS */  	if(inforeq & INFRQ_DELTAS) { -		snprintf(path, PATH_MAX, "%s/%s-%s/deltas", db->path, info->name, info->version); +		snprintf(path, PATH_MAX, "%s/%s-%s/deltas", db->path, +				info->name, info->version);  		if((fp = fopen(path, "r"))) {  			while(!feof(fp)) {  				fgets(line, 255, fp);  				_alpm_strtrim(line); -				if(!strcmp(line, "%DELTAS%")) { +				if(strcmp(line, "%DELTAS%") == 0) {  					while(fgets(line, 512, fp) && strlen(_alpm_strtrim(line))) {  						info->deltas = alpm_list_add(info->deltas, _alpm_delta_parse(line));  					} @@ -561,7 +561,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  		}  		fprintf(fp, "%%NAME%%\n%s\n\n"  						"%%VERSION%%\n%s\n\n", info->name, info->version); -		if(info->desc[0]) { +		if(info->desc) {  			fprintf(fp, "%%DESC%%\n"  							"%s\n\n", info->desc);  		} @@ -573,7 +573,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  			fprintf(fp, "\n");  		}  		if(local) { -			if(info->url[0]) { +			if(info->url) {  				fprintf(fp, "%%URL%%\n"  								"%s\n\n", info->url);  			} @@ -584,7 +584,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  				}  				fprintf(fp, "\n");  			} -			if(info->arch[0]) { +			if(info->arch) {  				fprintf(fp, "%%ARCH%%\n"  								"%s\n\n", info->arch);  			} @@ -596,7 +596,7 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  				fprintf(fp, "%%INSTALLDATE%%\n"  								"%ju\n\n", (uintmax_t)info->installdate);  			} -			if(info->packager[0]) { +			if(info->packager) {  				fprintf(fp, "%%PACKAGER%%\n"  								"%s\n\n", info->packager);  			} @@ -695,18 +695,16 @@ int _alpm_db_write(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq)  			}  			fprintf(fp, "\n");  		} -		if(!local) { -			if(info->replaces) { -				fputs("%REPLACES%\n", fp); -				for(lp = info->replaces; lp; lp = lp->next) { -					fprintf(fp, "%s\n", (char *)lp->data); -				} -				fprintf(fp, "\n"); -			} -			if(info->force) { -				fprintf(fp, "%%FORCE%%\n" -								"\n"); +		if(info->replaces) { +			fputs("%REPLACES%\n", fp); +			for(lp = info->replaces; lp; lp = lp->next) { +				fprintf(fp, "%s\n", (char *)lp->data);  			} +			fprintf(fp, "\n"); +		} +		if(info->force) { +			/* note the extra newline character, which is necessary! */ +			fprintf(fp, "%%FORCE%%\n\n");  		}  		fclose(fp);  		fp = NULL; diff --git a/lib/libalpm/cache.c b/lib/libalpm/cache.c index 0ad923a5..09fa74c2 100644 --- a/lib/libalpm/cache.c +++ b/lib/libalpm/cache.c @@ -81,10 +81,7 @@ void _alpm_db_free_pkgcache(pmdb_t *db)  	_alpm_log(PM_LOG_DEBUG, "freeing package cache for repository '%s'\n",  	                        db->treename); -	alpm_list_t *tmp; -	for(tmp = db->pkgcache; tmp; tmp = alpm_list_next(tmp)) { -		_alpm_pkg_free(tmp->data); -	} +	alpm_list_free_inner(db->pkgcache, (alpm_list_fn_free)_alpm_pkg_free);  	alpm_list_free(db->pkgcache);  	db->pkgcache = NULL; @@ -115,21 +112,15 @@ alpm_list_t *_alpm_db_get_pkgcache(pmdb_t *db)  int _alpm_db_add_pkgincache(pmdb_t *db, pmpkg_t *pkg)  { -	pmpkg_t *newpkg; -  	ALPM_LOG_FUNC;  	if(db == NULL || pkg == NULL) {  		return(-1);  	} -	newpkg = _alpm_pkg_dup(pkg); -	if(newpkg == NULL) { -		return(-1); -	}  	_alpm_log(PM_LOG_DEBUG, "adding entry '%s' in '%s' cache\n", -						alpm_pkg_get_name(newpkg), db->treename); -	db->pkgcache = alpm_list_add_sorted(db->pkgcache, newpkg, _alpm_pkg_cmp); +						alpm_pkg_get_name(pkg), db->treename); +	db->pkgcache = alpm_list_add_sorted(db->pkgcache, pkg, _alpm_pkg_cmp);  	_alpm_db_free_grpcache(db); diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c index 3442902c..19352d11 100644 --- a/lib/libalpm/conflict.c +++ b/lib/libalpm/conflict.c @@ -49,12 +49,30 @@ pmconflict_t *_alpm_conflict_new(const char *package1, const char *package2)  	MALLOC(conflict, sizeof(pmconflict_t), RET_ERR(PM_ERR_MEMORY, NULL)); -	strncpy(conflict->package1, package1, PKG_NAME_LEN); -	strncpy(conflict->package2, package2, PKG_NAME_LEN); +	STRDUP(conflict->package1, package1, RET_ERR(PM_ERR_MEMORY, NULL)); +	STRDUP(conflict->package2, package2, RET_ERR(PM_ERR_MEMORY, NULL));  	return(conflict);  } +void _alpm_conflict_free(pmconflict_t *conflict) +{ +	FREE(conflict->package2); +	FREE(conflict->package1); +	FREE(conflict); +} + +pmconflict_t *_alpm_conflict_dup(const pmconflict_t *conflict) +{ +	pmconflict_t *newconflict; +	CALLOC(newconflict, 1, sizeof(pmconflict_t), RET_ERR(PM_ERR_MEMORY, NULL)); + +	STRDUP(newconflict->package1, conflict->package1, RET_ERR(PM_ERR_MEMORY, NULL)); +	STRDUP(newconflict->package2, conflict->package2, RET_ERR(PM_ERR_MEMORY, NULL)); + +	return(newconflict); +} +  int _alpm_conflict_isin(pmconflict_t *needle, alpm_list_t *haystack)  {  	alpm_list_t *i; @@ -86,7 +104,7 @@ static int does_conflict(pmpkg_t *pkg1, const char *conflict, pmpkg_t *pkg2)  {  	const char *pkg1name = alpm_pkg_get_name(pkg1);  	const char *pkg2name = alpm_pkg_get_name(pkg2); -	pmdepend_t *conf = alpm_splitdep(conflict); +	pmdepend_t *conf = _alpm_splitdep(conflict);  	int match = 0;  	match = alpm_depcmp(pkg2, conf); @@ -94,7 +112,7 @@ static int does_conflict(pmpkg_t *pkg1, const char *conflict, pmpkg_t *pkg2)  		_alpm_log(PM_LOG_DEBUG, "package %s conflicts with %s (by %s)\n",  				pkg1name, pkg2name, conflict);  	} -	FREE(conf); +	_alpm_dep_free(conf);  	return(match);  } @@ -110,7 +128,7 @@ static void add_conflict(alpm_list_t **baddeps, const char *pkg1,  	if(conflict && !_alpm_conflict_isin(conflict, *baddeps)) {  		*baddeps = alpm_list_add(*baddeps, conflict);  	} else { -		FREE(conflict); +		_alpm_conflict_free(conflict);  	}  } @@ -200,9 +218,13 @@ alpm_list_t *_alpm_outerconflicts(pmdb_t *db, alpm_list_t *packages)  	return(baddeps);  } -/* Check for transaction conflicts */ -alpm_list_t *_alpm_checkconflicts(pmdb_t *db, alpm_list_t *packages) { -	return(alpm_list_join(_alpm_innerconflicts(packages), _alpm_outerconflicts(db, packages))); +/** Check the package conflicts in a database + * + * @param db_local the database to check + * @return an alpm_list_t of pmconflict_t + */ +alpm_list_t SYMEXPORT *alpm_checkdbconflicts(pmdb_t *db_local) { +	return(_alpm_innerconflicts(_alpm_db_get_pkgcache(db_local)));  }  /* Returns a alpm_list_t* of file conflicts. @@ -299,15 +321,15 @@ static alpm_list_t *add_fileconflict(alpm_list_t *conflicts,  										const char* name1, const char* name2)  {  	pmfileconflict_t *conflict; -	MALLOC(conflict, sizeof(pmfileconflict_t), return(conflicts)); +	MALLOC(conflict, sizeof(pmfileconflict_t), RET_ERR(PM_ERR_MEMORY, NULL));  	conflict->type = type; -	strncpy(conflict->target, name1, PKG_NAME_LEN); -	strncpy(conflict->file, filestr, CONFLICT_FILE_LEN); +	STRDUP(conflict->target, name1, RET_ERR(PM_ERR_MEMORY, NULL)); +	STRDUP(conflict->file, filestr, RET_ERR(PM_ERR_MEMORY, NULL));  	if(name2) { -		strncpy(conflict->ctarget, name2, PKG_NAME_LEN); +		STRDUP(conflict->ctarget, name2, RET_ERR(PM_ERR_MEMORY, NULL));  	} else { -		conflict->ctarget[0] = '\0'; +		conflict->ctarget = "";  	}  	conflicts = alpm_list_add(conflicts, conflict); @@ -317,6 +339,16 @@ static alpm_list_t *add_fileconflict(alpm_list_t *conflicts,  	return(conflicts);  } +void _alpm_fileconflict_free(pmfileconflict_t *conflict) +{ +	if(strlen(conflict->ctarget) > 0) { +		FREE(conflict->ctarget); +	} +	FREE(conflict->file);; +	FREE(conflict->target); +	FREE(conflict); +} +  /* Find file conflicts that may occur during the transaction with two checks:   * 1: check every target against every target   * 2: check every target against the filesystem */ @@ -351,13 +383,13 @@ alpm_list_t *_alpm_db_find_fileconflicts(pmdb_t *db, pmtrans_t *trans, char *roo  		PROGRESS(trans, PM_TRANS_PROGRESS_CONFLICTS_START, "", (percent * 100),  		         numtargs, current);  		/* CHECK 1: check every target against every target */ +		_alpm_log(PM_LOG_DEBUG, "searching for file conflicts: %s\n", +								alpm_pkg_get_name(p1));  		for(j = i->next; j; j = j->next) {  			p2 = j->data;  			if(!p2) {  				continue;  			} -			_alpm_log(PM_LOG_DEBUG, "searching for file conflicts: %s and %s\n", -								alpm_pkg_get_name(p1), alpm_pkg_get_name(p2));  			tmpfiles = chk_fileconflicts(alpm_pkg_get_files(p1), alpm_pkg_get_files(p2));  			if(tmpfiles) { diff --git a/lib/libalpm/conflict.h b/lib/libalpm/conflict.h index a846aace..71ed579d 100644 --- a/lib/libalpm/conflict.h +++ b/lib/libalpm/conflict.h @@ -23,27 +23,28 @@  #include "db.h"  #include "package.h" -#define CONFLICT_FILE_LEN 512 -  struct __pmconflict_t { -	char package1[PKG_NAME_LEN]; -	char package2[PKG_NAME_LEN]; +	char *package1; +	char *package2;  };  struct __pmfileconflict_t { -	char target[PKG_NAME_LEN]; +	char *target;  	pmfileconflicttype_t type; -	char file[CONFLICT_FILE_LEN]; -	char ctarget[PKG_NAME_LEN]; +	char *file; +	char *ctarget;  };  pmconflict_t *_alpm_conflict_new(const char *package1, const char *package2); +pmconflict_t *_alpm_conflict_dup(const pmconflict_t *conflict); +void _alpm_conflict_free(pmconflict_t *conflict);  int _alpm_conflict_isin(pmconflict_t *needle, alpm_list_t *haystack);  alpm_list_t *_alpm_innerconflicts(alpm_list_t *packages);  alpm_list_t *_alpm_outerconflicts(pmdb_t *db, alpm_list_t *packages); -alpm_list_t *_alpm_checkconflicts(pmdb_t *db, alpm_list_t *packages);  alpm_list_t *_alpm_db_find_fileconflicts(pmdb_t *db, pmtrans_t *trans, char *root); +void _alpm_fileconflict_free(pmfileconflict_t *conflict); +  #endif /* _ALPM_CONFLICT_H */  /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 1485c34a..3bddea65 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -500,18 +500,16 @@ alpm_list_t *_alpm_db_search(pmdb_t *db, const alpm_list_t *needles)  		for(j = _alpm_db_get_pkgcache(db); j; j = j->next) {  			pmpkg_t *pkg = j->data;  			const char *matched = NULL; +			const char *name = alpm_pkg_get_name(pkg); +			const char *desc = alpm_pkg_get_desc(pkg); -			/* check name */ -			if (regexec(®, alpm_pkg_get_name(pkg), 0, 0, 0) == 0) { -				matched = alpm_pkg_get_name(pkg); -			} -			/* check plain text name */ -			else if (strstr(alpm_pkg_get_name(pkg), targ)) { -				matched = alpm_pkg_get_name(pkg); +			/* check name as regex AND as plain text */ +			if(name && (regexec(®, name, 0, 0, 0) == 0 || strstr(name, targ))) { +				matched = name;  			}  			/* check desc */ -			else if (regexec(®, alpm_pkg_get_desc(pkg), 0, 0, 0) == 0) { -				matched = alpm_pkg_get_desc(pkg); +			else if (desc && regexec(®, desc, 0, 0, 0) == 0) { +				matched = desc;  			}  			/* check provides */  			/* TODO: should we be doing this, and should we print something diff --git a/lib/libalpm/delta.c b/lib/libalpm/delta.c index 3d33c595..9eb6e82f 100644 --- a/lib/libalpm/delta.c +++ b/lib/libalpm/delta.c @@ -1,7 +1,7 @@  /*   *  delta.c   * - *  Copyright (c) 2007 by Judd Vinet <jvinet@zeroflux.org> + *  Copyright (c) 2007-2008 by Judd Vinet <jvinet@zeroflux.org>   *   *  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 @@ -99,7 +99,7 @@ unsigned long _alpm_delta_path_size(alpm_list_t *deltas)  	alpm_list_t *dlts = deltas;  	while(dlts) { -		pmdelta_t *d = (pmdelta_t *)alpm_list_getdata(dlts); +		pmdelta_t *d = alpm_list_getdata(dlts);  		sum += d->size;  		dlts = alpm_list_next(dlts); @@ -121,7 +121,7 @@ unsigned long _alpm_delta_path_size_uncached(alpm_list_t *deltas)  	alpm_list_t *dlts = deltas;  	while(dlts) { -		pmdelta_t *d = (pmdelta_t *)alpm_list_getdata(dlts); +		pmdelta_t *d = alpm_list_getdata(dlts);  		char *fname = _alpm_filecache_find(d->filename);  		if(!fname) { @@ -241,12 +241,12 @@ pmdelta_t *_alpm_delta_parse(char *line)  	tmp2 = tmp;  	tmp = strchr(tmp, ' ');  	*(tmp++) = '\0'; -	strncpy(delta->from, tmp2, DLT_VERSION_LEN); +	STRDUP(delta->from, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));  	tmp2 = tmp;  	tmp = strchr(tmp, ' ');  	*(tmp++) = '\0'; -	strncpy(delta->to, tmp2, DLT_VERSION_LEN); +	STRDUP(delta->to, tmp2, RET_ERR(PM_ERR_MEMORY, NULL));  	tmp2 = tmp;  	tmp = strchr(tmp, ' '); @@ -256,11 +256,20 @@ pmdelta_t *_alpm_delta_parse(char *line)  	tmp2 = tmp;  	tmp = strchr(tmp, ' ');  	*(tmp++) = '\0'; -	strncpy(delta->filename, tmp2, DLT_FILENAME_LEN); +	STRDUP(delta->filename, tmp2, RET_ERR(PM_ERR_MEMORY, NULL)); -	strncpy(delta->md5sum, tmp, DLT_MD5SUM_LEN); +	STRDUP(delta->md5sum, tmp, RET_ERR(PM_ERR_MEMORY, NULL));  	return(delta);  } +void _alpm_delta_free(pmdelta_t *delta) +{ +	FREE(delta->from); +	FREE(delta->to); +	FREE(delta->filename); +	FREE(delta->md5sum); +	FREE(delta); +} +  /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libalpm/delta.h b/lib/libalpm/delta.h index 3065d4d1..007e5d45 100644 --- a/lib/libalpm/delta.h +++ b/lib/libalpm/delta.h @@ -1,7 +1,7 @@  /*   *  delta.h   * - *  Copyright (c) 2007 by Judd Vinet <jvinet@zeroflux.org> + *  Copyright (c) 2007-2008 by Judd Vinet <jvinet@zeroflux.org>   *   *  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,22 +21,20 @@  #include "alpm.h" -#define DLT_FILENAME_LEN 512 -#define DLT_VERSION_LEN  64 -#define DLT_MD5SUM_LEN   33 -  struct __pmdelta_t { -	char from[DLT_VERSION_LEN]; -	char to[DLT_VERSION_LEN]; +	char *from; +	char *to;  	unsigned long size; -	char filename[DLT_FILENAME_LEN]; -	char md5sum[DLT_MD5SUM_LEN]; +	char *filename; +	char *md5sum;  };  unsigned long _alpm_delta_path_size(alpm_list_t *deltas);  unsigned long _alpm_delta_path_size_uncached(alpm_list_t *deltas);  pmdelta_t *_alpm_delta_parse(char *line); -alpm_list_t *_alpm_shortest_delta_path(alpm_list_t *deltas, const char *from, const char *to); +void _alpm_delta_free(pmdelta_t *delta); +alpm_list_t *_alpm_shortest_delta_path(alpm_list_t *deltas, +		const char *from, const char *to);  #endif /* _ALPM_DELTA_H */ diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index ec52083e..29dafc29 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -31,36 +31,21 @@  #include "util.h"  #include "log.h"  #include "error.h" +#include "graph.h"  #include "package.h"  #include "db.h"  #include "cache.h"  #include "handle.h" -static pmgraph_t *_alpm_graph_new(void) +void _alpm_dep_free(pmdepend_t *dep)  { -	pmgraph_t *graph = NULL; - -	MALLOC(graph, sizeof(pmgraph_t), RET_ERR(PM_ERR_MEMORY, NULL)); - -	if(graph) { -		graph->state = 0; -		graph->data = NULL; -		graph->parent = NULL; -		graph->children = NULL; -		graph->childptr = NULL; -	} -	return(graph); -} - -static void _alpm_graph_free(void *data) -{ -	pmgraph_t *graph = data; -	alpm_list_free(graph->children); -	free(graph); +	FREE(dep->name); +	FREE(dep->version); +	FREE(dep);  } -pmdepmissing_t *_alpm_depmiss_new(const char *target, pmdepmod_t depmod, -		const char *depname, const char *depversion) +pmdepmissing_t *_alpm_depmiss_new(const char *target, pmdepend_t *dep, +		const char *causingpkg)  {  	pmdepmissing_t *miss; @@ -68,24 +53,27 @@ pmdepmissing_t *_alpm_depmiss_new(const char *target, pmdepmod_t depmod,  	MALLOC(miss, sizeof(pmdepmissing_t), RET_ERR(PM_ERR_MEMORY, NULL)); -	strncpy(miss->target, target, PKG_NAME_LEN); -	miss->depend.mod = depmod; -	strncpy(miss->depend.name, depname, PKG_NAME_LEN); -	if(depversion) { -		strncpy(miss->depend.version, depversion, PKG_VERSION_LEN); -	} else { -		miss->depend.version[0] = 0; -	} +	STRDUP(miss->target, target, RET_ERR(PM_ERR_MEMORY, NULL)); +	miss->depend = _alpm_dep_dup(dep); +	STRDUP(miss->causingpkg, causingpkg, RET_ERR(PM_ERR_MEMORY, NULL));  	return(miss);  } +void _alpm_depmiss_free(pmdepmissing_t *miss) +{ +	_alpm_dep_free(miss->depend); +	FREE(miss->target); +	FREE(miss->causingpkg); +	FREE(miss); +} +  /* Convert a list of pmpkg_t * to a graph structure,   * with a edge for each dependency.   * Returns a list of vertices (one vertex = one package)   * (used by alpm_sortbydeps)   */ -static alpm_list_t *_alpm_graph_init(alpm_list_t *targets) +static alpm_list_t *dep_graph_init(alpm_list_t *targets)  {  	alpm_list_t *i, *j, *k;  	alpm_list_t *vertices = NULL; @@ -149,7 +137,7 @@ alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, pmtranstype_t mode)  	_alpm_log(PM_LOG_DEBUG, "started sorting dependencies\n"); -	vertices = _alpm_graph_init(targets); +	vertices = dep_graph_init(targets);  	vptr = vertices;  	vertex = vertices->data; @@ -217,6 +205,31 @@ static int satisfycmp(const void *pkg, const void *depend)  /** Checks dependencies and returns missing ones in a list.   * Dependencies can include versions with depmod operators.   * @param db pointer to the local package database + * @param targets an alpm_list_t* of dependencies strings to satisfy + * @return an alpm_list_t* of missing dependencies strings + */ +alpm_list_t SYMEXPORT *alpm_deptest(pmdb_t *db, alpm_list_t *targets) +{ +	alpm_list_t *i, *ret = NULL; + +	for(i = targets; i; i = alpm_list_next(i)) { +		pmdepend_t *dep; +		char *target; + +		target = alpm_list_getdata(i); +		dep = _alpm_splitdep(target); + +		if(!alpm_list_find(_alpm_db_get_pkgcache(db), dep, satisfycmp)) { +			ret = alpm_list_add(ret, target); +		} +		_alpm_dep_free(dep); +	} +	return(ret); +} + +/** Checks dependencies and returns missing ones in a list. + * Dependencies can include versions with depmod operators. + * @param db pointer to the local package database   * @param reversedeps handles the backward dependencies   * @param remove an alpm_list_t* of packages to be removed   * @param upgrade an alpm_list_t* of packages to be upgraded (remove-then-upgrade) @@ -264,8 +277,7 @@ alpm_list_t SYMEXPORT *alpm_checkdeps(pmdb_t *db, int reversedeps,  				_alpm_log(PM_LOG_DEBUG, "checkdeps: missing dependency '%s' for package '%s'\n",  						missdepstring, alpm_pkg_get_name(tp));  				free(missdepstring); -				miss = _alpm_depmiss_new(alpm_pkg_get_name(tp), depend->mod, -						depend->name, depend->version); +				miss = _alpm_depmiss_new(alpm_pkg_get_name(tp), depend, "");  				baddeps = alpm_list_add(baddeps, miss);  			}  		} @@ -278,18 +290,18 @@ alpm_list_t SYMEXPORT *alpm_checkdeps(pmdb_t *db, int reversedeps,  			pmpkg_t *lp = i->data;  			for(j = alpm_pkg_get_depends(lp); j; j = j->next) {  				pmdepend_t *depend = j->data; +				pmpkg_t *causingpkg = alpm_list_find(modified, depend, satisfycmp);  				/* we won't break this depend, if it is already broken, we ignore it */  				/* 1. check upgrade list for satisfiers */  				/* 2. check dblist for satisfiers */ -				if(alpm_list_find(modified, depend, satisfycmp) && +				if(causingpkg &&  				   !alpm_list_find(upgrade, depend, satisfycmp) &&  				   !alpm_list_find(dblist, depend, satisfycmp)) {  					char *missdepstring = alpm_dep_get_string(depend);  					_alpm_log(PM_LOG_DEBUG, "checkdeps: transaction would break '%s' dependency of '%s'\n",  							missdepstring, alpm_pkg_get_name(lp));  					free(missdepstring); -					miss = _alpm_depmiss_new(lp->name, depend->mod, -							depend->name, depend->version); +					miss = _alpm_depmiss_new(lp->name, depend, alpm_pkg_get_name(causingpkg));  					baddeps = alpm_list_add(baddeps, miss);  				}  			} @@ -357,7 +369,7 @@ int SYMEXPORT alpm_depcmp(pmpkg_t *pkg, pmdepend_t *dep)  	return(satisfy);  } -pmdepend_t SYMEXPORT *alpm_splitdep(const char *depstring) +pmdepend_t *_alpm_splitdep(const char *depstring)  {  	pmdepend_t *depend;  	char *ptr = NULL; @@ -366,9 +378,9 @@ pmdepend_t SYMEXPORT *alpm_splitdep(const char *depstring)  	if(depstring == NULL) {  		return(NULL);  	} -	newstr = strdup(depstring); +	STRDUP(newstr, depstring, RET_ERR(PM_ERR_MEMORY, NULL)); -	MALLOC(depend, sizeof(pmdepend_t), return(NULL)); +	CALLOC(depend, 1, sizeof(pmdepend_t), RET_ERR(PM_ERR_MEMORY, NULL));  	/* Find a version comparator if one exists. If it does, set the type and  	 * increment the ptr accordingly so we can copy the right strings. */ @@ -392,25 +404,36 @@ pmdepend_t SYMEXPORT *alpm_splitdep(const char *depstring)  		depend->mod = PM_DEP_MOD_GT;  		*ptr = '\0';  		ptr += 1; -  	} else { -		/* no version specified - copy in the name and return it */ +		/* no version specified - copy the name and return it */  		depend->mod = PM_DEP_MOD_ANY; -		strncpy(depend->name, newstr, PKG_NAME_LEN); -		depend->version[0] = '\0'; +		STRDUP(depend->name, newstr, RET_ERR(PM_ERR_MEMORY, NULL)); +		depend->version = NULL;  		free(newstr);  		return(depend);  	}  	/* if we get here, we have a version comparator, copy the right parts  	 * to the right places */ -	strncpy(depend->name, newstr, PKG_NAME_LEN); -	strncpy(depend->version, ptr, PKG_VERSION_LEN); +	STRDUP(depend->name, newstr, RET_ERR(PM_ERR_MEMORY, NULL)); +	STRDUP(depend->version, ptr, RET_ERR(PM_ERR_MEMORY, NULL));  	free(newstr);  	return(depend);  } +pmdepend_t *_alpm_dep_dup(const pmdepend_t *dep) +{ +	pmdepend_t *newdep; +	CALLOC(newdep, 1, sizeof(pmdepend_t), RET_ERR(PM_ERR_MEMORY, NULL)); + +	STRDUP(newdep->name, dep->name, RET_ERR(PM_ERR_MEMORY, NULL)); +	STRDUP(newdep->version, dep->version, RET_ERR(PM_ERR_MEMORY, NULL)); +	newdep->mod = dep->mod; + +	return(newdep); +} +  /* These parameters are messy. We check if this package, given a list of   * targets and a db is safe to remove. We do NOT remove it if it is in the   * target list, or if if the package was explictly installed and @@ -524,7 +547,7 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,  	for(i = deps; i; i = i->next) {  		int found = 0;  		pmdepmissing_t *miss = i->data; -		pmdepend_t *missdep = &(miss->depend); +		pmdepend_t *missdep = alpm_miss_get_dep(miss);  		pmpkg_t *sync = NULL;  		/* check if one of the packages in *list already satisfies this dependency */ @@ -612,7 +635,8 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg,  	_alpm_log(PM_LOG_DEBUG, "finished resolving dependencies\n"); -	FREELIST(deps); +	alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_depmiss_free); +	alpm_list_free(deps);  	return(0); @@ -628,7 +652,17 @@ const char SYMEXPORT *alpm_miss_get_target(const pmdepmissing_t *miss)  	/* Sanity checks */  	ASSERT(miss != NULL, return(NULL)); -	return miss->target; +	return(miss->target); +} + +const char SYMEXPORT *alpm_miss_get_causingpkg(const pmdepmissing_t *miss) +{ +	ALPM_LOG_FUNC; + +	/* Sanity checks */ +	ASSERT(miss != NULL, return(NULL)); + +	return miss->causingpkg;  }  pmdepend_t SYMEXPORT *alpm_miss_get_dep(pmdepmissing_t *miss) @@ -638,7 +672,7 @@ pmdepend_t SYMEXPORT *alpm_miss_get_dep(pmdepmissing_t *miss)  	/* Sanity checks */  	ASSERT(miss != NULL, return(NULL)); -	return &(miss->depend); +	return(miss->depend);  }  pmdepmod_t SYMEXPORT alpm_dep_get_mod(const pmdepend_t *dep) @@ -648,7 +682,7 @@ pmdepmod_t SYMEXPORT alpm_dep_get_mod(const pmdepend_t *dep)  	/* Sanity checks */  	ASSERT(dep != NULL, return(-1)); -	return dep->mod; +	return(dep->mod);  }  const char SYMEXPORT *alpm_dep_get_name(const pmdepend_t *dep) @@ -658,7 +692,7 @@ const char SYMEXPORT *alpm_dep_get_name(const pmdepend_t *dep)  	/* Sanity checks */  	ASSERT(dep != NULL, return(NULL)); -	return dep->name; +	return(dep->name);  }  const char SYMEXPORT *alpm_dep_get_version(const pmdepend_t *dep) @@ -668,7 +702,7 @@ const char SYMEXPORT *alpm_dep_get_version(const pmdepend_t *dep)  	/* Sanity checks */  	ASSERT(dep != NULL, return(NULL)); -	return dep->version; +	return(dep->version);  }  /** Reverse of splitdep; make a dep string from a pmdepend_t struct. @@ -678,7 +712,7 @@ const char SYMEXPORT *alpm_dep_get_version(const pmdepend_t *dep)   */  char SYMEXPORT *alpm_dep_get_string(const pmdepend_t *dep)  { -	char *opr, *str = NULL; +	char *name, *opr, *ver, *str = NULL;  	size_t len;  	ALPM_LOG_FUNC; @@ -686,6 +720,12 @@ char SYMEXPORT *alpm_dep_get_string(const pmdepend_t *dep)  	/* Sanity checks */  	ASSERT(dep != NULL, return(NULL)); +	if(dep->name) { +		name = dep->name; +	} else { +		name = ""; +	} +  	switch(dep->mod) {  		case PM_DEP_MOD_ANY:  			opr = ""; @@ -710,11 +750,18 @@ char SYMEXPORT *alpm_dep_get_string(const pmdepend_t *dep)  			break;  	} +	if(dep->version) { +		ver = dep->version; +	} else { +		ver = ""; +	} +  	/* we can always compute len and print the string like this because opr -	 * and ver will be empty when PM_DEP_MOD_ANY is the depend type */ -	len = strlen(dep->name) + strlen(opr) + strlen(dep->version) + 1; +	 * and ver will be empty when PM_DEP_MOD_ANY is the depend type. the +	 * reassignments above also ensure we do not do a strlen(NULL). */ +	len = strlen(name) + strlen(opr) + strlen(ver) + 1;  	MALLOC(str, len, RET_ERR(PM_ERR_MEMORY, NULL)); -	snprintf(str, len, "%s%s%s", dep->name, opr, dep->version); +	snprintf(str, len, "%s%s%s", name, opr, ver);  	return(str);  } diff --git a/lib/libalpm/deps.h b/lib/libalpm/deps.h index 75cbb5bc..0c3975e6 100644 --- a/lib/libalpm/deps.h +++ b/lib/libalpm/deps.h @@ -29,31 +29,28 @@  /* Dependency */  struct __pmdepend_t {  	pmdepmod_t mod; -	char name[PKG_NAME_LEN]; -	char version[PKG_VERSION_LEN]; +	char *name; +	char *version;  };  /* Missing dependency */  struct __pmdepmissing_t { -	char target[PKG_NAME_LEN]; -	pmdepend_t depend; +	char *target; +	pmdepend_t *depend; +	char *causingpkg; /* this is used in case of remove dependency error only */  }; -/* Graphs */ -struct __pmgraph_t { -	int state; /* 0: untouched, -1: entered, other: leaving time */ -	void *data; -	struct __pmgraph_t *parent; /* where did we come from? */ -	alpm_list_t *children; -	alpm_list_t *childptr; /* points to a child in children list */ -}; - -pmdepmissing_t *_alpm_depmiss_new(const char *target, pmdepmod_t depmod, -		const char *depname, const char *depversion); +void _alpm_dep_free(pmdepend_t *dep); +pmdepend_t *_alpm_dep_dup(const pmdepend_t *dep); +pmdepmissing_t *_alpm_depmiss_new(const char *target, pmdepend_t *dep, +		const char *causinpkg); +void _alpm_depmiss_free(pmdepmissing_t *miss);  alpm_list_t *_alpm_sortbydeps(alpm_list_t *targets, pmtranstype_t mode);  void _alpm_recursedeps(pmdb_t *db, alpm_list_t *targs, int include_explicit);  int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *syncpkg, -                      alpm_list_t **list, alpm_list_t *remove, pmtrans_t *trans, alpm_list_t **data); +		alpm_list_t **list, alpm_list_t *remove, pmtrans_t *trans, alpm_list_t +		**data); +pmdepend_t *_alpm_splitdep(const char *depstring);  #endif /* _ALPM_DEPS_H */ diff --git a/lib/libalpm/graph.h b/lib/libalpm/graph.h new file mode 100644 index 00000000..e3e40023 --- /dev/null +++ b/lib/libalpm/graph.h @@ -0,0 +1,55 @@ +/* + *  graph.h - helpful graph structure and setup/teardown methods + * + *  Copyright (c) 2002-2008 by Judd Vinet <jvinet@zeroflux.org> + * + *  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 + *  the Free Software Foundation; either version 2 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include "alpm_list.h" +#include "util.h" /* MALLOC() */ +#include "alpm.h" + +struct __pmgraph_t { +	char state; /* 0: untouched, -1: entered, other: leaving time */ +	void *data; +	struct __pmgraph_t *parent; /* where did we come from? */ +	alpm_list_t *children; +	alpm_list_t *childptr; /* points to a child in children list */ +}; +typedef struct __pmgraph_t pmgraph_t; + +static pmgraph_t *_alpm_graph_new(void) +{ +	pmgraph_t *graph = NULL; + +	MALLOC(graph, sizeof(pmgraph_t), RET_ERR(PM_ERR_MEMORY, NULL)); + +	if(graph) { +		graph->state = 0; +		graph->data = NULL; +		graph->parent = NULL; +		graph->children = NULL; +		graph->childptr = NULL; +	} +	return(graph); +} + +static void _alpm_graph_free(void *data) +{ +	pmgraph_t *graph = data; +	alpm_list_free(graph->children); +	free(graph); +} + diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 363cf313..98417155 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -166,15 +166,17 @@ const char SYMEXPORT *alpm_pkg_get_filename(pmpkg_t *pkg)  		_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC);  	} -	if(!strlen(pkg->filename)) { +	if(pkg->filename == NULL || strlen(pkg->filename) == 0) {  		/* construct the file name, it's not in the desc file */ +		char buffer[PATH_MAX];  		if(pkg->arch && strlen(pkg->arch) > 0) { -			snprintf(pkg->filename, PKG_FILENAME_LEN, "%s-%s-%s" PKGEXT, +			snprintf(buffer, PATH_MAX, "%s-%s-%s" PKGEXT,  			         pkg->name, pkg->version, pkg->arch);  		} else { -			snprintf(pkg->filename, PKG_FILENAME_LEN, "%s-%s" PKGEXT, +			snprintf(buffer, PATH_MAX, "%s-%s" PKGEXT,  			         pkg->name, pkg->version);  		} +		STRDUP(pkg->filename, buffer, RET_ERR(PM_ERR_MEMORY, NULL));  	}  	return pkg->filename; @@ -756,15 +758,12 @@ pmpkg_t *_alpm_pkg_new(const char *name, const char *version)  	CALLOC(pkg, 1, sizeof(pmpkg_t), RET_ERR(PM_ERR_MEMORY, NULL)); -	if(name && name[0] != 0) { -		strncpy(pkg->name, name, PKG_NAME_LEN); -	} else { -		pkg->name[0] = '\0'; +	if(name) { +		STRDUP(pkg->name, name, RET_ERR(PM_ERR_MEMORY, pkg));  	} -	if(version && version[0] != 0) { -		strncpy(pkg->version, version, PKG_VERSION_LEN); -	} else { -		pkg->version[0] = '\0'; + +	if(version) { +		STRDUP(pkg->version, version, RET_ERR(PM_ERR_MEMORY, pkg));  	}  	return(pkg); @@ -772,31 +771,51 @@ pmpkg_t *_alpm_pkg_new(const char *name, const char *version)  pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg)  { -	pmpkg_t* newpkg; +	pmpkg_t *newpkg; +	alpm_list_t *i;  	ALPM_LOG_FUNC;  	CALLOC(newpkg, 1, sizeof(pmpkg_t), RET_ERR(PM_ERR_MEMORY, NULL)); -	memcpy(newpkg, pkg, sizeof(pmpkg_t)); +	STRDUP(newpkg->filename, pkg->filename, RET_ERR(PM_ERR_MEMORY, newpkg)); +	STRDUP(newpkg->name, pkg->name, RET_ERR(PM_ERR_MEMORY, newpkg)); +	STRDUP(newpkg->version, pkg->version, RET_ERR(PM_ERR_MEMORY, newpkg)); +	STRDUP(newpkg->desc, pkg->desc, RET_ERR(PM_ERR_MEMORY, newpkg)); +	STRDUP(newpkg->url, pkg->url, RET_ERR(PM_ERR_MEMORY, newpkg)); +	newpkg->builddate = pkg->builddate; +	newpkg->installdate = pkg->installdate; +	STRDUP(newpkg->packager, pkg->packager, RET_ERR(PM_ERR_MEMORY, newpkg)); +	STRDUP(newpkg->md5sum, pkg->md5sum, RET_ERR(PM_ERR_MEMORY, newpkg)); +	STRDUP(newpkg->arch, pkg->arch, RET_ERR(PM_ERR_MEMORY, newpkg)); +	newpkg->size = pkg->size; +	newpkg->isize = pkg->isize; +	newpkg->scriptlet = pkg->scriptlet; +	newpkg->force = pkg->force; +	newpkg->reason = pkg->reason; +  	newpkg->licenses   = alpm_list_strdup(alpm_pkg_get_licenses(pkg)); -	newpkg->conflicts  = alpm_list_strdup(alpm_pkg_get_conflicts(pkg)); +	newpkg->replaces   = alpm_list_strdup(alpm_pkg_get_replaces(pkg)); +	newpkg->groups     = alpm_list_strdup(alpm_pkg_get_groups(pkg));  	newpkg->files      = alpm_list_strdup(alpm_pkg_get_files(pkg));  	newpkg->backup     = alpm_list_strdup(alpm_pkg_get_backup(pkg)); -	newpkg->depends    = alpm_list_copy_data(alpm_pkg_get_depends(pkg), -	                                         sizeof(pmdepend_t)); +	for(i = alpm_pkg_get_depends(pkg); i; i = alpm_list_next(i)) { +		newpkg->depends = alpm_list_add(newpkg->depends, _alpm_dep_dup(i->data)); +	}  	newpkg->optdepends = alpm_list_strdup(alpm_pkg_get_optdepends(pkg)); -	newpkg->groups     = alpm_list_strdup(alpm_pkg_get_groups(pkg)); +	newpkg->conflicts  = alpm_list_strdup(alpm_pkg_get_conflicts(pkg));  	newpkg->provides   = alpm_list_strdup(alpm_pkg_get_provides(pkg)); -	newpkg->replaces   = alpm_list_strdup(alpm_pkg_get_replaces(pkg));  	newpkg->deltas     = alpm_list_copy_data(alpm_pkg_get_deltas(pkg), -	                                         sizeof(pmdelta_t)); +																					 sizeof(pmdelta_t)); +  	/* internal */ +	newpkg->origin = pkg->origin;  	if(newpkg->origin == PKG_FROM_FILE) {  		newpkg->origin_data.file = strdup(pkg->origin_data.file);  	} else {  		newpkg->origin_data.db = pkg->origin_data.db;  	} +	newpkg->infolevel = pkg->infolevel;  	return(newpkg);  } @@ -809,16 +828,27 @@ void _alpm_pkg_free(pmpkg_t *pkg)  		return;  	} +	FREE(pkg->filename); +	FREE(pkg->name); +	FREE(pkg->version); +	FREE(pkg->desc); +	FREE(pkg->url); +	FREE(pkg->packager); +	FREE(pkg->md5sum); +	FREE(pkg->arch);  	FREELIST(pkg->licenses); +	FREELIST(pkg->replaces); +	FREELIST(pkg->groups);  	FREELIST(pkg->files);  	FREELIST(pkg->backup); -	FREELIST(pkg->depends); +	alpm_list_free_inner(pkg->depends, (alpm_list_fn_free)_alpm_dep_free); +	alpm_list_free(pkg->depends);  	FREELIST(pkg->optdepends);  	FREELIST(pkg->conflicts); -	FREELIST(pkg->groups);  	FREELIST(pkg->provides); -	FREELIST(pkg->replaces); -	FREELIST(pkg->deltas); +	alpm_list_free_inner(pkg->deltas, (alpm_list_fn_free)_alpm_delta_free); +	alpm_list_free(pkg->deltas); +  	if(pkg->origin == PKG_FROM_FILE) {  		FREE(pkg->origin_data.file);  	} @@ -866,6 +896,12 @@ int _alpm_pkg_cmp(const void *p1, const void *p2)  	return(strcmp(alpm_pkg_get_name(pk1), alpm_pkg_get_name(pk2)));  } +int _alpm_pkgname_pkg_cmp(const void *pkgname, const void *package) +{ +	return(strcmp(alpm_pkg_get_name((pmpkg_t *) package), (char *) pkgname)); +} + +  /* Parses the package description file for the current package   * TODO: this should ALL be in a backend interface (be_files), we should   *       be dealing with the abstracted concepts only in this file @@ -900,18 +936,18 @@ static int parse_descfile(const char *descfile, pmpkg_t *info)  			_alpm_log(PM_LOG_DEBUG, "%s: syntax error in description file line %d\n",  								info->name[0] != '\0' ? info->name : "error", linenum);  		} else { -			_alpm_strtrim(key); -			_alpm_strtrim(ptr); +			key = _alpm_strtrim(key); +			ptr = _alpm_strtrim(ptr);  			if(!strcmp(key, "pkgname")) { -				strncpy(info->name, ptr, sizeof(info->name)); +				STRDUP(info->name, ptr, RET_ERR(PM_ERR_MEMORY, -1));  			} else if(!strcmp(key, "pkgver")) { -				strncpy(info->version, ptr, sizeof(info->version)); +				STRDUP(info->version, ptr, RET_ERR(PM_ERR_MEMORY, -1));  			} else if(!strcmp(key, "pkgdesc")) { -				strncpy(info->desc, ptr, sizeof(info->desc)); +				STRDUP(info->desc, ptr, RET_ERR(PM_ERR_MEMORY, -1));  			} else if(!strcmp(key, "group")) {  				info->groups = alpm_list_add(info->groups, strdup(ptr));  			} else if(!strcmp(key, "url")) { -				strncpy(info->url, ptr, sizeof(info->url)); +				STRDUP(info->url, ptr, RET_ERR(PM_ERR_MEMORY, -1));  			} else if(!strcmp(key, "license")) {  				info->licenses = alpm_list_add(info->licenses, strdup(ptr));  			} else if(!strcmp(key, "builddate")) { @@ -926,14 +962,14 @@ static int parse_descfile(const char *descfile, pmpkg_t *info)  					info->builddate = atol(ptr);  				}  			} else if(!strcmp(key, "packager")) { -				strncpy(info->packager, ptr, sizeof(info->packager)); +				STRDUP(info->packager, ptr, RET_ERR(PM_ERR_MEMORY, -1));  			} else if(!strcmp(key, "arch")) { -				strncpy(info->arch, ptr, sizeof(info->arch)); +				STRDUP(info->arch, ptr, RET_ERR(PM_ERR_MEMORY, -1));  			} else if(!strcmp(key, "size")) {  				/* size in the raw package is uncompressed (installed) size */  				info->isize = atol(ptr);  			} else if(!strcmp(key, "depend")) { -				pmdepend_t *dep = alpm_splitdep(ptr); +				pmdepend_t *dep = _alpm_splitdep(ptr);  				info->depends = alpm_list_add(info->depends, dep);  			} else if(!strcmp(key, "optdepend")) {  				info->optdepends = alpm_list_add(info->optdepends, strdup(ptr)); @@ -1035,11 +1071,11 @@ pmpkg_t *_alpm_pkg_load(const char *pkgfile, unsigned short full)  						pkgfile);  				goto pkg_invalid;  			} -			if(!strlen(info->name)) { +			if(info->name == NULL || strlen(info->name) == 0) {  				_alpm_log(PM_LOG_ERROR, _("missing package name in %s\n"), pkgfile);  				goto pkg_invalid;  			} -			if(!strlen(info->version)) { +			if(info->version == NULL || strlen(info->version) == 0) {  				_alpm_log(PM_LOG_ERROR, _("missing package version in %s\n"), pkgfile);  				goto pkg_invalid;  			} diff --git a/lib/libalpm/package.h b/lib/libalpm/package.h index d6c3eff9..f3de05d6 100644 --- a/lib/libalpm/package.h +++ b/lib/libalpm/package.h @@ -33,30 +33,17 @@ typedef enum _pmpkgfrom_t {  	PKG_FROM_FILE  } pmpkgfrom_t; -/* Packages */ -#define PKG_FILENAME_LEN 512 -#define PKG_NAME_LEN     256 -#define PKG_VERSION_LEN  64 -#define PKG_FULLNAME_LEN (PKG_NAME_LEN + PKG_VERSION_LEN) -#define PKG_DESC_LEN     512 -#define PKG_URL_LEN      256 -#define PKG_DATE_LEN     32 -#define PKG_TYPE_LEN     32 -#define PKG_PACKAGER_LEN 64 -#define PKG_MD5SUM_LEN   33 -#define PKG_ARCH_LEN     32 -  struct __pmpkg_t { -	char filename[PKG_FILENAME_LEN]; -	char name[PKG_NAME_LEN]; -	char version[PKG_VERSION_LEN]; -	char desc[PKG_DESC_LEN]; -	char url[PKG_URL_LEN]; +	char *filename; +	char *name; +	char *version; +	char *desc; +	char *url;  	time_t builddate;  	time_t installdate; -	char packager[PKG_PACKAGER_LEN]; -	char md5sum[PKG_MD5SUM_LEN]; -	char arch[PKG_ARCH_LEN]; +	char *packager; +	char *md5sum; +	char *arch;  	unsigned long size;  	unsigned long isize;  	unsigned short scriptlet; @@ -90,6 +77,7 @@ pmpkg_t* _alpm_pkg_new(const char *name, const char *version);  pmpkg_t *_alpm_pkg_dup(pmpkg_t *pkg);  void _alpm_pkg_free(pmpkg_t *pkg);  int _alpm_pkg_cmp(const void *p1, const void *p2); +int _alpm_pkgname_pkg_cmp(const void *pkgname, const void *package);  int _alpm_pkg_compare_versions(pmpkg_t *local_pkg, pmpkg_t *pkg);  pmpkg_t *_alpm_pkg_load(const char *pkgfile, unsigned short full);  pmpkg_t *_alpm_pkg_find(const char *needle, alpm_list_t *haystack); diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c index be7b3eda..44d305f2 100644 --- a/lib/libalpm/remove.c +++ b/lib/libalpm/remove.c @@ -120,14 +120,37 @@ int _alpm_remove_prepare(pmtrans_t *trans, pmdb_t *db, alpm_list_t **data)  							          miss->target);  						}  					} -					FREELIST(lp); +					alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free); +					alpm_list_free(lp); +					lp = alpm_checkdeps(db, 1, trans->packages, NULL); +				} +			} else if (trans->flags & PM_TRANS_FLAG_UNNEEDED) { +				/* Remove needed packages (which break dependencies) from the target list */ +				while(lp != NULL) { +					alpm_list_t *i; +					for(i = lp; i; i = i->next) { +						pmdepmissing_t *miss = (pmdepmissing_t *)i->data; +						void *vpkg; +						pmpkg_t *pkg; +						trans->packages = alpm_list_remove(trans->packages, miss->causingpkg, +								_alpm_pkgname_pkg_cmp, &vpkg); +						pkg = vpkg; +						if(pkg) { +							_alpm_log(PM_LOG_WARNING, "removing %s from the target-list\n", +									alpm_pkg_get_name(pkg)); +							_alpm_pkg_free(pkg); +						} +					} +					alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free); +					alpm_list_free(lp);  					lp = alpm_checkdeps(db, 1, trans->packages, NULL);  				}  			} else {  				if(data) {  					*data = lp;  				} else { -					FREELIST(lp); +					alpm_list_free_inner(lp, (alpm_list_fn_free)_alpm_depmiss_free); +					alpm_list_free(lp);  				}  				RET_ERR(PM_ERR_UNSATISFIED_DEPS, -1);  			} diff --git a/lib/libalpm/server.c b/lib/libalpm/server.c index 4bccf3ca..c0622552 100644 --- a/lib/libalpm/server.c +++ b/lib/libalpm/server.c @@ -188,7 +188,7 @@ int _alpm_downloadfiles_forreal(alpm_list_t *servers, const char *localpath,  			char realfile[PATH_MAX];  			char output[PATH_MAX];  			char *fn = (char *)lp->data; -			char pkgname[PKG_NAME_LEN]; +			char *pkgname;  			fileurl = url_for_file(server, fn);  			if(!fileurl) { @@ -196,7 +196,7 @@ int _alpm_downloadfiles_forreal(alpm_list_t *servers, const char *localpath,  			}  			/* pass the raw filename for passing to the callback function */ -			strncpy(pkgname, fn, PKG_NAME_LEN); +			STRDUP(pkgname, fn, (void)0);  			_alpm_log(PM_LOG_DEBUG, "using '%s' for download progress\n", pkgname);  			snprintf(realfile, PATH_MAX, "%s%s", localpath, fn); @@ -403,6 +403,7 @@ int _alpm_downloadfiles_forreal(alpm_list_t *servers, const char *localpath,  				}  				chdir(cwd);  			} +			FREE(pkgname);  		}  		if(alpm_list_count(complete) == alpm_list_count(files)) { diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 44fef4e7..3a27f7cc 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -47,7 +47,7 @@  #include "server.h"  #include "delta.h" -pmsyncpkg_t *_alpm_sync_new(int type, pmpkg_t *spkg, void *data) +pmsyncpkg_t *_alpm_sync_new(pmpkgreason_t newreason, pmpkg_t *spkg, alpm_list_t *removes)  {  	pmsyncpkg_t *sync; @@ -55,9 +55,9 @@ pmsyncpkg_t *_alpm_sync_new(int type, pmpkg_t *spkg, void *data)  	CALLOC(sync, 1, sizeof(pmsyncpkg_t), RET_ERR(PM_ERR_MEMORY, NULL)); -	sync->type = type; +	sync->newreason = newreason;  	sync->pkg = spkg; -	sync->data = data; +	sync->removes = removes;  	return(sync);  } @@ -70,32 +70,11 @@ void _alpm_sync_free(pmsyncpkg_t *sync)  		return;  	} -	/* TODO wow this is ugly */ -	if(sync->type == PM_SYNC_TYPE_REPLACE) { -		alpm_list_free_inner(sync->data, (alpm_list_fn_free)_alpm_pkg_free); -		alpm_list_free(sync->data); -		sync->data = NULL; -	} else { -		_alpm_pkg_free(sync->data); -		sync->data = NULL; -	} +	alpm_list_free(sync->removes); +	sync->removes = NULL;  	FREE(sync);  } -static void synclist_free(alpm_list_t *syncpkgs) -{ -	if(syncpkgs) { -		alpm_list_t *tmp; -		for(tmp = syncpkgs; tmp; tmp = alpm_list_next(tmp)) { -			if(tmp->data) { -				_alpm_sync_free(tmp->data); -			} -		} -		alpm_list_free(syncpkgs); -	} - -} -  /* Find recommended replacements for packages during a sync.   */  static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, @@ -147,27 +126,28 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,  					 * the package to replace.  					 */  					pmsyncpkg_t *sync; -					pmpkg_t *dummy = _alpm_pkg_dup(lpkg); -					if(dummy == NULL) { -						pm_errno = PM_ERR_MEMORY; -						synclist_free(*syncpkgs); -						return(-1); -					} +  					/* check if spkg->name is already in the packages list. */  					sync = _alpm_sync_find(*syncpkgs, alpm_pkg_get_name(spkg));  					if(sync) { -						/* found it -- just append to the replaces list */ -						sync->data = alpm_list_add(sync->data, dummy); +						/* found it -- just append to the removes list */ +						sync->removes = alpm_list_add(sync->removes, lpkg); +						/* check the to-be-replaced package's reason field */ +						if(lpkg->reason == PM_PKG_REASON_EXPLICIT) { +							sync->newreason = PM_PKG_REASON_EXPLICIT; +						}  					} else {  						/* none found -- enter pkg into the final sync list */ -						sync = _alpm_sync_new(PM_SYNC_TYPE_REPLACE, spkg, NULL); +						/* copy over reason */ +						sync = _alpm_sync_new(alpm_pkg_get_reason(lpkg), spkg, NULL);  						if(sync == NULL) { -							_alpm_pkg_free(dummy);  							pm_errno = PM_ERR_MEMORY; -							synclist_free(*syncpkgs); +							alpm_list_free_inner(*syncpkgs, (alpm_list_fn_free)_alpm_sync_free); +							alpm_list_free(*syncpkgs); +							*syncpkgs = NULL;  							return(-1);  						} -						sync->data = alpm_list_add(NULL, dummy); +						sync->removes = alpm_list_add(NULL, lpkg);  						*syncpkgs = alpm_list_add(*syncpkgs, sync);  					}  					_alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (to be replaced by %s-%s)\n", @@ -180,6 +160,35 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local,  	return(0);  } +/** Check for new version of pkg in sync repos + * (only the first occurrence is considered in sync) + */ +pmpkg_t SYMEXPORT *alpm_sync_newversion(pmpkg_t *pkg, alpm_list_t *dbs_sync) +{ +	alpm_list_t *i; +	pmpkg_t *spkg = NULL; + +	for(i = dbs_sync; !spkg && i; i = i->next) { +		spkg = _alpm_db_get_pkgfromcache(i->data, alpm_pkg_get_name(pkg)); +	} + +	if(spkg == NULL) { +		_alpm_log(PM_LOG_DEBUG, "'%s' not found in sync db => no upgrade\n", +				alpm_pkg_get_name(pkg)); +		return(NULL); +	} + +	/* compare versions and see if spkg is an upgrade */ +	if(_alpm_pkg_compare_versions(pkg, spkg)) { +		_alpm_log(PM_LOG_DEBUG, "new version of '%s' found (%s => %s)\n", +					alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg), +					alpm_pkg_get_version(spkg)); +		return(spkg); +	} else { +		return(NULL); +	} +} +  /** Get a list of upgradable packages on the current system   * Adds out of date packages to *list.   * @arg list pointer to a list of pmsyncpkg_t. @@ -193,7 +202,7 @@ int SYMEXPORT alpm_sync_sysupgrade(pmdb_t *db_local,  int _alpm_sync_sysupgrade(pmtrans_t *trans,  		pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **syncpkgs)  { -	alpm_list_t *i, *j; +	alpm_list_t *i, *j, *replaced = NULL;  	ALPM_LOG_FUNC; @@ -205,76 +214,61 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans,  		return(-1);  	} -	/* match installed packages with the sync dbs and compare versions */ +	/* compute the to-be-replaced packages for efficiency */ +	for(i = *syncpkgs; i; i = i->next) { +		pmsyncpkg_t *sync = i->data; +		for(j = sync->removes; j; j = j->next) { +			replaced = alpm_list_add(replaced, j->data); +		} +	} + +	/* for all not-replaced local package we check for upgrade */  	_alpm_log(PM_LOG_DEBUG, "checking for package upgrades\n");  	for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) { -		int replace = 0;  		pmpkg_t *local = i->data; -		pmpkg_t *spkg = NULL; -		pmsyncpkg_t *sync; -		for(j = dbs_sync; !spkg && j; j = j->next) { -			spkg = _alpm_db_get_pkgfromcache(j->data, alpm_pkg_get_name(local)); -		} -		if(spkg == NULL) { -			_alpm_log(PM_LOG_DEBUG, "'%s' not found in sync db -- skipping\n", -					alpm_pkg_get_name(local)); -			continue; -		} - -		/* we don't care about a to-be-replaced package's newer version */ -		for(j = *syncpkgs; j && !replace; j=j->next) { -			sync = j->data; -			if(sync->type == PM_SYNC_TYPE_REPLACE) { -				if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->data)) { -					replace = 1; -				} -			} -		} -		if(replace) { +		if(_alpm_pkg_find(alpm_pkg_get_name(local), replaced)) {  			_alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping\n",  					alpm_pkg_get_name(local));  			continue;  		} -		/* compare versions and see if we need to upgrade */ -		if(_alpm_pkg_compare_versions(local, spkg)) { -			_alpm_log(PM_LOG_DEBUG, "%s elected for upgrade (%s => %s)\n", -					alpm_pkg_get_name(local), alpm_pkg_get_version(local), -					alpm_pkg_get_version(spkg)); -			if(!_alpm_sync_find(*syncpkgs, alpm_pkg_get_name(spkg))) { -				/* If package is in the ignorepkg list, skip it */ -				if(_alpm_pkg_should_ignore(spkg)) { -					_alpm_log(PM_LOG_WARNING, _("%s: ignoring package upgrade (%s => %s)\n"), -							alpm_pkg_get_name(local), alpm_pkg_get_version(local), -							alpm_pkg_get_version(spkg)); -					continue; -				} +		pmpkg_t *spkg = alpm_sync_newversion(local, dbs_sync); +		if(spkg) { +			/* we found a new version */ +			/* skip packages in IgnorePkg or in IgnoreGroup */ +			if(_alpm_pkg_should_ignore(spkg)) { +				_alpm_log(PM_LOG_WARNING, _("%s: ignoring package upgrade (%s => %s)\n"), +						alpm_pkg_get_name(local), alpm_pkg_get_version(local), +						alpm_pkg_get_version(spkg)); +				continue; +			} -				pmpkg_t *tmp = _alpm_pkg_dup(local); -				if(tmp == NULL) { -					pm_errno = PM_ERR_MEMORY; -					synclist_free(*syncpkgs); -					return(-1); -				} -				sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, tmp); -				if(sync == NULL) { -					_alpm_pkg_free(tmp); -					pm_errno = PM_ERR_MEMORY; -					synclist_free(*syncpkgs); -					return(-1); -				} -				*syncpkgs = alpm_list_add(*syncpkgs, sync); +			/* add the upgrade package to our pmsyncpkg_t list */ +			if(_alpm_sync_find(*syncpkgs, alpm_pkg_get_name(spkg))) { +				/* it is already there, done */ +				continue; +			} +			/* we can set any reason here, it will be overridden by add_commit */ +			pmsyncpkg_t *sync = _alpm_sync_new(PM_PKG_REASON_EXPLICIT, spkg, NULL); +			if(sync == NULL) { +				alpm_list_free_inner(*syncpkgs, (alpm_list_fn_free)_alpm_sync_free); +				alpm_list_free(*syncpkgs); +				*syncpkgs = NULL; +				alpm_list_free(replaced); +				return(-1);  			} +			*syncpkgs = alpm_list_add(*syncpkgs, sync);  		}  	} +	alpm_list_free(replaced);  	return(0);  }  int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, char *name)  { -	char targline[PKG_FULLNAME_LEN]; +	char *targline;  	char *targ;  	alpm_list_t *j;  	pmpkg_t *local; @@ -287,8 +281,8 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy  	ASSERT(db_local != NULL, RET_ERR(PM_ERR_DB_NULL, -1));  	ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1));  	ASSERT(name != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); +	STRDUP(targline, name, RET_ERR(PM_ERR_MEMORY, -1)); -	strncpy(targline, name, PKG_FULLNAME_LEN);  	targ = strchr(targline, '/');  	if(targ) {  		/* we are looking for a package in a specific database */ @@ -301,13 +295,15 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy  				repo_found = 1;  				spkg = _alpm_db_get_pkgfromcache(db, targ);  				if(spkg == NULL) { -					RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); +					pm_errno = PM_ERR_PKG_NOT_FOUND; +					goto error;  				}  			}  		}  		if(!repo_found) {  			_alpm_log(PM_LOG_ERROR, _("repository '%s' not found\n"), targline); -			RET_ERR(PM_ERR_PKG_REPO_NOT_FOUND, -1); +			pm_errno = PM_ERR_PKG_REPO_NOT_FOUND; +			goto error;  		}  	} else {  		targ = targline; @@ -316,7 +312,8 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy  			spkg = _alpm_db_get_pkgfromcache(db, targ);  		}  		if(spkg == NULL) { -			RET_ERR(PM_ERR_PKG_NOT_FOUND, -1); +			pm_errno = PM_ERR_PKG_NOT_FOUND; +			goto error;  		}  	} @@ -347,36 +344,35 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sy  	/* add the package to the transaction */  	if(!_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) { -		pmpkg_t *dummy = NULL; -		if(local) { -			dummy = _alpm_pkg_dup(local); -			if(dummy == NULL) { -				RET_ERR(PM_ERR_MEMORY, -1); -			} -		} -		sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, dummy); +		sync = _alpm_sync_new(PM_PKG_REASON_EXPLICIT, spkg, NULL);  		if(sync == NULL) { -			_alpm_pkg_free(dummy); -			RET_ERR(PM_ERR_MEMORY, -1); +			goto error;  		}  		_alpm_log(PM_LOG_DEBUG, "adding target '%s' to the transaction set\n",  							alpm_pkg_get_name(spkg));  		trans->packages = alpm_list_add(trans->packages, sync);  	} +	FREE(targline);  	return(0); + +error: +	if(targline) { +		FREE(targline); +	} +	return(-1);  }  /* Helper functions for alpm_list_remove - */ +*/  static int syncpkg_cmp(const void *s1, const void *s2)  {  	const pmsyncpkg_t *sp1 = s1;  	const pmsyncpkg_t *sp2 = s2;  	pmpkg_t *p1, *p2; -  p1 = alpm_sync_get_pkg(sp1); -  p2 = alpm_sync_get_pkg(sp2); +	p1 = alpm_sync_get_pkg(sp1); +	p2 = alpm_sync_get_pkg(sp2);  	return(strcmp(alpm_pkg_get_name(p1), alpm_pkg_get_name(p2)));  } @@ -412,10 +408,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync  		/* build remove list for resolvedeps */  		for(i = trans->packages; i; i = i->next) {  			pmsyncpkg_t *sync = i->data; -			if(sync->type == PM_SYNC_TYPE_REPLACE) { -				for(j = sync->data; j; j = j->next) { -					remove = alpm_list_add(remove, j->data); -				} +			for(j = sync->removes; j; j = j->next) { +				remove = alpm_list_add(remove, j->data);  			}  		} @@ -437,7 +431,7 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync  			/* add the dependencies found by resolvedeps to the transaction set */  			pmpkg_t *spkg = i->data;  			if(!_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) { -				pmsyncpkg_t *sync = _alpm_sync_new(PM_SYNC_TYPE_DEPEND, spkg, NULL); +				pmsyncpkg_t *sync = _alpm_sync_new(PM_PKG_REASON_DEPEND, spkg, NULL);  				if(sync == NULL) {  					ret = -1;  					goto cleanup; @@ -472,180 +466,129 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync  		EVENT(trans, PM_TRANS_EVT_INTERCONFLICTS_START, NULL, NULL);  		_alpm_log(PM_LOG_DEBUG, "looking for conflicts\n"); -		deps = _alpm_checkconflicts(db_local, list); -		if(deps) { -			int errorout = 0; -			alpm_list_t *asked = NULL; -			pmconflict_t *conflict = NULL; - -			for(i = deps; i && !errorout; i = i->next) { -				pmsyncpkg_t *sync; -				pmpkg_t *found = NULL; - -				conflict = i->data; -				_alpm_log(PM_LOG_DEBUG, "package '%s' conflicts with '%s'\n", -						conflict->package1, conflict->package2); -				/* check if the conflicting package is about to be removed/replaced. -				 * if so, then just ignore it. */ -				for(j = trans->packages; j && !found; j = j->next) { -					sync = j->data; -					if(sync->type == PM_SYNC_TYPE_REPLACE) { -						found = _alpm_pkg_find(conflict->package2, sync->data); -					} -				} -				if(found) { -					_alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping\n", -							alpm_pkg_get_name(found)); -					continue; -				} -				sync = _alpm_sync_find(trans->packages, conflict->package1); -				if(sync == NULL) { -					_alpm_log(PM_LOG_DEBUG, "'%s' not found in transaction set -- skipping\n", -					          conflict->package1); -					continue; -				} -				pmpkg_t *local = _alpm_db_get_pkgfromcache(db_local, conflict->package2); -				/* check if this package provides the package it's conflicting with */ -				if(alpm_list_find(alpm_pkg_get_provides(sync->pkg), -							conflict->package2, _alpm_prov_cmp)) { -					/* treat like a replaces item so requiredby fields are -					 * inherited properly. */ -					_alpm_log(PM_LOG_DEBUG, "package '%s' provides its own conflict\n", -							conflict->package1); -					if(!local) { -						char *rmpkg = NULL; -						void *target, *depend; -						/* hmmm, package2 isn't installed, so it must be conflicting -						 * with another package in our final list.  For example: -						 * -						 *     pacman -S blackbox xfree86 -						 * -						 * If no x-servers are installed and blackbox pulls in xorg, then -						 * xorg and xfree86 will conflict with each other.  In this case, -						 * we should follow the user's preference and rip xorg out of final, -						 * opting for xfree86 instead. -						 */ - -						/* figure out which one was requested in targets. If they both -						 * were, then it's still an unresolvable conflict. */ -						target = alpm_list_find_str(trans->targets, conflict->package1); -						depend = alpm_list_find_str(trans->targets, conflict->package2); -						if(depend && !target) { -							_alpm_log(PM_LOG_DEBUG, "'%s' is in the target list -- keeping it\n", -								conflict->package2); -							/* remove conflict->package1 */ -							rmpkg = conflict->package1; -						} else if(target && !depend) { -							_alpm_log(PM_LOG_DEBUG, "'%s' is in the target list -- keeping it\n", -								conflict->package1); -							/* remove conflict->package2 */ -							rmpkg = conflict->package2; -						} else { -							/* miss->target2 is not needed, miss->target already provides -							 * it, let's resolve the conflict */ -							rmpkg = conflict->package2; -						} -						if(rmpkg) { -							pmsyncpkg_t *rsync = _alpm_sync_find(trans->packages, rmpkg); -							if(rsync) { -								void *vpkg; -								_alpm_log(PM_LOG_DEBUG, "removing '%s' from target list\n", -										rsync->pkg->name); -								trans->packages = alpm_list_remove(trans->packages, rsync, -										syncpkg_cmp, &vpkg); -								_alpm_sync_free(vpkg); -							} -							continue; -						} +		/* 1. check for conflicts in the target list */ +		_alpm_log(PM_LOG_DEBUG, "check targets vs targets\n"); +		deps = _alpm_innerconflicts(list); + +		for(i = deps; i; i = i->next) { +			pmconflict_t *conflict = i->data; +			pmsyncpkg_t *rsync, *sync, *sync1, *sync2; + +			/* have we already removed one of the conflicting targets? */ +			sync1 = _alpm_sync_find(trans->packages, conflict->package1); +			sync2 = _alpm_sync_find(trans->packages, conflict->package2); +			if(!sync1 || !sync2) { +				continue; +			} + +			_alpm_log(PM_LOG_DEBUG, "conflicting packages in the sync list: '%s' <-> '%s'\n", +					conflict->package1, conflict->package2); + +			/* if sync1 provides sync2, we remove sync2 from the targets, and vice versa */ +			if(alpm_list_find(alpm_pkg_get_provides(sync1->pkg), +						conflict->package2, _alpm_prov_cmp)) { +				rsync = sync2; +				sync = sync1; +			} else if(alpm_list_find(alpm_pkg_get_provides(sync2->pkg), +						conflict->package1, _alpm_prov_cmp)) { +				rsync = sync1; +				sync = sync2; +			} else { +				_alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected\n")); +				pm_errno = PM_ERR_CONFLICTING_DEPS; +				ret = -1; +				if(data) { +					pmconflict_t *newconflict = _alpm_conflict_dup(conflict); +					if(newconflict) { +						*data = alpm_list_add(*data, newconflict);  					}  				} -				/* It's a conflict -- see if they want to remove it */ -				_alpm_log(PM_LOG_DEBUG, "resolving package '%s' conflict\n", -						conflict->package1); -				if(local) { -					int doremove = 0; -					if(!alpm_list_find_str(asked, conflict->package2)) { -						QUESTION(trans, PM_TRANS_CONV_CONFLICT_PKG, conflict->package1, -								conflict->package2, NULL, &doremove); -						asked = alpm_list_add(asked, strdup(conflict->package2)); -						if(doremove) { -							pmpkg_t *q = _alpm_pkg_dup(local); -							if(sync->type != PM_SYNC_TYPE_REPLACE) { -								/* switch this sync type to REPLACE */ -								sync->type = PM_SYNC_TYPE_REPLACE; -								_alpm_pkg_free(sync->data); -								sync->data = NULL; -							} -							/* append to the replaces list */ -							_alpm_log(PM_LOG_DEBUG, "electing '%s' for removal\n", -									conflict->package2); -							sync->data = alpm_list_add(sync->data, q); -							/* see if the package is in the current target list */ -							pmsyncpkg_t *rsync = _alpm_sync_find(trans->packages, -									conflict->package2); -							if(rsync) { -								/* remove it from the target list */ -								void *vpkg; -								_alpm_log(PM_LOG_DEBUG, "removing '%s' from target list\n", -										conflict->package2); -								trans->packages = alpm_list_remove(trans->packages, rsync, -										syncpkg_cmp, &vpkg); -								_alpm_sync_free(vpkg); -							} -						} else { -							/* abort */ -							_alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected\n")); -							errorout = 1; -						} -					} -				} else { -					_alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected\n")); -					errorout = 1; +				alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_conflict_free); +				alpm_list_free(deps); +				goto cleanup; +			} + +			_alpm_log(PM_LOG_DEBUG, "removing '%s' from target list\n", rsync->pkg->name); +			/* Only prints a warning if rsync is an explicit target. */ +			if(alpm_list_find_str(trans->targets, rsync->pkg->name)) { +				_alpm_log(PM_LOG_WARNING, +						_("removing '%s' from target list because it conflicts with '%s'\n"), +						rsync->pkg->name, sync->pkg->name); +			} +			void *vpkg; +			trans->packages = alpm_list_remove(trans->packages, rsync, +					syncpkg_cmp, &vpkg); +			pmsyncpkg_t *syncpkg = vpkg; +			list = alpm_list_remove(list, syncpkg->pkg, _alpm_pkg_cmp, NULL); +			_alpm_sync_free(syncpkg); +			continue; +		} + +		alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_conflict_free); +		alpm_list_free(deps); +		deps = NULL; + +		/* 2. we check for target vs db conflicts (and resolve)*/ +		_alpm_log(PM_LOG_DEBUG, "check targets vs db and db vs targets\n"); +		deps = _alpm_outerconflicts(db_local, list); + +		for(i = deps; i; i = i->next) { +			pmconflict_t *conflict = i->data; + +			/* if conflict->package2 (the local package) is not elected for removal, +			   we ask the user */ +			int found = 0; +			for(j = trans->packages; j && !found; j = j->next) { +				pmsyncpkg_t *sync = j->data; +				if(_alpm_pkg_find(conflict->package2, sync->removes)) { +					found = 1;  				}  			} -			if(errorout) { -				/* The last conflict was unresolvable, so we duplicate it and add it to *data */ +			if(found) { +				continue; +			} + +			_alpm_log(PM_LOG_DEBUG, "package '%s' conflicts with '%s'\n", +					conflict->package1, conflict->package2); + +			pmsyncpkg_t *sync = _alpm_sync_find(trans->packages, conflict->package1); +			pmpkg_t *local = _alpm_db_get_pkgfromcache(db_local, conflict->package2); +			int doremove = 0; +			QUESTION(trans, PM_TRANS_CONV_CONFLICT_PKG, conflict->package1, +								conflict->package2, NULL, &doremove); +			if(doremove) { +				/* append to the removes list */ +				_alpm_log(PM_LOG_DEBUG, "electing '%s' for removal\n", conflict->package2); +				sync->removes = alpm_list_add(sync->removes, local); +			} else { /* abort */ +				_alpm_log(PM_LOG_ERROR, _("unresolvable package conflicts detected\n"));  				pm_errno = PM_ERR_CONFLICTING_DEPS; +				ret = -1;  				if(data) { -					pmconflict_t *lastconflict = conflict; -					if((conflict = malloc(sizeof(pmconflict_t))) == NULL) { -						_alpm_log(PM_LOG_ERROR, _("malloc failure: could not allocate %zd bytes\n"), -								sizeof(pmconflict_t)); -						FREELIST(*data); -						pm_errno = PM_ERR_MEMORY; -					} else { -						*conflict = *lastconflict; -						*data = alpm_list_add(*data, conflict); +					pmconflict_t *newconflict = _alpm_conflict_dup(conflict); +					if(newconflict) { +						*data = alpm_list_add(*data, newconflict);  					}  				} -				FREELIST(asked); -				FREELIST(deps); -				ret = -1; +				alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_conflict_free); +				alpm_list_free(deps);  				goto cleanup;  			} -			FREELIST(asked); -			FREELIST(deps);  		}  		EVENT(trans, PM_TRANS_EVT_INTERCONFLICTS_DONE, NULL, NULL); +		alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_conflict_free); +		alpm_list_free(deps);  	}  	if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) { -		/* rebuild remove and list */ -		alpm_list_free(list); -		list = NULL; -		for(i = trans->packages; i; i = i->next) { -			pmsyncpkg_t *sync = i->data; -			list = alpm_list_add(list, sync->pkg); -		} +		/* rebuild remove list */  		alpm_list_free(remove);  		remove = NULL;  		for(i = trans->packages; i; i = i->next) {  			pmsyncpkg_t *sync = i->data; -			if(sync->type == PM_SYNC_TYPE_REPLACE) { -				for(j = sync->data; j; j = j->next) { -					remove = alpm_list_add(remove, j->data); -				} +			for(j = sync->removes; j; j = j->next) { +				remove = alpm_list_add(remove, j->data);  			}  		} @@ -657,7 +600,8 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync  			if(data) {  				*data = deps;  			} else { -				FREELIST(deps); +				alpm_list_free_inner(deps, (alpm_list_fn_free)_alpm_depmiss_free); +				alpm_list_free(deps);  			}  			goto cleanup;  		} @@ -778,7 +722,7 @@ static int apply_deltas(pmtrans_t *trans, alpm_list_t *patches)  		pmpkg_t *pkg;  		pmdelta_t *d;  		char command[PATH_MAX], fname[PATH_MAX]; -		char pkgfilename[PKG_FILENAME_LEN]; +		char pkgfilename[PATH_MAX];  		pkg = alpm_list_getdata(p);  		p = alpm_list_next(p); @@ -813,7 +757,7 @@ static int apply_deltas(pmtrans_t *trans, alpm_list_t *patches)  		_alpm_log(PM_LOG_DEBUG, _("command: %s\n"), command); -		snprintf(pkgfilename, PKG_FILENAME_LEN, "%s-%s-%s" PKGEXT, +		snprintf(pkgfilename, PATH_MAX, "%s-%s-%s" PKGEXT,  				pkg->name, d->to, pkg->arch);  		EVENT(trans, PM_TRANS_EVT_DELTA_PATCH_START, pkgfilename, d->filename); @@ -1130,7 +1074,6 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)  	tr = _alpm_trans_new();  	if(tr == NULL) {  		_alpm_log(PM_LOG_ERROR, _("could not create removal transaction\n")); -		pm_errno = PM_ERR_MEMORY;  		goto error;  	} @@ -1141,16 +1084,14 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)  	for(i = trans->packages; i; i = i->next) {  		pmsyncpkg_t *sync = i->data; -		if(sync->type == PM_SYNC_TYPE_REPLACE) { -			alpm_list_t *j; -			for(j = sync->data; j; j = j->next) { -				pmpkg_t *pkg = j->data; -				if(!_alpm_pkg_find(pkg->name, tr->packages)) { -					if(_alpm_trans_addtarget(tr, pkg->name) == -1) { -						goto error; -					} -					replaces++; +		alpm_list_t *j; +		for(j = sync->removes; j; j = j->next) { +			pmpkg_t *pkg = j->data; +			if(!_alpm_pkg_find(pkg->name, tr->packages)) { +				if(_alpm_trans_addtarget(tr, pkg->name) == -1) { +					goto error;  				} +				replaces++;  			}  		}  	} @@ -1175,7 +1116,6 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)  	tr = _alpm_trans_new();  	if(tr == NULL) {  		_alpm_log(PM_LOG_ERROR, _("could not create transaction\n")); -		pm_errno = PM_ERR_MEMORY;  		goto error;  	}  	if(_alpm_trans_init(tr, PM_TRANS_TYPE_UPGRADE, trans->flags | PM_TRANS_FLAG_NODEPS, trans->cb_event, trans->cb_conv, trans->cb_progress) == -1) { @@ -1201,9 +1141,7 @@ int _alpm_sync_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data)  		/* using alpm_list_last() is ok because addtarget() adds the new target at the  		 * end of the tr->packages list */  		spkg = alpm_list_last(tr->packages)->data; -		if(sync->type == PM_SYNC_TYPE_DEPEND) { -			spkg->reason = PM_PKG_REASON_DEPEND; -		} +		spkg->reason = sync->newreason;  	}  	if(_alpm_trans_prepare(tr, data) == -1) {  		_alpm_log(PM_LOG_ERROR, _("could not prepare transaction\n")); @@ -1246,14 +1184,6 @@ pmsyncpkg_t *_alpm_sync_find(alpm_list_t *syncpkgs, const char* pkgname)  	return(NULL); /* not found */  } -pmsynctype_t SYMEXPORT alpm_sync_get_type(const pmsyncpkg_t *sync) -{ -	/* Sanity checks */ -	ASSERT(sync != NULL, return(-1)); - -	return sync->type; -} -  pmpkg_t SYMEXPORT *alpm_sync_get_pkg(const pmsyncpkg_t *sync)  {  	/* Sanity checks */ @@ -1262,12 +1192,12 @@ pmpkg_t SYMEXPORT *alpm_sync_get_pkg(const pmsyncpkg_t *sync)  	return sync->pkg;  } -void SYMEXPORT *alpm_sync_get_data(const pmsyncpkg_t *sync) +alpm_list_t SYMEXPORT *alpm_sync_get_removes(const pmsyncpkg_t *sync)  {  	/* Sanity checks */  	ASSERT(sync != NULL, return(NULL)); -	return sync->data; +	return sync->removes;  }  /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libalpm/sync.h b/lib/libalpm/sync.h index a6a3e74f..b71f0ef2 100644 --- a/lib/libalpm/sync.h +++ b/lib/libalpm/sync.h @@ -25,12 +25,12 @@  /* Sync package */  struct __pmsyncpkg_t { -	pmsynctype_t type; +	pmpkgreason_t newreason;  	pmpkg_t *pkg; -	void *data; +	alpm_list_t *removes;  }; -pmsyncpkg_t *_alpm_sync_new(int type, pmpkg_t *spkg, void *data); +pmsyncpkg_t *_alpm_sync_new(pmpkgreason_t newreason, pmpkg_t *spkg, alpm_list_t *removes);  void _alpm_sync_free(pmsyncpkg_t *data);  int _alpm_sync_sysupgrade(pmtrans_t *trans, diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index ecc40a0f..52dbe7a9 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -253,7 +253,8 @@ void _alpm_trans_free(pmtrans_t *trans)  	FREELIST(trans->targets);  	if(trans->type == PM_TRANS_TYPE_SYNC) {  		alpm_list_free_inner(trans->packages, (alpm_list_fn_free)_alpm_sync_free); -	} else { +	} else if (trans->type == PM_TRANS_TYPE_REMOVE || +			trans->type == PM_TRANS_TYPE_REMOVEUPGRADE) {  		alpm_list_free_inner(trans->packages, (alpm_list_fn_free)_alpm_pkg_free);  	}  	alpm_list_free(trans->packages); diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h index e9e0af1f..4a06e3b0 100644 --- a/lib/libalpm/util.h +++ b/lib/libalpm/util.h @@ -43,7 +43,8 @@  #define MALLOC(p, s, action) do { p = calloc(1, s); if(p == NULL) { ALLOC_FAIL(s); action; } } while(0)  #define CALLOC(p, l, s, action) do { p = calloc(l, s); if(p == NULL) { ALLOC_FAIL(s); action; } } while(0) -#define STRDUP(r, s, action) do { r = strdup(s); if(r == NULL) { ALLOC_FAIL(strlen(s)); action; } } while(0) +/* This strdup macro is NULL safe- copying NULL will yield NULL */ +#define STRDUP(r, s, action) do { if(s != NULL) { r = strdup(s); if(r == NULL) { ALLOC_FAIL(strlen(s)); action; } } else { r = NULL; } } while(0)  #define FREE(p) do { if(p) { free(p); p = NULL; } } while(0) @@ -2,7 +2,7 @@  # NOTE: Changing this file will not affect anything until you rerun configure.  #  # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007  Free Software Foundation, Inc. +# 2007, 2008  Free Software Foundation, Inc.  # Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996  #  # This program is free software; you can redistribute it and/or modify @@ -43,8 +43,8 @@ EXIT_FAILURE=1  PROGRAM=ltmain.sh  PACKAGE=libtool -VERSION=1.5.24 -TIMESTAMP=" (1.1220.2.455 2007/06/24 02:13:29)" +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.492 2008/01/30 06:40:56)"  # Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE).  if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then @@ -113,15 +113,21 @@ esac  # These must not be set unconditionally because not all systems understand  # e.g. LANG=C (notably SCO).  # We save the old values to restore during execute mode. -for lt_var in LANG LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +lt_env= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES  do    eval "if test \"\${$lt_var+set}\" = set; then  	  save_$lt_var=\$$lt_var +	  lt_env=\"$lt_var=\$$lt_var \$lt_env\"  	  $lt_var=C  	  export $lt_var  	fi"  done +if test -n "$lt_env"; then +  lt_env="env $lt_env" +fi +  # Make sure IFS has a sensible default  lt_nl='  ' @@ -485,7 +491,7 @@ do      echo "\  $PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP -Copyright (C) 2007  Free Software Foundation, Inc. +Copyright (C) 2008  Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."      exit $? @@ -788,6 +794,7 @@ if test -z "$show_help"; then      *.for) xform=for ;;      *.java) xform=java ;;      *.obj) xform=obj ;; +    *.sx) xform=sx ;;      esac      libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` @@ -956,7 +963,7 @@ EOF        $run $rm "$lobj" "$output_obj"        $show "$command" -      if $run eval "$command"; then : +      if $run eval $lt_env "$command"; then :        else  	test -n "$output_obj" && $run $rm $removelist  	exit $EXIT_FAILURE @@ -1028,7 +1035,7 @@ EOF        command="$command$suppress_output"        $run $rm "$obj" "$output_obj"        $show "$command" -      if $run eval "$command"; then : +      if $run eval $lt_env "$command"; then :        else  	$run $rm $removelist  	exit $EXIT_FAILURE @@ -1161,6 +1168,7 @@ EOF      thread_safe=no      vinfo=      vinfo_number=no +    single_module="${wl}-single_module"      func_infer_tag $base_compile @@ -1646,6 +1654,11 @@ EOF  	continue  	;; +      -multi_module) +	single_module="${wl}-multi_module" +	continue +	;; +        -module)  	module=yes  	continue @@ -2149,7 +2162,12 @@ EOF  	    continue  	  fi  	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` -	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do +	  if test "$linkmode" = lib; then +	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" +	  else +	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" +	  fi +	  for searchdir in $searchdirs; do  	    for search_ext in .la $std_shrext .so .a; do  	      # Search the libtool library  	      lib="$searchdir/lib${name}${search_ext}" @@ -2945,12 +2963,18 @@ EOF  		  # we do not want to link against static libs,  		  # but need to link against shared  		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` +		  eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`  		  if test -n "$deplibrary_names" ; then  		    for tmp in $deplibrary_names ; do  		      depdepl=$tmp  		    done -		    if test -f "$path/$depdepl" ; then +		    if test -f "$deplibdir/$depdepl" ; then +		      depdepl="$deplibdir/$depdepl" +		    elif test -f "$path/$depdepl" ; then  		      depdepl="$path/$depdepl" +		    else +		      # Can't find it, oh well... +		      depdepl=  		    fi  		    # do not add paths which are already there  		    case " $newlib_search_path " in @@ -3098,9 +3122,10 @@ EOF      case $linkmode in      oldlib) -      if test -n "$deplibs"; then -	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 -      fi +      case " $deplibs" in +      *\ -l* | *\ -L*) +	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; +      esac        if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then  	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 @@ -4237,9 +4262,10 @@ EOF        ;;      obj) -      if test -n "$deplibs"; then -	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 -      fi +      case " $deplibs" in +      *\ -l* | *\ -L*) +	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; +      esac        if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then  	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 @@ -6478,7 +6504,7 @@ relink_command=\"$relink_command\""        fi        # Restore saved environment variables -      for lt_var in LANG LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES        do  	eval "if test \"\${save_$lt_var+set}\" = set; then  		$lt_var=\$save_$lt_var; export $lt_var diff --git a/pactest/pmtest.py b/pactest/pmtest.py index be36914b..d54d7ba2 100755 --- a/pactest/pmtest.py +++ b/pactest/pmtest.py @@ -233,11 +233,6 @@ class pmtest:          vprint("\tretcode = %s" % self.retcode)          os.chdir(curdir) -        # Check if pacman failed because of bad permissions -        if self.retcode and not pacman["nolog"] \ -           and grep(os.path.join(self.root, LOGFILE), -                    "you cannot perform this operation unless you are root"): -            print "\tERROR: pacman support for fakeroot is not disabled"          # Check if the lock is still there          if os.path.isfile(PM_LOCK):              print "\tERROR: %s not removed" % PM_LOCK diff --git a/pactest/tests/deptest001.py b/pactest/tests/deptest001.py index db0b7684..18569bea 100644 --- a/pactest/tests/deptest001.py +++ b/pactest/tests/deptest001.py @@ -1,20 +1,16 @@  self.description = "test deptest (-T) functionality" -sp1 = pmpkg("pkg1") -sp1.depends = ["dep"] -self.addpkg2db("sync", sp1) +lp1 = pmpkg("pkg1") +self.addpkg2db("local", lp1) -sp1dep = pmpkg("dep") -self.addpkg2db("sync", sp1dep) +lp3 = pmpkg("pkg3", "2.0-1") +lp3.provides = ("prov=3.0") +self.addpkg2db("local", lp3) -sp2 = pmpkg("pkg2") -self.addpkg2db("sync", sp2) - -lp2 = pmpkg("pkg2") -self.addpkg2db("local", lp2) - -self.args = "-T pkg1 pkg2" +self.args = "-T pkg1 pkg2 pkg3\>2.1 prov\>\=3.0"  self.addrule("PACMAN_RETCODE=127") -self.addrule("PACMAN_OUTPUT=pkg1") -self.addrule("!PACMAN_OUTPUT=pkg2") +self.addrule("!PACMAN_OUTPUT=pkg1") +self.addrule("PACMAN_OUTPUT=pkg2") +self.addrule("PACMAN_OUTPUT=pkg3") +self.addrule("!PACMAN_OUTPUT=prov") diff --git a/pactest/tests/reason001.py b/pactest/tests/reason001.py new file mode 100644 index 00000000..40433f5e --- /dev/null +++ b/pactest/tests/reason001.py @@ -0,0 +1,16 @@ +self.description = "Copy reason (to-be-replaced -> replacement)" + +sp = pmpkg("libfoo-ng") +sp.replaces = [ "libfoo" ] +self.addpkg2db("sync", sp) + +lp = pmpkg("libfoo") +lp.reason = 1 +self.addpkg2db("local", lp) + +self.args = "-Su" + +self.addrule("PACMAN_RETCODE=0") +self.addrule("!PKG_EXIST=libfoo") +self.addrule("PKG_EXIST=libfoo-ng") +self.addrule("PKG_REASON=libfoo-ng|1") diff --git a/pactest/tests/remove049.py b/pactest/tests/remove049.py new file mode 100644 index 00000000..724f8da2 --- /dev/null +++ b/pactest/tests/remove049.py @@ -0,0 +1,19 @@ +self.description = "-Ru test" + +lp1 = pmpkg("pkg1") +lp1.requiredby = [ "pkg3" ] +self.addpkg2db("local", lp1) + +lp2 = pmpkg("pkg2") +self.addpkg2db("local", lp2) + +lp3 = pmpkg("pkg3") +lp3.depends = [ "pkg1" ] +self.addpkg2db("local", lp3) + +self.args = "-Ru pkg1 pkg2" + +self.addrule("PACMAN_RETCODE=0") +self.addrule("PKG_EXIST=pkg1") +self.addrule("!PKG_EXIST=pkg2") +self.addrule("PKG_EXIST=pkg3")
\ No newline at end of file diff --git a/pactest/tests/sync031.py b/pactest/tests/sync031.py new file mode 100644 index 00000000..4aa2ee39 --- /dev/null +++ b/pactest/tests/sync031.py @@ -0,0 +1,19 @@ +self.description = "Sync packages explicitly" + +lp1 = pmpkg("pkg1") +lp1.reason = 1 +self.addpkg2db("local", lp1) + +p1 = pmpkg("pkg1", "1.0-2") +p2 = pmpkg("pkg2", "1.0-2") + +for p in p1, p2: +	self.addpkg2db("sync", p) + +self.args = "-S --asexplicit %s" % " ".join([p.name for p in p1, p2]) + +self.addrule("PACMAN_RETCODE=0") +self.addrule("PKG_VERSION=pkg1|1.0-2") +self.addrule("PKG_VERSION=pkg2|1.0-2") +self.addrule("PKG_REASON=pkg1|0") +self.addrule("PKG_REASON=pkg2|0") diff --git a/pactest/tests/sync893.py b/pactest/tests/sync893.py index 9420b74c..1c8494a3 100644 --- a/pactest/tests/sync893.py +++ b/pactest/tests/sync893.py @@ -15,6 +15,6 @@ self.addpkg2db("local", lp2)  self.args = "-S %s" % " ".join([p.name for p in sp1, sp2]) -self.addrule("PACMAN_RETCODE=0") +self.addrule("PACMAN_RETCODE=1")  self.addrule("PKG_EXIST=pkg1") -self.addrule("!PKG_EXIST=pkg2") +self.addrule("PKG_EXIST=pkg2") diff --git a/pactest/tests/sync897.py b/pactest/tests/sync897.py index 3cf43929..f7bd3d71 100644 --- a/pactest/tests/sync897.py +++ b/pactest/tests/sync897.py @@ -18,7 +18,7 @@ self.addpkg2db("local", lp3)  self.args = "-Su" -self.addrule("PACMAN_RETCODE=0") +self.addrule("PACMAN_RETCODE=1")  self.addrule("PKG_EXIST=pkg1") -self.addrule("!PKG_EXIST=pkg2") -self.addrule("!PKG_EXIST=pkg3") +self.addrule("PKG_EXIST=pkg2") +self.addrule("PKG_EXIST=pkg3") diff --git a/pactest/tests/upgrade032.py b/pactest/tests/upgrade032.py new file mode 100644 index 00000000..85e048e0 --- /dev/null +++ b/pactest/tests/upgrade032.py @@ -0,0 +1,19 @@ +self.description = "Install packages explicitly" + +lp1 = pmpkg("pkg1") +lp1.reason = 1 +self.addpkg2db("local", lp1) + +p1 = pmpkg("pkg1", "1.0-2") +p2 = pmpkg("pkg2", "1.0-2") + +for p in p1, p2: +	self.addpkg(p) + +self.args = "-U --asexplicit %s" % " ".join([p.filename() for p in p1, p2]) + +self.addrule("PACMAN_RETCODE=0") +self.addrule("PKG_VERSION=pkg1|1.0-2") +self.addrule("PKG_VERSION=pkg2|1.0-2") +self.addrule("PKG_REASON=pkg1|0") +self.addrule("PKG_REASON=pkg2|0") diff --git a/po/POTFILES.in b/po/POTFILES.in index 359a8041..4d4227d1 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -13,9 +13,7 @@ src/pacman/sync.c  src/pacman/util.c  # scripts with gettext translations -scripts/gensync.sh.in  scripts/makepkg.sh.in  scripts/pacman-optimize.sh.in  scripts/repo-add.sh.in  scripts/repo-remove.sh.in -scripts/updatesync.sh.in diff --git a/scripts/.gitignore b/scripts/.gitignore index 53164a41..f2f19fd8 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -1,7 +1,5 @@ -gensync  makepkg  pacman-optimize  rankmirrors  repo-add  repo-remove -updatesync diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 24b9c12d..3185a476 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -2,22 +2,18 @@  AUTOMAKE_OPTIONS = std-options  bin_SCRIPTS = \ -	gensync \  	makepkg \  	pacman-optimize \  	rankmirrors \  	repo-add \ -	repo-remove \ -	updatesync +	repo-remove  EXTRA_DIST = \ -	gensync.sh.in \  	makepkg.sh.in \  	pacman-optimize.sh.in \  	rankmirrors.py.in \  	repo-add.sh.in \ -	repo-remove.sh.in \ -	updatesync.sh.in +	repo-remove.sh.in  # Files that should be removed, but which Automake does not know.  MOSTLYCLEANFILES = $(bin_SCRIPTS) *.tmp @@ -48,13 +44,11 @@ $(bin_SCRIPTS): Makefile  	chmod a-w $@.tmp  	mv $@.tmp $@ -gensync: $(srcdir)/gensync.sh.in  makepkg: $(srcdir)/makepkg.sh.in  pacman-optimize: $(srcdir)/pacman-optimize.sh.in  rankmirrors: $(srcdir)/rankmirrors.py.in  repo-add: $(srcdir)/repo-add.sh.in  repo-remove: $(srcdir)/repo-remove.sh.in  re-pacman: $(srcdir)/re-pacman.sh.in -updatesync: $(srcdir)/updatesync.sh.in  # vim:set ts=2 sw=2 noet: diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in index 63d94d37..f837262d 100644 --- a/scripts/repo-add.sh.in +++ b/scripts/repo-add.sh.in @@ -25,7 +25,6 @@ export TEXTDOMAINDIR='@localedir@'  myver='@PACKAGE_VERSION@'  confdir='@sysconfdir@' -FORCE=0  REPO_DB_FILE=""  # ensure we have a sane umask set @@ -54,14 +53,10 @@ error() {  # print usage instructions  usage() {  	printf "repo-add (pacman) %s\n\n" "$myver" -	printf "$(gettext "Usage: %s <path-to-db> [--force] <package> ...\n\n")" "$0" +	printf "$(gettext "Usage: %s <path-to-db> <package> ...\n\n")" "$0"  	printf "$(gettext "\  repo-add will update a package database by reading a package file.\n\  Multiple packages to add can be specified on the command line.\n\n")" -	printf "$(gettext "\ -The --force flag will add a 'force' entry to the sync database, which\n\ -tells pacman to skip its internal version number checking and update\n\ -the package regardless.\n\n")"  	echo "$(gettext "Example:  repo-add /path/to/repo.db.tar.gz pacman-3.0.0.pkg.tar.gz")"  } @@ -209,7 +204,7 @@ db_write_entry()  	[ -n "$builddate" ] && echo -e "%BUILDDATE%\n$builddate\n" >>desc  	[ -n "$packager" ] && echo -e "%PACKAGER%\n$packager\n" >>desc  	write_list_entry "REPLACES" "$_replaces" "desc" -	[ $FORCE -eq 1 -o -n "$force" ] && echo -e "%FORCE%\n" >>desc +	[ -n "$force" ] && echo -e "%FORCE%\n" >>desc  	# create depends entry  	msg2 "$(gettext "Creating 'depends' db entry...")" @@ -298,7 +293,8 @@ success=0  # parse arguments  for arg in "$@"; do  	if [ "$arg" == "--force" -o "$arg" == "-f" ]; then -		FORCE=1 +		warning "$(gettext "the -f and --force options are no longer recognized")" +		msg2 "$(gettext "use options=(force) in the PKGBUILD instead")"  	elif [ -z "$REPO_DB_FILE" ]; then  		REPO_DB_FILE=$(readlink -f "$arg")  		if ! test_repo_db_file; then diff --git a/src/pacman/callback.c b/src/pacman/callback.c index 01e65a95..b16c79ee 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -34,9 +34,6 @@  #include "util.h"  #include "conf.h" -/* TODO this should not have to be defined twice- trans.c & log.c */ -#define LOG_STR_LEN 256 -  /* download progress bar */  static float rate_last;  static int xfered_last; @@ -157,8 +154,6 @@ static void fill_progress(const int graph_percent, const int display_percent,  /* callback to handle messages/notifications from libalpm transactions */  void cb_trans_evt(pmtransevt_t event, void *data1, void *data2)  { -	char str[LOG_STR_LEN] = ""; -  	switch(event) {  		case PM_TRANS_EVT_CHECKDEPS_START:  		  printf(_("checking dependencies...\n")); @@ -180,10 +175,9 @@ void cb_trans_evt(pmtransevt_t event, void *data1, void *data2)  			}  			break;  		case PM_TRANS_EVT_ADD_DONE: -			snprintf(str, LOG_STR_LEN, "installed %s (%s)\n", +			alpm_logaction("installed %s (%s)\n",  			         alpm_pkg_get_name(data1),  			         alpm_pkg_get_version(data1)); -			alpm_logaction(str);  			break;  		case PM_TRANS_EVT_REMOVE_START:  			if(config->noprogressbar) { @@ -191,10 +185,9 @@ void cb_trans_evt(pmtransevt_t event, void *data1, void *data2)  			}  			break;  		case PM_TRANS_EVT_REMOVE_DONE: -			snprintf(str, LOG_STR_LEN, "removed %s (%s)\n", +			alpm_logaction("removed %s (%s)\n",  			         alpm_pkg_get_name(data1),  			         alpm_pkg_get_version(data1)); -			alpm_logaction(str);  			break;  		case PM_TRANS_EVT_UPGRADE_START:  			if(config->noprogressbar) { @@ -202,11 +195,10 @@ void cb_trans_evt(pmtransevt_t event, void *data1, void *data2)  			}  			break;  		case PM_TRANS_EVT_UPGRADE_DONE: -			snprintf(str, LOG_STR_LEN, "upgraded %s (%s -> %s)\n", +			alpm_logaction("upgraded %s (%s -> %s)\n",  			         (char *)alpm_pkg_get_name(data1),  			         (char *)alpm_pkg_get_version(data2),  			         (char *)alpm_pkg_get_version(data1)); -			alpm_logaction(str);  			break;  		case PM_TRANS_EVT_INTEGRITY_START:  			printf(_("checking package integrity...\n")); @@ -255,34 +247,28 @@ void cb_trans_evt(pmtransevt_t event, void *data1, void *data2)  void cb_trans_conv(pmtransconv_t event, void *data1, void *data2,                     void *data3, int *response)  { -	char str[LOG_STR_LEN] = ""; -  	switch(event) {  		case PM_TRANS_CONV_INSTALL_IGNOREPKG:  			if(data2) {  				/* TODO we take this route based on data2 being not null? WTF */ -				snprintf(str, LOG_STR_LEN, _(":: %s requires installing %s from IgnorePkg/IgnoreGroup. Install anyway? [Y/n] "), +				*response = yesno(_(":: %s requires installing %s from IgnorePkg/IgnoreGroup. Install anyway? [Y/n] "),  						alpm_pkg_get_name(data1),  						alpm_pkg_get_name(data2)); -				*response = yesno(str);  			} else { -				snprintf(str, LOG_STR_LEN, _(":: %s is in IgnorePkg/IgnoreGroup. Install anyway? [Y/n] "), +				*response = yesno(_(":: %s is in IgnorePkg/IgnoreGroup. Install anyway? [Y/n] "),  						alpm_pkg_get_name(data1)); -				*response = yesno(str);  			}  			break;  		case PM_TRANS_CONV_REMOVE_HOLDPKG: -			snprintf(str, LOG_STR_LEN, _(":: %s is designated as a HoldPkg. Remove anyway? [Y/n] "), +			*response = yesno(_(":: %s is designated as a HoldPkg. Remove anyway? [Y/n] "),  					alpm_pkg_get_name(data1)); -			*response = yesno(str);  			break;  		case PM_TRANS_CONV_REPLACE_PKG:  			if(!config->noconfirm) { -				snprintf(str, LOG_STR_LEN, _(":: Replace %s with %s/%s? [Y/n] "), +				*response = yesno(_(":: Replace %s with %s/%s? [Y/n] "),  						alpm_pkg_get_name(data1),  						(char *)data3,  						alpm_pkg_get_name(data2)); -				*response = yesno(str);  			} else {  				printf(_("Replacing %s with %s/%s\n"),  						alpm_pkg_get_name(data1), @@ -292,27 +278,24 @@ void cb_trans_conv(pmtransconv_t event, void *data1, void *data2,  			}  			break;  		case PM_TRANS_CONV_CONFLICT_PKG: -			snprintf(str, LOG_STR_LEN, _(":: %s conflicts with %s. Remove %s? [Y/n] "), +			*response = yesno(_(":: %s conflicts with %s. Remove %s? [Y/n] "),  					(char *)data1,  					(char *)data2,  					(char *)data2); -			*response = yesno(str);  			break;  		case PM_TRANS_CONV_LOCAL_NEWER:  			if(!config->op_s_downloadonly) { -				snprintf(str, LOG_STR_LEN, _(":: %s-%s: local version is newer. Upgrade anyway? [Y/n] "), +				*response = yesno(_(":: %s-%s: local version is newer. Upgrade anyway? [Y/n] "),  						alpm_pkg_get_name(data1),  						alpm_pkg_get_version(data1)); -				*response = yesno(str);  			} else {  				*response = 1;  			}  			break;  		case PM_TRANS_CONV_CORRUPTED_PKG:  			if(!config->noconfirm) { -				snprintf(str, LOG_STR_LEN, _(":: File %s is corrupted. Do you want to delete it? [Y/n] "), +				*response = yesno(_(":: File %s is corrupted. Do you want to delete it? [Y/n] "),  						(char *)data1); -				*response = yesno(str);  			} else {  				*response = 1;  			} diff --git a/src/pacman/deptest.c b/src/pacman/deptest.c index 2481c0b6..2feca5c4 100644 --- a/src/pacman/deptest.c +++ b/src/pacman/deptest.c @@ -31,53 +31,23 @@  #include "util.h"  #include "conf.h" -/* TODO: This should use _alpm_checkdeps() */  int pacman_deptest(alpm_list_t *targets)  { -	int retval = 0;  	alpm_list_t *i; -	if(targets == NULL) { +	alpm_list_t *deps = alpm_deptest(alpm_option_get_localdb(), targets); +	if(deps == NULL) {  		return(0);  	} -	for(i = targets; i; i = alpm_list_next(i)) { -		int found = 0; -		pmpkg_t *pkg; -		pmdepend_t *dep; -		const char *target; -		alpm_list_t *j, *provides; +	for(i = deps; i; i = alpm_list_next(i)) { +		const char *dep; -		target = alpm_list_getdata(i); -		dep = alpm_splitdep(target); - -		pkg = alpm_db_get_pkg(alpm_option_get_localdb(), -				alpm_dep_get_name(dep)); -		if(pkg && alpm_depcmp(pkg, dep)) { -			found = 1; -		} else { -			/* not found, can we find anything that provides this in the local DB? */ -			provides = alpm_db_whatprovides(alpm_option_get_localdb(), -					alpm_dep_get_name(dep)); -			for(j = provides; j; j = alpm_list_next(j)) { -				pmpkg_t *pkg; -				pkg = alpm_list_getdata(j); - -				if(pkg && alpm_depcmp(pkg, dep)) { -					found = 1; -					break; -				} -			} -			alpm_list_free(provides); -		} - -		if(!found) { -			printf("%s\n", target); -			retval = 127; -		} -		free(dep); +		dep = alpm_list_getdata(i); +		printf("%s\n", dep);  	} -	return(retval); +	alpm_list_free(deps); +	return(127);  }  /* vim: set ts=2 sw=2 noet: */ diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 377ea3fe..f1853203 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -79,6 +79,7 @@ static void usage(int op, const char * const myname)  			printf("%s:  %s {-A --add} [%s] <%s>\n", str_usg, myname, str_opt, str_file);  			printf("%s:\n", str_opt);  			printf(_("      --asdeps         install packages as non-explicitly installed\n")); +			printf(_("      --asexplicit     install packages as explicitly installed\n"));  			printf(_("  -d, --nodeps         skip dependency checks\n"));  			printf(_("  -f, --force          force install, overwrite conflicting files\n"));  		} else if(op == PM_OP_REMOVE) { @@ -89,10 +90,12 @@ static void usage(int op, const char * const myname)  			printf(_("  -k, --dbonly         only remove database entry, do not remove files\n"));  			printf(_("  -n, --nosave         remove configuration files as well\n"));  			printf(_("  -s, --recursive      remove dependencies also (that won't break packages)\n")); +			printf(_("  -u, --unneeded       remove unneeded packages (that won't break packages)\n"));  		} else if(op == PM_OP_UPGRADE) {  			printf("%s:  %s {-U --upgrade} [%s] <%s>\n", str_usg, myname, str_opt, str_file);  			printf("%s:\n", str_opt);  			printf(_("      --asdeps         install packages as non-explicitly installed\n")); +			printf(_("      --asexplicit     install packages as explicitly installed\n"));  			printf(_("  -d, --nodeps         skip dependency checks\n"));  			printf(_("  -f, --force          force install, overwrite conflicting files\n"));  		} else if(op == PM_OP_QUERY) { @@ -115,6 +118,7 @@ static void usage(int op, const char * const myname)  			printf("%s:  %s {-S --sync} [%s] [%s]\n", str_usg, myname, str_opt, str_pkg);  			printf("%s:\n", str_opt);  			printf(_("      --asdeps         install packages as non-explicitly installed\n")); +			printf(_("      --asexplicit     install packages as explicitly installed\n"));  			printf(_("  -c, --clean          remove old packages from cache directory (-cc for all)\n"));  			printf(_("  -d, --nodeps         skip dependency checks\n"));  			printf(_("  -e, --dependsonly    install dependencies only\n")); @@ -331,6 +335,7 @@ static int parseargs(int argc, char *argv[])  		{"unrequired", no_argument,       0, 't'},  		{"upgrades",   no_argument,       0, 'u'},  		{"sysupgrade", no_argument,       0, 'u'}, +		{"unneeded",   no_argument,       0, 'u'},  		{"verbose",    no_argument,       0, 'v'},  		{"downloadonly", no_argument,     0, 'w'},  		{"refresh",    no_argument,       0, 'y'}, @@ -345,6 +350,7 @@ static int parseargs(int argc, char *argv[])  		{"logfile",    required_argument, 0, 1009},  		{"ignoregroup", required_argument, 0, 1010},  		{"needed",     no_argument,       0, 1011}, +		{"asexplicit",     no_argument,   0, 1012},  		{0, 0, 0, 0}  	}; @@ -416,6 +422,9 @@ static int parseargs(int argc, char *argv[])  				FREELIST(list);  				break;  			case 1011: config->flags |= PM_TRANS_FLAG_NEEDED; break; +			case 1012: +				config->flags |= PM_TRANS_FLAG_ALLEXPLICIT; +				break;  			case 'A': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_ADD); break;  			case 'Q': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_QUERY); break;  			case 'R': config->op = (config->op != PM_OP_MAIN ? 0 : PM_OP_REMOVE); break; @@ -469,6 +478,7 @@ static int parseargs(int argc, char *argv[])  			case 'u':  				config->op_s_upgrade = 1;  				config->op_q_upgrade = 1; +				config->flags |= PM_TRANS_FLAG_UNNEEDED;  				break;  			case 'v': (config->verbose)++; break;  			case 'w': diff --git a/src/pacman/sync.c b/src/pacman/sync.c index e3e87703..5cf146b6 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -232,6 +232,10 @@ static int sync_synctree(int level, alpm_list_t *syncs)  	alpm_list_t *i;  	int success = 0, ret; +	if(sync_trans_init(0) == -1) { +		return(0); +	} +  	for(i = syncs; i; i = alpm_list_next(i)) {  		pmdb_t *db = alpm_list_getdata(i); @@ -259,10 +263,16 @@ static int sync_synctree(int level, alpm_list_t *syncs)  		}  	} +	if(sync_trans_release() == -1) { +		return(0); +	}  	/* We should always succeed if at least one DB was upgraded - we may possibly  	 * fail later with unresolved deps, but that should be rare, and would be  	 * expected  	 */ +	if(!success) { +		fprintf(stderr, _("error: failed to synchronize any databases\n")); +	}  	return(success > 0);  } @@ -499,7 +509,7 @@ static int sync_list(alpm_list_t *syncs, alpm_list_t *targets)  	return(0);  } -static int sync_trans(alpm_list_t *targets, int sync_only) +static int sync_trans(alpm_list_t *targets)  {  	int retval = 0;  	alpm_list_t *data = NULL; @@ -510,23 +520,8 @@ static int sync_trans(alpm_list_t *targets, int sync_only)  		return(1);  	} -	if(config->op_s_sync) { -		/* grab a fresh package list */ -		printf(_(":: Synchronizing package databases...\n")); -		alpm_logaction("synchronizing package lists\n"); -		if(!sync_synctree(config->op_s_sync, sync_dbs)) { -			fprintf(stderr, _("error: failed to synchronize any databases\n")); -			retval = 1; -			goto cleanup; -		} -		if(sync_only) { -			goto cleanup; -		} -	} -  	if(config->op_s_upgrade) {  		alpm_list_t *pkgs, *i; -  		printf(_(":: Starting full system upgrade...\n"));  		alpm_logaction("starting full system upgrade\n");  		if(alpm_trans_sysupgrade() == -1) { @@ -770,7 +765,6 @@ cleanup:  int pacman_sync(alpm_list_t *targets)  {  	alpm_list_t *sync_dbs = NULL; -	int sync_only = 0;  	/* clean the cache */  	if(config->op_s_clean) { @@ -797,18 +791,27 @@ int pacman_sync(alpm_list_t *targets)  		return(1);  	} -	if(config->op_s_search || config->group -			|| config->op_s_info || config->op_q_list) { -		sync_only = 1; -	} else if(targets == NULL && !(config->op_s_sync || config->op_s_upgrade)) { +	if(targets == NULL && !(config->op_s_sync || config->op_s_upgrade +				|| config->op_s_search || config->group +				|| config->op_s_info || config->op_q_list)) {  		/* don't proceed here unless we have an operation that doesn't require  		 * a target list */  		pm_printf(PM_LOG_ERROR, _("no targets specified (use -h for help)\n"));  		return(1);  	} +	if(config->op_s_sync) { +		/* grab a fresh package list */ +		printf(_(":: Synchronizing package databases...\n")); +		alpm_logaction("synchronizing package lists\n"); +		if(!sync_synctree(config->op_s_sync, sync_dbs)) { +			return(1); +		} +		config->op_s_sync = 0; +	} +  	if(needs_transaction()) { -		if(sync_trans(targets, sync_only) == 1) { +		if(sync_trans(targets) == 1) {  			return(1);  		}  	} diff --git a/src/pacman/util.c b/src/pacman/util.c index aa08eb26..229f65a2 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -234,6 +234,10 @@ void indentprint(const char *str, int indent)  	p = wcstr;  	cidx = indent; +	if(!p) { +		return; +	} +  	while(*p) {  		if(*p == L' ') {  			const wchar_t *q, *next; @@ -464,20 +468,17 @@ void display_targets(const alpm_list_t *syncpkgs, pmdb_t *db_local)  		pmsyncpkg_t *sync = alpm_list_getdata(i);  		pmpkg_t *pkg = alpm_sync_get_pkg(sync); -		/* If this sync record is a replacement, the data member contains -		 * a list of packages to be removed due to the package that is being -		 * installed. */ -		if(alpm_sync_get_type(sync) == PM_SYNC_TYPE_REPLACE) { -			alpm_list_t *to_replace = alpm_sync_get_data(sync); +		/* The removes member contains a list of packages to be removed +		 * due to the package that is being installed. */ +		alpm_list_t *to_replace = alpm_sync_get_removes(sync); -			for(j = to_replace; j; j = alpm_list_next(j)) { -				pmpkg_t *rp = alpm_list_getdata(j); -				const char *name = alpm_pkg_get_name(rp); +		for(j = to_replace; j; j = alpm_list_next(j)) { +			pmpkg_t *rp = alpm_list_getdata(j); +			const char *name = alpm_pkg_get_name(rp); -				if(!alpm_list_find_str(to_remove, name)) { -					rsize += alpm_pkg_get_isize(rp); -					to_remove = alpm_list_add(to_remove, strdup(name)); -				} +			if(!alpm_list_find_str(to_remove, name)) { +				rsize += alpm_pkg_get_isize(rp); +				to_remove = alpm_list_add(to_remove, strdup(name));  			}  		} @@ -520,11 +521,7 @@ void display_targets(const alpm_list_t *syncpkgs, pmdb_t *db_local)  	printf("\n");  	printf(_("Total Download Size:    %.2f MB\n"), mbdlsize); - -	/* TODO because all pkgs don't include isize, this is a crude hack */ -	if(mbisize > mbdlsize) { -		printf(_("Total Installed Size:   %.2f MB\n"), mbisize); -	} +	printf(_("Total Installed Size:   %.2f MB\n"), mbisize);  	FREELIST(targets);  } diff --git a/src/util/testdb.c b/src/util/testdb.c index 122a3fb5..f354ecab 100644 --- a/src/util/testdb.c +++ b/src/util/testdb.c @@ -147,6 +147,14 @@ int main(int argc, char **argv)  		free(depstring);  	} +	/* check conflicts */ +	data = alpm_checkdbconflicts(db); +	for(i = data; i; i = i->next) { +		pmconflict_t *conflict = alpm_list_getdata(i); +		printf("%s conflicts with %s\n", alpm_conflict_get_package1(conflict), +				alpm_conflict_get_package2(conflict)); +	} +  	cleanup(retval);  } | 
