[PATCH] paccache: add --age-atime and --age-mtime options

Eli Schwartz eschwartz at archlinux.org
Sun Sep 16 22:25:36 UTC 2018


On 9/14/18 6:58 PM, wisp3rwind wrote:
> ---
>  I would feel a lot more confident about using the paccache systemd
>  service if it kept packages based on age instead of just the few most
>  recent.
> 
>  This patch adds the functionality to skip candidates that are not older
>  (in terms of atime or mtime) than some specified age. It seems to work,
>  but I'm not exactly a bash expert, so please review with care. I'd
>  appreciate if this could be merged!
> 
>  doc/paccache.8.txt |  5 ++++
>  src/paccache.sh.in | 58 +++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 62 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/paccache.8.txt b/doc/paccache.8.txt
> index db81283..c9e3807 100644
> --- a/doc/paccache.8.txt
> +++ b/doc/paccache.8.txt
> @@ -38,6 +38,11 @@ Options
>  	Scan for packages for a specific architecture. Default is to scan for
>  	all architectures.
>  
> +*\--age-atime <age>*::
> +*\--age-mtime <age>*::
> +	Only consider packages for removal with atime respectively mtime older than
> +	specified. The age can be given as '10d', '1m', '1y', '1y1m' etc.
> +
>  *-c, \--cachedir <dir>*::
>  	Specify a different cache directory. This option can be used more than once.
>  	Default is to use the cache directory configured in 'pacman.conf'.
> diff --git a/src/paccache.sh.in b/src/paccache.sh.in
> index 012ba9f..8ee5792 100644
> --- a/src/paccache.sh.in
> +++ b/src/paccache.sh.in
> @@ -27,6 +27,7 @@ declare -r myver='@PACKAGE_VERSION@'
>  
>  declare -a cachedirs=() candidates=() cmdopts=() whitelist=() blacklist=()
>  declare -i delete=0 dryrun=0 filecount=0 move=0 needsroot=0 totalsaved=0 verbose=0
> +declare -i age_atime=0 age_mtime=0
>  declare    delim=$'\n' keep=3 movedir= scanarch=
>  
>  QUIET=0
> @@ -40,6 +41,29 @@ die() {
>  	exit 1
>  }
>  
> +# Parses the age --age-atime and --age-mtime arguments
> +parse_age() {
> +	declare -i age=0
> +	if [[ $2 =~ ^[[:space:]]*([0-9]+[dmy][[:space:]]*)+$ ]]; then
> +		# Add spaces to facilitate splitting
> +		temp=${2//d/d }
> +		temp=${temp//m/m }
> +		temp=${temp//y/y }
> +		read -a temp <<< "${temp[*]}"
> +		for a in ${temp[@]}; do
> +			num=${a:0: -1}
> +			case ${a: -1} in
> +				d) age=$(( age + num )) ;;
> +				m) age=$(( age + num * 30 )) ;;
> +				y) age=$(( age + num * 365 )) ;;
> +			esac
> +		done
> +	else
> +		die "argument '%s' to option '%s' must be of the form '([0-9]+[dmy])+'" "$2" "$1"
> +	fi
> +	echo $(( age * 24 * 60 * 60 ))
> +}

This seems extremely complex, and I can think of two alternatives that
would be a lot simpler. First, find -mtime 2, with a suitable glob
pattern, by replacing

printf '%s\n' "$PWD"/*.pkg.tar!(*.sig)

when calculating the "candidates" array.

Second:

compare_file="$(mktemp -t paccache_timestamp.XXXXXX)"
touch -d '2 days ago' "$compare_file"

and then instead of this:

> +# remove any candidates that are not old enough yet
> +if (( $age_atime || $age_mtime )); then
> +  currtime=$(date +%s)
> +  for cand in "${candidates[@]}"; do
> +    IFS=';' read -d '' -a temp <<< $(stat --format '%X;%Y' "$cand")
> +    if (( ( $(( $currtime - ${temp[0]} )) > $age_atime ) && \
> +          ( $(( $currtime - ${temp[1]} )) > $age_mtime ) \
> +	  )); then
> +      candtemp+=("$cand")
> +    fi
> +  done
> +  candidates=("${candtemp[@]}")
> +  unset candtemp
> +fi

for cand in "${candidates[@]}"; do
    if [[ $cand -nt $compare_file ]]; then
        candtemp+=("$cand")
    fi
done

The find command accepts a number of days, the touch command accepts a
fairly decent "natural language" description.

-- 
Eli Schwartz
Bug Wrangler and Trusted User

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.archlinux.org/pipermail/pacman-contrib/attachments/20180916/4d7c8263/attachment.asc>


More information about the pacman-contrib mailing list