Blame rpmsort

Bernhard M. Wiedemann 88e749
#!/bin/sh
Bernhard M. Wiedemann 88e749
# rpmsort implemented mostly in Lua
Bernhard M. Wiedemann 88e749
# Copyright (c) 2020 SUSE LLC
Bernhard M. Wiedemann 88e749
# SPDX-License-Identifier: GPL-2.0-or-later
Bernhard M. Wiedemann 88e749
# Author: fvogt@suse.de
Bernhard M. Wiedemann 88e749
# Enhanced by: mwilck@suse.com
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
rpmsort() {
Bernhard M. Wiedemann 88e749
	direction=$1
Bernhard M. Wiedemann 88e749
	script='
Bernhard M. Wiedemann 88e749
function parse(ver)
Bernhard M. Wiedemann 88e749
	local epoch, version, release = 0, ver, 0
Bernhard M. Wiedemann 88e749
	_, eend, e = ver:find("^(%d+):")
Bernhard M. Wiedemann 88e749
	if eend then
Bernhard M. Wiedemann 88e749
		ver = ver:sub(eend + 1)
Bernhard M. Wiedemann 88e749
		version = ver
Bernhard M. Wiedemann 88e749
		epoch = e
Bernhard M. Wiedemann 88e749
	end
Bernhard M. Wiedemann 88e749
	_, _, v, r = ver:find("(.+)%-(.+)$")
Bernhard M. Wiedemann 88e749
	if v then
Bernhard M. Wiedemann 88e749
		version = v
Bernhard M. Wiedemann 88e749
		release = r
Bernhard M. Wiedemann 88e749
	end
Bernhard M. Wiedemann 88e749
	return epoch, version, release
Bernhard M. Wiedemann 88e749
end
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
function pkgvercmp(a, b)
Bernhard M. Wiedemann 88e749
	local ae, av, ar = parse(a)
Bernhard M. Wiedemann 88e749
	local be, bv, br = parse(b)
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
	local ecmp = rpm.vercmp(ae, be)
Bernhard M. Wiedemann 88e749
	if ecmp ~= 0 then return ecmp end
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
	local vcmp = rpm.vercmp(av, bv)
Bernhard M. Wiedemann 88e749
	if vcmp ~= 0 then return vcmp end
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
	return rpm.vercmp(ar, br)
Bernhard M. Wiedemann 88e749
end
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
vers = {}
Bernhard M. Wiedemann 88e749
for line in io.stdin:lines() do
Bernhard M. Wiedemann 88e749
	table.insert(vers, line)
Bernhard M. Wiedemann 88e749
end
Bernhard M. Wiedemann 88e749
table.sort(vers, function(a, b) return pkgvercmp(a, b) == '"$direction"' end)
Bernhard M. Wiedemann 88e749
print(table.concat(vers, "\n"))
Bernhard M. Wiedemann 88e749
'
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
	rpm --eval "%{lua: ${script}}"
Bernhard M. Wiedemann 1250f9
}
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
usage() {
Bernhard M. Wiedemann 88e749
	cat >&2 <
Bernhard M. Wiedemann 88e749
$0 - sort input according to rpm version sorting conventions
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
Expects rpm package versions separated by newlines as input and outputs
Bernhard M. Wiedemann 88e749
them sorted according to rpm version sorting conventions, with old versions
Bernhard M. Wiedemann 88e749
at the top.
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
Options:
Bernhard M. Wiedemann 88e749
	-r|--reverse	sort backwards
Bernhard M. Wiedemann 88e749
	-h|--help	print this help
Bernhard M. Wiedemann 88e749
EOF
Bernhard M. Wiedemann 88e749
	exit 0
Bernhard M. Wiedemann 1250f9
}
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
DIRECTION=-1
Bernhard M. Wiedemann 88e749
while [ $# -gt 0 ]; do
Bernhard M. Wiedemann 88e749
	case $1 in
Bernhard M. Wiedemann 88e749
		-r|--reverse) DIRECTION=1;;
Bernhard M. Wiedemann 88e749
		-h|--help) usage;;
Bernhard M. Wiedemann 88e749
		*)  echo "$0: invalid parameter $1 ignored" >&2;;
Bernhard M. Wiedemann 88e749
	esac
Bernhard M. Wiedemann 88e749
	shift
Bernhard M. Wiedemann 88e749
done
Bernhard M. Wiedemann 1250f9
Bernhard M. Wiedemann 88e749
rpmsort "$DIRECTION"