77 lines
1.5 KiB
Bash
77 lines
1.5 KiB
Bash
#!/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"
|