[pacman-dev] [PATCH] checkupdates: Add package download mode with "-d"

Allan McRae allan at archlinux.org
Sun Feb 2 06:41:32 EST 2014


On 17/01/14 15:44, Chris Down wrote:
> This new mode, which must be run as root, allows for the precaching of
> packages which can then subsequently be updated by calling
> "pacman -Syu" as normal. This can then be integrated with a cron script
> (for example, checkupdates-cron[0]) for automated, safe downloading of
> packages alongside getting the list of packages to update, or run
> manually on the command line to download new packages, but avoid
> updating the main package database.
> 
> As a side effect of adding the -d option, argument handling (which was
> previously not present) is now done using "getopts". This seems like a
> reasonable way to do it instead of just hacking in a check for "-d" as
> $1 now, but I'm not particularly averse to either. "getopts" would just
> allow for better future flexibility in this area.
> 
> It is possible to do this as another script, say, downloadupdates, but
> we would encounter pretty heavy code duplication with "checkupdates", so
> it seems more sensible to do it here.
> 
> Due to the use of --noconfirm, this has some limitations when we
> encounter more complex upgrade scenarios, for example when a new package
> conflict occurs, an upgrade path cannot be correctly/automatically
> determined, a package was replaced, etc. This is not a major problem --
> in the worst case, we just don't get the packages that we wanted
> downloaded and an error message is displayed to the user.
> 
> The choice to hide both STDOUT and STDERR of "pacman -Syuw" is
> potentially up for debate. It makes it more difficult to determine where
> the problem was if the command fails -- we still display a message
> saying that that was the case, and set the exit code accordingly, but
> the actual cause needs to be determined by the user elsewhere. For this
> reason, "-p" exists to force the package download to output as normal.
> 
> It seems desirable that "-p" also affects the silence of the database
> update, but this is also up for discussion if people feel it should not
> be within the remit of the (( silent )) checks.
> 
> [0]: https://github.com/cdown/checkupdates-cron

So there are two completely separate changes here...    Adding "-d" and
"-p".   I'd say "-p" should be "-v" or  "--verbose".   These patches
need separately submitted.

I really do not think getopt is justified here.  There is nothing
complex. Just loop through the arguments.

Also, the output of checkupdates is simple for including in a script.  I
think checkupdates should just stay checking updates.

export CHECKUPDATES_DB="/some/db/path"
updates=("$(checkupdates)")
if [[ -n ${updates[@]} ]]; then
  pacman -Sw --dbpath $CHECKUPDATES_DB $updates
done


> ---
>  contrib/checkupdates.sh.in | 41 ++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 38 insertions(+), 3 deletions(-)
> 
> diff --git a/contrib/checkupdates.sh.in b/contrib/checkupdates.sh.in
> index 413b78a..02acb67 100644
> --- a/contrib/checkupdates.sh.in
> +++ b/contrib/checkupdates.sh.in
> @@ -21,16 +21,43 @@
>  declare -r myname='checkupdates'
>  declare -r myver='@PACKAGE_VERSION@'
>  
> -if (( $# > 0 )); then
> +download=0
> +silent=1
> +
> +usage() {
>  	echo "${myname} (pacman) v${myver}"
>  	echo
>  	echo "Safely print a list of pending updates"
>  	echo
>  	echo "Usage: ${myname}"
>  	echo
> +	echo "Options:"
> +	echo "  -d  Download upgradeable packages to pacman package cache."
> +	echo "  -p  Print pacman output from the database upgrade and package download."
> +	echo
>  	echo 'Note: Export the "CHECKUPDATES_DB" variable to change the path of the temporary database.'
>  	exit 0
> -fi
> +}
> +
> +run_silent() (
> +	(( silent )) && exec &>/dev/null
> +	"$@"
> +)
> +
> +while getopts ':dp' opt; do
> +	case $opt in
> +		d)
> +			if (( UID )); then
> +				echo "Download mode can only be run as root." >&2
> +				exit 2
> +			fi
> +
> +			download=1
> +		;;
> +		p) silent=0 ;;
> +		\?) usage ;;
> +	esac
> +done
>  
>  if [[ -z $CHECKUPDATES_DB ]]; then
>  	CHECKUPDATES_DB="${TMPDIR:-/tmp}/checkup-db-${USER}/"
> @@ -43,9 +70,17 @@ eval $(awk -F' *= *' '$1 ~ /DBPath/ { print $1 "=" $2 }' @sysconfdir@/pacman.con
>  
>  mkdir -p "$CHECKUPDATES_DB"
>  ln -s "${DBPath}/local" "$CHECKUPDATES_DB" &> /dev/null
> -fakeroot pacman -Sy --dbpath "$CHECKUPDATES_DB" --logfile /dev/null &> /dev/null
> +run_silent fakeroot pacman -Sy --dbpath "$CHECKUPDATES_DB" --logfile /dev/null
>  pacman -Qqu --dbpath "$CHECKUPDATES_DB" 2> /dev/null
>  
> +if (( download )); then
> +	if ! run_silent pacman -Suw --noconfirm --dbpath "$CHECKUPDATES_DB"; then
> +		ret=$?
> +		(( silent )) && echo "Failed to download packages." >&2
> +		exit "$ret"
> +	fi
> +fi
> +
>  exit 0
>  
>  # vim: set ts=2 sw=2 noet:
> 



More information about the pacman-dev mailing list