Blob Blame History Raw
#!/bin/sh
# rpmsort implemented mostly in Lua
# Copyright (c) 2020 SUSE LLC
# SPDX-License-Identifier: GPL-2.0-or-later
# Author: fvogt@suse.de
# Enhanced by: mwilck@suse.com

rpmsort() {
	direction=$1
	script='
function parse(ver)
	local epoch, version, release = 0, ver, 0
	_, eend, e = ver:find("^(%d+):")
	if eend then
		ver = ver:sub(eend + 1)
		version = ver
		epoch = e
	end
	_, _, v, r = ver:find("(.+)%-(.+)$")
	if v then
		version = v
		release = r
	end
	return epoch, version, release
end

function pkgvercmp(a, b)
	local ae, av, ar = parse(a)
	local be, bv, br = parse(b)

	local ecmp = rpm.vercmp(ae, be)
	if ecmp ~= 0 then return ecmp end

	local vcmp = rpm.vercmp(av, bv)
	if vcmp ~= 0 then return vcmp end

	return rpm.vercmp(ar, br)
end

vers = {}
for line in io.stdin:lines() do
	table.insert(vers, line)
end
table.sort(vers, function(a, b) return pkgvercmp(a, b) == '"$direction"' end)
print(table.concat(vers, "\n"))
'

	rpm --eval "%{lua: ${script}}"
}

usage() {
	cat >&2 <<EOF
$0 - sort input according to rpm version sorting conventions

Expects rpm package versions separated by newlines as input and outputs
them sorted according to rpm version sorting conventions, with old versions
at the top.

Options:
	-r|--reverse	sort backwards
	-h|--help	print this help
EOF
	exit 0
}

DIRECTION=-1
while [ $# -gt 0 ]; do
	case $1 in
		-r|--reverse) DIRECTION=1;;
		-h|--help) usage;;
		*)  echo "$0: invalid parameter $1 ignored" >&2;;
	esac
	shift
done

rpmsort "$DIRECTION"