| 
									
										
										
										
											2017-11-20 05:12:54 +03:00
										 |  |  | #!/usr/bin/bash | 
					
						
							| 
									
										
										
										
											2017-11-21 17:41:40 +03:00
										 |  |  | shopt -s nullglob | 
					
						
							| 
									
										
										
										
											2017-11-20 05:12:54 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | parse_pkg_filename() { | 
					
						
							|  |  |  | 	declare filename=$1 | 
					
						
							|  |  |  | 	declare -a filename_array | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	IFS='-' read -r -a filename_array <<< "$filename" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (( i=${#filename_array[@]}; i>=0; i-- )); do | 
					
						
							|  |  |  | 		printf '%s ' "${filename_array[$i]}" | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | is_latest() { | 
					
						
							|  |  |  | 	declare filename=$1 p | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for p in "${latest[@]}"; do | 
					
						
							|  |  |  | 		if [[ "$filename" == "$p" ]]; then | 
					
						
							|  |  |  | 			return 0 | 
					
						
							|  |  |  | 		fi | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _pacsort() { | 
					
						
							|  |  |  | 	declare i | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-27 02:47:54 +03:00
										 |  |  | 	for i in *.pkg.tar.xz *.pkg.tar.zst; do | 
					
						
							| 
									
										
										
										
											2017-11-20 05:12:54 +03:00
										 |  |  | 		printf '%s\n' "$i" | 
					
						
							|  |  |  | 	done | pacsort -f | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | while (( $# )); do | 
					
						
							|  |  |  | 	case "$1" in | 
					
						
							|  |  |  | 		-r) flag_rm=1;; | 
					
						
							| 
									
										
										
										
											2017-11-20 05:45:42 +03:00
										 |  |  | 		-d) flag_debug=1;; | 
					
						
							| 
									
										
										
										
											2017-11-20 05:12:54 +03:00
										 |  |  | 	esac | 
					
						
							|  |  |  | 	shift | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ! (( flag_rm )); then | 
					
						
							|  |  |  | 	if ! [[ -d old ]]; then | 
					
						
							|  |  |  | 		mkdir -p old || { | 
					
						
							|  |  |  | 			return 1 | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | read -d '' -r -a package_files < <( _pacsort ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | for f in "${package_files[@]}"; do | 
					
						
							|  |  |  | 	unset revision version end package_name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	read -r end revision version _ < <(parse_pkg_filename "$f") | 
					
						
							|  |  |  | 	package_name=${f%%-$version-$revision*} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	declare -g -A latest["$package_name"]="$package_name-$version-$revision-$end" | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | for f in ${package_files[@]}; do | 
					
						
							|  |  |  | 	if is_latest "$f"; then | 
					
						
							| 
									
										
										
										
											2017-11-20 05:45:42 +03:00
										 |  |  | 		(( flag_debug )) && printf '%s is the latest version available\n' "$f" | 
					
						
							| 
									
										
										
										
											2017-11-20 05:12:54 +03:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		printf 'Removing: %s\n' "$f" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (( flag_rm )); then | 
					
						
							|  |  |  | 			rm -f "$f" "${f}.sig" | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			mv "$f" old/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if [[ -f "${f}.sig" ]]; then | 
					
						
							|  |  |  | 				mv "${f}.sig" old/ | 
					
						
							|  |  |  | 			fi | 
					
						
							|  |  |  | 		fi | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [[ -d old ]]; then | 
					
						
							|  |  |  | 	cd old | 
					
						
							|  |  |  | 	exec bash "$0" -r | 
					
						
							|  |  |  | fi |