diff options
| -rw-r--r-- | doc/pacman.8.txt | 19 | ||||
| -rw-r--r-- | lib/libalpm/add.c | 16 | ||||
| -rw-r--r-- | lib/libalpm/alpm.h | 1 | ||||
| -rw-r--r-- | lib/libalpm/be_package.c | 34 | ||||
| -rw-r--r-- | lib/libalpm/conflict.c | 4 | ||||
| -rw-r--r-- | lib/libalpm/deps.c | 2 | ||||
| -rw-r--r-- | lib/libalpm/dload.c | 2 | ||||
| -rw-r--r-- | lib/libalpm/package.c | 2 | ||||
| -rw-r--r-- | lib/libalpm/trans.c | 4 | ||||
| -rw-r--r-- | lib/libalpm/util.c | 20 | ||||
| -rw-r--r-- | scripts/makepkg.sh.in | 237 | ||||
| -rw-r--r-- | src/pacman/callback.c | 2 | ||||
| -rw-r--r-- | src/pacman/package.c | 2 | ||||
| -rw-r--r-- | src/pacman/pacman.c | 17 | ||||
| -rw-r--r-- | src/pacman/sync.c | 8 | ||||
| -rw-r--r-- | src/pacman/upgrade.c | 2 | ||||
| -rw-r--r-- | src/pacman/util.c | 6 | ||||
| -rw-r--r-- | src/util/testdb.c | 2 | 
18 files changed, 211 insertions, 169 deletions
| diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt index 3d14a42a..de1f51f8 100644 --- a/doc/pacman.8.txt +++ b/doc/pacman.8.txt @@ -415,6 +415,25 @@ original=X, current=Y, new=Z::  	necessary changes into the original file. +Examples +-------- + +pacman -Ss ne.hack:: +	Search for regexp "ne.hack" in package database. + +pacman -S gpm:: +	Download and install gpm including dependencies. + +pacman -U /home/user/ceofhack-0.6-1-x86_64.pkg.tar.gz:: +	Install ceofhack-0.6-1 package from a local file. + +pacman -Syu:: +	Update package list and upgrade all packages afterwards. + +pacman -Syu gpm:: +	Update package list, upgrade all packages, and then install gpm if it +	wasn't already installed. +  Configuration  -------------  See linkman:pacman.conf[5] for more details on configuring pacman using the diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index f39a0ecf..cc0c4c13 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -556,6 +556,7 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		struct archive *archive;  		struct archive_entry *entry;  		char cwd[PATH_MAX] = ""; +		int restore_cwd = 0;  		_alpm_log(PM_LOG_DEBUG, "extracting files\n"); @@ -579,11 +580,16 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		/* save the cwd so we can restore it later */  		if(getcwd(cwd, PATH_MAX) == NULL) {  			_alpm_log(PM_LOG_ERROR, _("could not get current working directory\n")); -			cwd[0] = 0; +		} else { +			restore_cwd = 1;  		}  		/* libarchive requires this for extracting hard links */ -		chdir(handle->root); +		if(chdir(handle->root) != 0) { +			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), handle->root, strerror(errno)); +			ret = -1; +			goto cleanup; +		}  		/* call PROGRESS once with 0 percent, as we sort-of skip that here */  		if(is_upgrade) { @@ -629,9 +635,9 @@ static int commit_single_pkg(pmpkg_t *newpkg, int pkg_current, int pkg_count,  		}  		archive_read_finish(archive); -		/* restore the old cwd is we have it */ -		if(strlen(cwd)) { -			chdir(cwd); +		/* restore the old cwd if we have it */ +		if(restore_cwd && chdir(cwd) != 0) { +			_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));  		}  		if(errors) { diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 33291325..0c01f214 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -522,6 +522,7 @@ enum _pmerrno_t {  	PM_ERR_FILE_CONFLICTS,  	/* Misc */  	PM_ERR_RETRIEVE, +	PM_ERR_WRITE,  	PM_ERR_INVALID_REGEX,  	/* External library errors */  	PM_ERR_LIBARCHIVE, diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c index 38cf357a..7b77ae6b 100644 --- a/lib/libalpm/be_package.c +++ b/lib/libalpm/be_package.c @@ -69,19 +69,19 @@ static int parse_descfile(struct archive *a, pmpkg_t *newpkg)  		} else {  			key = _alpm_strtrim(key);  			ptr = _alpm_strtrim(ptr); -			if(!strcmp(key, "pkgname")) { +			if(strcmp(key, "pkgname") == 0) {  				STRDUP(newpkg->name, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "pkgver")) { +			} else if(strcmp(key, "pkgver") == 0) {  				STRDUP(newpkg->version, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "pkgdesc")) { +			} else if(strcmp(key, "pkgdesc") == 0) {  				STRDUP(newpkg->desc, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "group")) { +			} else if(strcmp(key, "group") == 0) {  				newpkg->groups = alpm_list_add(newpkg->groups, strdup(ptr)); -			} else if(!strcmp(key, "url")) { +			} else if(strcmp(key, "url") == 0) {  				STRDUP(newpkg->url, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "license")) { +			} else if(strcmp(key, "license") == 0) {  				newpkg->licenses = alpm_list_add(newpkg->licenses, strdup(ptr)); -			} else if(!strcmp(key, "builddate")) { +			} else if(strcmp(key, "builddate") == 0) {  				char first = tolower((unsigned char)ptr[0]);  				if(first > 'a' && first < 'z') {  					struct tm tmp_tm = {0}; /* initialize to null in case of failure */ @@ -92,27 +92,27 @@ static int parse_descfile(struct archive *a, pmpkg_t *newpkg)  				} else {  					newpkg->builddate = atol(ptr);  				} -			} else if(!strcmp(key, "packager")) { +			} else if(strcmp(key, "packager") == 0) {  				STRDUP(newpkg->packager, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "arch")) { +			} else if(strcmp(key, "arch") == 0) {  				STRDUP(newpkg->arch, ptr, RET_ERR(PM_ERR_MEMORY, -1)); -			} else if(!strcmp(key, "size")) { +			} else if(strcmp(key, "size") == 0) {  				/* size in the raw package is uncompressed (installed) size */  				newpkg->isize = atol(ptr); -			} else if(!strcmp(key, "depend")) { +			} else if(strcmp(key, "depend") == 0) {  				pmdepend_t *dep = _alpm_splitdep(ptr);  				newpkg->depends = alpm_list_add(newpkg->depends, dep); -			} else if(!strcmp(key, "optdepend")) { +			} else if(strcmp(key, "optdepend") == 0) {  				newpkg->optdepends = alpm_list_add(newpkg->optdepends, strdup(ptr)); -			} else if(!strcmp(key, "conflict")) { +			} else if(strcmp(key, "conflict") == 0) {  				newpkg->conflicts = alpm_list_add(newpkg->conflicts, strdup(ptr)); -			} else if(!strcmp(key, "replaces")) { +			} else if(strcmp(key, "replaces") == 0) {  				newpkg->replaces = alpm_list_add(newpkg->replaces, strdup(ptr)); -			} else if(!strcmp(key, "provides")) { +			} else if(strcmp(key, "provides") == 0) {  				newpkg->provides = alpm_list_add(newpkg->provides, strdup(ptr)); -			} else if(!strcmp(key, "backup")) { +			} else if(strcmp(key, "backup") == 0) {  				newpkg->backup = alpm_list_add(newpkg->backup, strdup(ptr)); -			} else if(!strcmp(key, "makepkgopt")) { +			} else if(strcmp(key, "makepkgopt") == 0) {  				/* not used atm */  			} else {  				_alpm_log(PM_LOG_DEBUG, "%s: syntax error in description file line %d\n", diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c index e36844a8..236ec1df 100644 --- a/lib/libalpm/conflict.c +++ b/lib/libalpm/conflict.c @@ -88,8 +88,8 @@ int _alpm_conflict_isin(pmconflict_t *needle, alpm_list_t *haystack)  		char *cpkg2 = conflict->package2;  		char *npkg1 = needle->package1;  		char *npkg2 = needle->package2; -		if((!strcmp(cpkg1, npkg1)  && !strcmp(cpkg2, npkg2)) -				|| (!strcmp(cpkg1, npkg2) && !strcmp(cpkg2, npkg1))) { +		if((strcmp(cpkg1, npkg1) == 0  && strcmp(cpkg2, npkg2) == 0) +				|| (strcmp(cpkg1, npkg2) == 0 && strcmp(cpkg2, npkg1) == 0)) {  			return(1);  		}  	} diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index 26f9b16d..fd893a63 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -546,7 +546,7 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs,  	for(i = dbs; i; i = i->next) {  		for(j = _alpm_db_get_pkgcache(i->data); j; j = j->next) {  			pmpkg_t *pkg = j->data; -			if(alpm_depcmp(pkg, dep) && strcmp(pkg->name, dep->name) && +			if(alpm_depcmp(pkg, dep) && strcmp(pkg->name, dep->name) != 0 &&  			             !_alpm_pkg_find(excluding, pkg->name)) {  				if(_alpm_pkg_should_ignore(pkg)) {  					int install = 0; diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index c11148d1..3185d2aa 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -251,7 +251,7 @@ static int download_internal(const char *url, const char *localpath,  		check_stop();  		size_t nwritten = 0;  		nwritten = fwrite(buffer, 1, nread, localf); -		if((nwritten != nread) || ferror(localf)) { +		if((nwritten != (size_t)nread) || ferror(localf)) {  			pm_errno = PM_ERR_RETRIEVE;  			_alpm_log(PM_LOG_ERROR, _("error writing to file '%s': %s\n"),  					tempfile, strerror(errno)); diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index becbc60f..0060300c 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -749,7 +749,7 @@ int _alpm_pkg_cmp(const void *p1, const void *p2)  {  	pmpkg_t *pkg1 = (pmpkg_t *)p1;  	pmpkg_t *pkg2 = (pmpkg_t *)p2; -	return(strcmp(pkg1->name, pkg2->name)); +	return(strcoll(pkg1->name, pkg2->name));  }  /* Test for existence of a package in a alpm_list_t* diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 49fc0f67..c042f099 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -107,7 +107,7 @@ static alpm_list_t *check_arch(alpm_list_t *pkgs)  	for(i = pkgs; i; i = i->next) {  		pmpkg_t *pkg = i->data;  		const char *pkgarch = alpm_pkg_get_arch(pkg); -		if(strcmp(pkgarch,arch) && strcmp(pkgarch,"any")) { +		if(strcmp(pkgarch,arch) != 0 && strcmp(pkgarch,"any") != 0) {  			char *string;  			const char *pkgname = alpm_pkg_get_name(pkg);  			const char *pkgver = alpm_pkg_get_version(pkg); @@ -371,7 +371,7 @@ int _alpm_runscriptlet(const char *root, const char *installfn,  	/* either extract or copy the scriptlet */  	snprintf(scriptfn, PATH_MAX, "%s/.INSTALL", tmpdir); -	if(!strcmp(script, "pre_upgrade") || !strcmp(script, "pre_install")) { +	if(strcmp(script, "pre_upgrade") == 0 || strcmp(script, "pre_install") == 0) {  		if(_alpm_unpack_single(installfn, tmpdir, ".INSTALL")) {  			retval = 1;  		} diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index 32eaa442..ffebe9e8 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -143,7 +143,15 @@ int _alpm_copyfile(const char *src, const char *dest)  	/* do the actual file copy */  	while((len = fread(buf, 1, CPBUFSIZE, in))) { -		fwrite(buf, 1, len, out); +		size_t nwritten = 0; +		nwritten = fwrite(buf, 1, len, out); +		if((nwritten != len) || ferror(out)) { +			pm_errno = PM_ERR_WRITE; +			_alpm_log(PM_LOG_ERROR, _("error writing to file '%s': %s\n"), +					dest, strerror(errno)); +			ret = -1; +			goto cleanup; +		}  	}  	/* chmod dest to permissions of src, as long as it is not a symlink */ @@ -364,8 +372,8 @@ int _alpm_unpack(const char *archive, const char *prefix, alpm_list_t *list, int  cleanup:  	umask(oldmask);  	archive_read_finish(_archive); -	if(restore_cwd) { -		chdir(cwd); +	if(restore_cwd && chdir(cwd) != 0) { +		_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));  	}  	return(ret);  } @@ -398,7 +406,7 @@ int _alpm_rmrf(const char *path)  			for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {  				if(dp->d_ino) {  					sprintf(name, "%s/%s", path, dp->d_name); -					if(strcmp(dp->d_name, "..") && strcmp(dp->d_name, ".")) { +					if(strcmp(dp->d_name, "..") != 0 && strcmp(dp->d_name, ".") != 0) {  						errflag += _alpm_rmrf(name);  					}  				} @@ -534,8 +542,8 @@ int _alpm_run_chroot(const char *root, const char *cmd)  	}  cleanup: -	if(restore_cwd) { -		chdir(cwd); +	if(restore_cwd && chdir(cwd) != 0) { +		_alpm_log(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno));  	}  	return(retval); diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 516e1d7c..9f3bbb2c 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -135,6 +135,8 @@ clean_up() {  	fi  	if (( ! EXIT_CODE && CLEANUP )); then +		local pkg file +  		# If it's a clean exit and -c/--clean has been passed...  		msg "$(gettext "Cleaning up...")"  		rm -rf "$pkgdir" "$srcdir" @@ -153,7 +155,7 @@ clean_up() {  			# clean up dangling symlinks to packages  			for pkg in ${pkgname[@]}; do -				for file in ${pkg}-*-*-${CARCH}${PKGEXT}; do +				for file in ${pkg}-*-*-${CARCH}{${PKGEXT},${SRCEXT}}; do  					if [[ -h $file && ! -e $file ]]; then  						rm -f $file  					fi @@ -308,7 +310,7 @@ get_downloadclient() {  	for i in "${DLAGENTS[@]}"; do  		local handler="${i%%::*}"  		if [[ $proto = $handler ]]; then -			agent="${i##*::}" +			local agent="${i##*::}"  			break  		fi  	done @@ -323,7 +325,7 @@ get_downloadclient() {  	# ensure specified program is installed  	local program="${agent%% *}"  	if [[ ! -x $program ]]; then -		local baseprog=$(basename $program) +		local baseprog="${program##*/}"  		error "$(gettext "The download program %s is not installed.")" "$baseprog"  		plain "$(gettext "Aborting...")"  		exit 1 # $E_MISSING_PROGRAM @@ -387,6 +389,7 @@ check_deps() {  	# Also, a non-zero return value is not unexpected and we are manually dealing them  	set +E  	local ret=0 +	local pmout  	pmout=$(run_pacman -T "$@") || ret=$?  	set -E  @@ -543,7 +546,7 @@ generate_checksums() {  	msg "$(gettext "Generating checksums for source files...")"  	plain "" -	if [ ! $(type -p openssl) ]; then +	if ! type -p openssl >/dev/null; then  		error "$(gettext "Cannot find openssl.")"  		exit 1 # $E_MISSING_PROGRAM  	fi @@ -593,7 +596,7 @@ generate_checksums() {  check_checksums() {  	(( ! ${#source[@]} )) && return 0 -	if [ ! $(type -p openssl) ]; then +	if ! type -p openssl >/dev/null; then  		error "$(gettext "Cannot find openssl.")"  		exit 1 # $E_MISSING_PROGRAM  	fi @@ -654,7 +657,7 @@ extract_sources() {  	msg "$(gettext "Extracting Sources...")"  	local netfile  	for netfile in "${source[@]}"; do -		file=$(get_filename "$netfile") +		local file=$(get_filename "$netfile")  		if in_array "$file" ${noextract[@]}; then  			#skip source files in the noextract=() array  			#  these are marked explicitly to NOT be extracted @@ -685,9 +688,12 @@ extract_sources() {  					*) continue;;  				esac ;;  			*) -				# Don't know what to use to extract this file, -				# skip to the next file -				continue;; +				# See if bsdtar can recognize the file +				if bsdtar -tf "$file" -q '*' &>/dev/null; then +					cmd="bsdtar" +				else +					continue +				fi ;;  		esac  		local ret=0 @@ -717,6 +723,7 @@ error_function() {  	fi  	# first exit all subshells, then print the error  	if (( ! BASH_SUBSHELL )); then +		error "$(gettext "A failure occurred in %s().")" "$1"  		plain "$(gettext "Aborting...")"  		remove_deps  	fi @@ -727,7 +734,7 @@ run_function() {  	if [[ -z $1 ]]; then  		return 1  	fi -	pkgfunc="$1" +	local pkgfunc="$1"  	# clear user-specified makeflags if requested  	if [[ $(check_option makeflags) = "n" ]]; then @@ -743,8 +750,9 @@ run_function() {  	local shellopts=$(shopt -p)  	local ret=0 +	local restoretrap  	if (( LOGGING )); then -		BUILDLOG="${startdir}/${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-$pkgfunc.log" +		local BUILDLOG="${startdir}/${pkgbase}-${pkgver}-${pkgrel}-${CARCH}-$pkgfunc.log"  		if [[ -f $BUILDLOG ]]; then  			local i=1  			while true; do @@ -764,7 +772,7 @@ run_function() {  		tee "$BUILDLOG" < "$logpipe" &  		exec 1>"$logpipe" 2>"$logpipe"  		restoretrap=$(trap -p ERR) -		trap 'error_function' ERR +		trap 'error_function $pkgfunc' ERR  		$pkgfunc 2>&1  		eval $restoretrap  		sync @@ -772,7 +780,7 @@ run_function() {  		rm "$logpipe"  	else  		restoretrap=$(trap -p ERR) -		trap 'error_function' ERR +		trap 'error_function $pkgfunc' ERR  		$pkgfunc 2>&1  		eval $restoretrap  	fi @@ -799,6 +807,7 @@ run_build() {  }  run_package() { +	local pkgfunc  	if [[ -z $1 ]]; then  		pkgfunc="package"  	else @@ -905,56 +914,41 @@ write_pkginfo() {  	size="$(( ${size%%[^0-9]*} * 1024 ))"  	msg2 "$(gettext "Generating .PKGINFO file...")" -	echo "# Generated by makepkg $myver" >.PKGINFO +	echo "# Generated by makepkg $myver"  	if (( INFAKEROOT )); then -		echo "# using $(fakeroot -v)" >>.PKGINFO -	fi -	echo "# $(LC_ALL=C date -u)" >>.PKGINFO -	echo "pkgname = $1" >>.PKGINFO -	(( SPLITPKG )) && echo pkgbase = $pkgbase >>.PKGINFO -	echo "pkgver = $pkgver-$pkgrel" >>.PKGINFO -	echo "pkgdesc = $pkgdesc" >>.PKGINFO -	echo "url = $url" >>.PKGINFO -	echo "builddate = $builddate" >>.PKGINFO -	echo "packager = $packager" >>.PKGINFO -	echo "size = $size" >>.PKGINFO -	echo "arch = $PKGARCH" >>.PKGINFO +		echo "# using $(fakeroot -v)" +	fi +	echo "# $(LC_ALL=C date -u)" +	echo "pkgname = $1" +	(( SPLITPKG )) && echo pkgbase = $pkgbase +	echo "pkgver = $pkgver-$pkgrel" +	echo "pkgdesc = $pkgdesc" +	echo "url = $url" +	echo "builddate = $builddate" +	echo "packager = $packager" +	echo "size = $size" +	echo "arch = $PKGARCH"  	if [[ $(check_option force) = "y" ]]; then -		echo "force = true" >> .PKGINFO +		echo "force = true"  	fi +	[[ $license ]]    && printf "license = %s\n"   "${license[@]}" +	[[ $replaces ]]   && printf "replaces = %s\n"  "${replaces[@]}" +	[[ $groups ]]     && printf "group = %s\n"     "${groups[@]}" +	[[ $depends ]]    && printf "depend = %s\n"    "${depends[@]}" +	[[ $optdepends ]] && printf "optdepend = %s\n" "${optdepends[@]}" +	[[ $conflicts ]]  && printf "conflict = %s\n"  "${conflicts[@]}" +	[[ $provides ]]   && printf "provides = %s\n"  "${provides[@]}" +	[[ $backup ]]     && printf "backup = %s\n"    "${backup[@]}" +  	local it -	for it in "${license[@]}"; do -		echo "license = $it" >>.PKGINFO -	done -	for it in "${replaces[@]}"; do -		echo "replaces = $it" >>.PKGINFO -	done -	for it in "${groups[@]}"; do -		echo "group = $it" >>.PKGINFO -	done -	for it in "${depends[@]}"; do -		echo "depend = $it" >>.PKGINFO -	done -	for it in "${optdepends[@]}"; do -		echo "optdepend = $it" >>.PKGINFO -	done -	for it in "${conflicts[@]}"; do -		echo "conflict = $it" >>.PKGINFO -	done -	for it in "${provides[@]}"; do -		echo "provides = $it" >>.PKGINFO -	done -	for it in "${backup[@]}"; do -		echo "backup = $it" >>.PKGINFO -	done  	for it in "${packaging_options[@]}"; do  		local ret="$(check_option $it)"  		if [[ $ret != "?" ]]; then  			if [[ $ret = y ]]; then -				echo "makepkgopt = $it" >>.PKGINFO +				echo "makepkgopt = $it"  			else -				echo "makepkgopt = !$it" >>.PKGINFO +				echo "makepkgopt = !$it"  			fi  		fi  	done @@ -996,6 +990,7 @@ create_package() {  	cd "$pkgdir"  	msg "$(gettext "Creating package...")" +	local nameofpkg  	if [[ -z $1 ]]; then  		nameofpkg="$pkgname"  	else @@ -1008,7 +1003,7 @@ create_package() {  		PKGARCH=$CARCH  	fi -	write_pkginfo $nameofpkg +	write_pkginfo $nameofpkg > .PKGINFO  	local comp_files=".PKGINFO" @@ -1031,6 +1026,7 @@ create_package() {  	# tar it up  	msg2 "$(gettext "Compressing package...")" +	local EXT  	case "$PKGEXT" in  		*tar.gz)  EXT=${PKGEXT%.gz} ;;  		*tar.bz2) EXT=${PKGEXT%.bz2} ;; @@ -1142,6 +1138,16 @@ create_srcpackage() {  		error "$(gettext "Failed to create source package file.")"  		exit 1 # TODO: error code  	fi + +       if (( ! ret )) && [[ "$SRCPKGDEST" != "${startdir}" ]]; then +           ln -sf "${pkg_file}" "${pkg_file/$SRCPKGDEST/$startdir}" +           ret=$? +       fi + +       if (( ret )); then +           warning "$(gettext "Failed to create symlink to source package file.")" +       fi +  	cd "${startdir}"  	rm -rf "${srclinks}"  } @@ -1155,12 +1161,12 @@ install_package() {  		msg "$(gettext "Installing %s package group with %s -U...")" "$pkgbase" "$PACMAN"  	fi -	local pkglist +	local pkg pkglist  	for pkg in ${pkgname[@]}; do  		if [[ -f $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} ]]; then -			pkglist="${pkglist} $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}" +			pkglist+=" $PKGDEST/${pkg}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT}"  		else -			pkglist="${pkglist} $PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT}" +			pkglist+=" $PKGDEST/${pkg}-${pkgver}-${pkgrel}-any${PKGEXT}"  		fi  	done @@ -1172,18 +1178,13 @@ install_package() {  check_sanity() {  	# check for no-no's in the build script -	if [[ -z $pkgname ]]; then -		error "$(gettext "%s is not allowed to be empty.")" "pkgname" -		return 1 -	fi -	if [[ -z $pkgver ]]; then -		error "$(gettext "%s is not allowed to be empty.")" "pkgver" -		return 1 -	fi -	if [[ -z $pkgrel ]]; then -		error "$(gettext "%s is not allowed to be empty.")" "pkgrel" -		return 1 -	fi +	local i +	for i in 'pkgname' 'pkgrel' 'pkgver'; do +		if [[ -z ${!i} ]]; then +			error "$(gettext "%s is not allowed to be empty.")" "$i" +			return 1 +		fi +	done  	local name  	for name in "${pkgname[@]}"; do @@ -1235,7 +1236,7 @@ check_sanity() {  	local optdepend  	for optdepend in "${optdepends[@]}"; do -		pkg=${optdepend%%:*} +		local pkg=${optdepend%%:*}  		if [[ ! $pkg =~ ^[[:alnum:]\>\<\=\.\+\_\-]*$ ]]; then  			error "$(gettext "Invalid syntax for optdepend : '%s'")" "$optdepend"  		fi @@ -1274,9 +1275,10 @@ check_sanity() {  		return 1  	fi +	local pkg  	if (( ${#pkgname[@]} > 1 )); then  		for pkg in ${pkgname[@]}; do -			if [ "$(type -t package_${pkg})" != "function" ]; then +			if ! declare -f package_${pkg} >/dev/null; then  				error "$(gettext "missing package function for split package '%s'")" "$pkg"  				return 1  			fi @@ -1313,27 +1315,27 @@ devel_check() {  		# Also do a brief check to make sure we have the VCS tool available.  		oldpkgver=$pkgver  		if [[ -n ${_darcstrunk} && -n ${_darcsmod} ]] ; then -			[ $(type -p darcs) ] || return 0 +			type -p darcs >/dev/null || return 0  			msg "$(gettext "Determining latest darcs revision...")"  			newpkgver=$(date +%Y%m%d)  		elif [[ -n ${_cvsroot} && -n ${_cvsmod} ]] ; then -			[ $(type -p cvs) ] || return 0 +			type -p cvs >/dev/null || return 0  			msg "$(gettext "Determining latest cvs revision...")"  			newpkgver=$(date +%Y%m%d)  		elif [[ -n ${_gitroot} && -n ${_gitname} ]] ; then -			[ $(type -p git) ] || return 0 +			type -p git >/dev/null || return 0  			msg "$(gettext "Determining latest git revision...")"  			newpkgver=$(date +%Y%m%d)  		elif [[ -n ${_svntrunk} && -n ${_svnmod} ]] ; then -			[ $(type -p svn) ] || return 0 +			type -p svn >/dev/null || return 0  			msg "$(gettext "Determining latest svn revision...")"  			newpkgver=$(LC_ALL=C svn info $_svntrunk | sed -n 's/^Last Changed Rev: \([0-9]*\)$/\1/p')  		elif [[ -n ${_bzrtrunk} && -n ${_bzrmod} ]] ; then -			[ $(type -p bzr) ] || return 0 +			type -p bzr >/dev/null || return 0  			msg "$(gettext "Determining latest bzr revision...")"  			newpkgver=$(bzr revno ${_bzrtrunk})  		elif [[ -n ${_hgroot} && -n ${_hgrepo} ]] ; then -			[ $(type -p hg) ] || return 0 +			type -p hg >/dev/null || return 0  			msg "$(gettext "Determining latest hg revision...")"  			if [[ -d ./src/$_hgrepo ]] ; then  				cd ./src/$_hgrepo @@ -1380,15 +1382,17 @@ devel_update() {  }  backup_package_variables() { +	local var  	for var in ${splitpkg_overrides[@]}; do -		indirect="${var}_backup" +		local indirect="${var}_backup"  		eval "${indirect}=(\"\${$var[@]}\")"  	done  }  restore_package_variables() { +	local var  	for var in ${splitpkg_overrides[@]}; do -		indirect="${var}_backup" +		local indirect="${var}_backup"  		if [[ -n ${!indirect} ]]; then  			eval "${var}=(\"\${$indirect[@]}\")"  		else @@ -1397,12 +1401,27 @@ restore_package_variables() {  	done  } +run_split_packaging() { +	for pkg in ${pkgname[@]}; do +		pkgdir="$pkgdir/$pkg" +		mkdir -p "$pkgdir" +		chmod a-s "$pkgdir" +		backup_package_variables +		run_package $pkg +		tidy_install +		create_package $pkg +		restore_package_variables +		pkgdir="${pkgdir%/*}" +	done +} +  # getopt like parser  parse_options() {  	local short_options=$1; shift;  	local long_options=$1; shift;  	local ret=0;  	local unused_options="" +	local i  	while [[ -n $1 ]]; do  		if [[ ${1:0:2} = '--' ]]; then @@ -1535,7 +1554,7 @@ There is NO WARRANTY, to the extent permitted by law.\n")"  # PROGRAM START  # determine whether we have gettext; make it a no-op if we do not -if [ ! $(type -t gettext) ]; then +if ! type -p gettext >/dev/null; then  	gettext() {  		echo "$@"  	} @@ -1546,11 +1565,11 @@ ARGLIST=("$@")  # Parse Command Line Options.  OPT_SHORT="AcCdefFghiLmop:rRsV"  OPT_LONG="allsource,asroot,ignorearch,clean,cleancache,nodeps" -OPT_LONG="$OPT_LONG,noextract,force,forcever:,geninteg,help,holdver" -OPT_LONG="$OPT_LONG,install,log,nocolor,nobuild,pkg:,rmdeps,repackage,skipinteg" -OPT_LONG="$OPT_LONG,source,syncdeps,version,config:" +OPT_LONG+=",noextract,force,forcever:,geninteg,help,holdver" +OPT_LONG+=",install,log,nocolor,nobuild,pkg:,rmdeps,repackage,skipinteg" +OPT_LONG+=",source,syncdeps,version,config:"  # Pacman Options -OPT_LONG="$OPT_LONG,noconfirm,noprogressbar" +OPT_LONG+=",noconfirm,noprogressbar"  OPT_TEMP="$(parse_options $OPT_SHORT $OPT_LONG "$@" || echo 'PARSE_OPTIONS FAILED')"  if [[ $OPT_TEMP = *'PARSE_OPTIONS FAILED'* ]]; then  	# This is a small hack to stop the script bailing with 'set -e' @@ -1562,8 +1581,8 @@ unset OPT_SHORT OPT_LONG OPT_TEMP  while true; do  	case "$1" in  		# Pacman Options -		--noconfirm)      PACMAN_OPTS="$PACMAN_OPTS --noconfirm" ;; -		--noprogressbar)  PACMAN_OPTS="$PACMAN_OPTS --noprogressbar" ;; +		--noconfirm)      PACMAN_OPTS+=" --noconfirm" ;; +		--noprogressbar)  PACMAN_OPTS+=" --noprogressbar" ;;  		# Makepkg Options  		--allsource)      SOURCEONLY=2 ;; @@ -1709,7 +1728,7 @@ if (( ! INFAKEROOT )); then  		plain "$(gettext "Please rerun makepkg without the --asroot flag.")"  		exit 1 # $E_USER_ABORT  	elif [[ $(check_buildenv fakeroot) = "y" ]] && (( EUID > 0 )); then -		if [ ! $(type -p fakeroot) ]; then +		if ! type -p fakeroot >/dev/null; then  			error "$(gettext "Fakeroot must be installed if using the 'fakeroot' option")"  			plain "$(gettext "in the BUILDENV array in %s.")" "$MAKEPKG_CONF"  			exit 1 @@ -1729,7 +1748,7 @@ fi  # check for sudo if we will need it during makepkg execution  if (( ! ( ASROOT || INFAKEROOT ) && ( DEP_BIN || RMDEPS || INSTALL ) )); then -	if [ ! "$(type -p sudo)" ]; then +	if ! type -p sudo >/dev/null; then  		warning "$(gettext "Sudo can not be found. Will use su to acquire root privileges.")"  	fi  fi @@ -1785,14 +1804,12 @@ if (( ${#pkgname[@]} > 1 )); then  fi  # test for available PKGBUILD functions -# The exclamation mark is required here to avoid triggering the ERR trap when -# a tested function does not exist. -if [[ $(! type -t build) = "function" ]]; then +if declare -f build >/dev/null; then  	BUILDFUNC=1  fi -if [ "$(type -t package)" = "function" ]; then +if declare -f package >/dev/null; then  	PKGFUNC=1 -elif [ $SPLITPKG -eq 0 -a "$(type -t package_${pkgname})" = "function" ]; then +elif [[ $SPLITPKG -eq 0 ]] && declare -f package_${pkgname} >/dev/null; then  	SPLITPKG=1  fi @@ -1865,17 +1882,7 @@ if (( INFAKEROOT )); then  		fi  		create_package  	else -		for pkg in ${pkgname[@]}; do -			pkgdir="$pkgdir/$pkg" -			mkdir -p "$pkgdir" -			chmod a-s "$pkgdir" -			backup_package_variables -			run_package $pkg -			tidy_install -			create_package $pkg -			restore_package_variables -			pkgdir="${pkgdir%/*}" -		done +		run_split_packaging  	fi  	msg "$(gettext "Leaving fakeroot environment.")" @@ -1901,20 +1908,20 @@ if (( NODEPS || ( (NOBUILD || REPKG) && !DEP_BIN ) )); then  	if (( NODEPS || ( REPKG && PKGFUNC ) )); then  		warning "$(gettext "Skipping dependency checks.")"  	fi -elif [ $(type -p "${PACMAN%% *}") ]; then +elif type -p "${PACMAN%% *}" >/dev/null; then  	if (( RMDEPS )); then -		original_pkglist=($(run_pacman -Qq | sort))    # required by remove_dep +		original_pkglist=($(run_pacman -Qq))    # required by remove_dep  	fi  	deperr=0 -	msg "$(gettext "Checking Runtime Dependencies...")" +	msg "$(gettext "Checking runtime dependencies...")"  	resolve_deps ${depends[@]} || deperr=1 -	msg "$(gettext "Checking Buildtime Dependencies...")" +	msg "$(gettext "Checking buildtime dependencies...")"  	resolve_deps ${makedepends[@]} || deperr=1  	if (( RMDEPS )); then -		current_pkglist=($(run_pacman -Qq | sort))    # required by remove_deps +		current_pkglist=($(run_pacman -Qq))    # required by remove_deps  	fi  	if (( deperr )); then @@ -1993,17 +2000,7 @@ else  			fi  			create_package  		else -			for pkg in ${pkgname[@]}; do -				pkgdir="$pkgdir/$pkg" -				mkdir -p "$pkgdir" -				chmod a-s "$pkgdir" -				backup_package_variables -				run_package $pkg -				tidy_install -				create_package $pkg -				restore_package_variables -				pkgdir="${pkgdir%/*}" -			done +			run_split_packaging  		fi  	else  		if (( ! REPKG && ( PKGFUNC || SPLITPKG ) )); then diff --git a/src/pacman/callback.c b/src/pacman/callback.c index f5bf17d1..23804d7c 100644 --- a/src/pacman/callback.c +++ b/src/pacman/callback.c @@ -262,7 +262,7 @@ void cb_trans_conv(pmtransconv_t event, void *data1, void *data2,  		case PM_TRANS_CONV_CONFLICT_PKG:  			/* data parameters: target package, local package, conflict (strings) */  			/* print conflict only if it contains new information */ -			if(!strcmp(data1, data3) || !strcmp(data2, data3)) { +			if(strcmp(data1, data3) == 0 || strcmp(data2, data3) == 0) {  				*response = noyes(_(":: %s and %s are in conflict. Remove %s?"),  						(char *)data1,  						(char *)data2, diff --git a/src/pacman/package.c b/src/pacman/package.c index 413754c7..ac84a0c7 100644 --- a/src/pacman/package.c +++ b/src/pacman/package.c @@ -189,7 +189,7 @@ void dump_pkg_backups(pmpkg_t *pkg)  				}  				/* if checksums don't match, file has been modified */ -				if (strcmp(md5sum, ptr)) { +				if (strcmp(md5sum, ptr) != 0) {  					printf(_("MODIFIED\t%s\n"), path);  				} else {  					printf(_("Not Modified\t%s\n"), path); diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 78407d67..049bc40b 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -676,6 +676,7 @@ int download_with_xfercommand(const char *url, const char *localpath,  	struct stat st;  	char *parsedcmd,*tempcmd;  	char cwd[PATH_MAX]; +	int restore_cwd = 0;  	char *destfile, *tempfile, *filename;  	if(!config->xfercommand) { @@ -708,8 +709,14 @@ int download_with_xfercommand(const char *url, const char *localpath,  	parsedcmd = strreplace(tempcmd, "%u", url);  	free(tempcmd); +	/* save the cwd so we can restore it later */ +	if(getcwd(cwd, PATH_MAX) == NULL) { +		pm_printf(PM_LOG_ERROR, _("could not get current working directory\n")); +	} else { +		restore_cwd = 1; +	} +  	/* cwd to the download directory */ -	getcwd(cwd, PATH_MAX);  	if(chdir(localpath)) {  		pm_printf(PM_LOG_WARNING, _("could not chdir to download directory %s\n"), localpath);  		ret = -1; @@ -736,7 +743,11 @@ int download_with_xfercommand(const char *url, const char *localpath,  	}  cleanup: -	chdir(cwd); +	/* restore the old cwd if we have it */ +	if(restore_cwd && chdir(cwd) != 0) { +		pm_printf(PM_LOG_ERROR, _("could not change directory to %s (%s)\n"), cwd, strerror(errno)); +	} +  	if(ret == -1) {  		/* hack to let an user the time to cancel a download */  		sleep(2); @@ -989,7 +1000,7 @@ static int _parseconfig(const char *file, const char *givensection,  							file, linenum, value);  				break;  				default: -					for(int gindex = 0; gindex < globbuf.gl_pathc; gindex++) { +					for(size_t gindex = 0; gindex < globbuf.gl_pathc; gindex++) {  						pm_printf(PM_LOG_DEBUG, "config file %s, line %d: including %s\n",  								file, linenum, globbuf.gl_pathv[gindex]);  						_parseconfig(globbuf.gl_pathv[gindex], section, db); diff --git a/src/pacman/sync.c b/src/pacman/sync.c index b2994389..b9497d65 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -60,11 +60,11 @@ static int sync_cleandb(const char *dbpath, int keep_used) {  		int found = 0;  		const char *dname = ent->d_name; -		if(!strcmp(dname, ".") || !strcmp(dname, "..")) { +		if(strcmp(dname, ".") == 0 || strcmp(dname, "..") == 0) {  			continue;  		}  		/* skip the local and sync directories */ -		if(!strcmp(dname, "sync") || !strcmp(dname, "local")) { +		if(strcmp(dname, "sync") == 0 || strcmp(dname, "local") == 0) {  			continue;  		} @@ -178,7 +178,7 @@ static int sync_cleancache(int level)  			pmpkg_t *localpkg = NULL, *pkg = NULL;  			alpm_list_t *j; -			if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { +			if(strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) {  				continue;  			}  			/* build the full filepath */ @@ -666,7 +666,7 @@ static int sync_trans(alpm_list_t *targets)  					const char *package2 = alpm_conflict_get_package2(conflict);  					const char *reason = alpm_conflict_get_reason(conflict);  					/* only print reason if it contains new information */ -					if(!strcmp(package1, reason) || !strcmp(package2, reason)) { +					if(strcmp(package1, reason) == 0 || strcmp(package2, reason) == 0) {  						printf(_(":: %s and %s are in conflict\n"), package1, package2);  					} else {  						printf(_(":: %s and %s are in conflict (%s)\n"), package1, package2, reason); diff --git a/src/pacman/upgrade.c b/src/pacman/upgrade.c index 1442eb56..c9c8301f 100644 --- a/src/pacman/upgrade.c +++ b/src/pacman/upgrade.c @@ -112,7 +112,7 @@ int pacman_upgrade(alpm_list_t *targets)  					const char *package2 = alpm_conflict_get_package2(conflict);  					const char *reason = alpm_conflict_get_reason(conflict);  					/* only print reason if it contains new information */ -					if(!strcmp(package1, reason) || !strcmp(package2, reason)) { +					if(strcmp(package1, reason) == 0 || strcmp(package2, reason) == 0) {  						printf(_(":: %s and %s are in conflict\n"), package1, package2);  					} else {  						printf(_(":: %s and %s are in conflict (%s)\n"), package1, package2, reason); diff --git a/src/pacman/util.c b/src/pacman/util.c index 0cae6d7c..de1b1626 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -142,7 +142,7 @@ int rmrf(const char *path)  			if(dp->d_ino) {  				char name[PATH_MAX];  				sprintf(name, "%s/%s", path, dp->d_name); -				if(strcmp(dp->d_name, "..") && strcmp(dp->d_name, ".")) { +				if(strcmp(dp->d_name, "..") != 0 && strcmp(dp->d_name, ".") != 0) {  					errflag += rmrf(name);  				}  			} @@ -718,9 +718,9 @@ static int question(short preset, char *fmt, va_list args)  			return(preset);  		} -		if(!strcasecmp(response, _("Y")) || !strcasecmp(response, _("YES"))) { +		if(strcasecmp(response, _("Y")) == 0 || strcasecmp(response, _("YES")) == 0) {  			return(1); -		} else if (!strcasecmp(response, _("N")) || !strcasecmp(response, _("NO"))) { +		} else if (strcasecmp(response, _("N")) == 0 || strcasecmp(response, _("NO")) == 0) {  			return(0);  		}  	} diff --git a/src/util/testdb.c b/src/util/testdb.c index 6d351ebd..45a2626d 100644 --- a/src/util/testdb.c +++ b/src/util/testdb.c @@ -69,7 +69,7 @@ static int db_test(char *dbpath, int local)  	}  	while ((ent = readdir(dir)) != NULL) { -		if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..") +		if(strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0  				|| ent->d_name[0] == '.') {  			continue;  		} | 
