Accepting request 790868 from home:favogt:rpmsmalle
Rebased: - Replace rpmsort with rewrite using Lua (boo#1164553) - Split out perl and python dep generators from rpm-build to avoid pulling in perl and python in all RPM builds - Port rpmconfigcheck to pure shell - Refactor %files list of main package to not require %excludes as those might lead to missing files in the package OBS-URL: https://build.opensuse.org/request/show/790868 OBS-URL: https://build.opensuse.org/package/show/Base:System/rpm?expand=0&rev=537
This commit is contained in:
150
rpmsort
150
rpmsort
@@ -1,102 +1,76 @@
|
||||
#! /usr/bin/perl -w
|
||||
#!/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
|
||||
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
# USA.
|
||||
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
|
||||
|
||||
use Getopt::Long qw(:config gnu_getopt);
|
||||
function pkgvercmp(a, b)
|
||||
local ae, av, ar = parse(a)
|
||||
local be, bv, br = parse(b)
|
||||
|
||||
sub do_rpm_cmp_versions {
|
||||
my ($evr1, $evr2) = @_;
|
||||
local ecmp = rpm.vercmp(ae, be)
|
||||
if ecmp ~= 0 then return ecmp end
|
||||
|
||||
sub _rpm_cmp {
|
||||
my ($s1, $s2) = @_;
|
||||
local vcmp = rpm.vercmp(av, bv)
|
||||
if vcmp ~= 0 then return vcmp end
|
||||
|
||||
return defined $s1 <=> defined $s2
|
||||
unless defined $s1 && defined $s2;
|
||||
return rpm.vercmp(ar, br)
|
||||
end
|
||||
|
||||
my ($r, $x1, $x2);
|
||||
do {
|
||||
$s1 =~ s/^[^a-zA-Z0-9]+//;
|
||||
$s2 =~ s/^[^a-zA-Z0-9]+//;
|
||||
if ($s1 =~ /^\d/ || $s2 =~ /^\d/) {
|
||||
$s1 =~ s/^(0*(\d*))//; $x1 = $2;
|
||||
return -1 if $1 eq '';
|
||||
$s2 =~ s/^(0*(\d*))//; $x2 = $2;
|
||||
return 1 if $1 eq '';
|
||||
$r = length $x1 <=> length $x2 || $x1 cmp $x2;
|
||||
} else {
|
||||
$s1 =~ s/^([a-zA-Z]*)//; $x1 = $1;
|
||||
$s2 =~ s/^([a-zA-Z]*)//; $x2 = $1;
|
||||
return 0
|
||||
if $x1 eq '' && $x2 eq '';
|
||||
$r = $x1 cmp $x2;
|
||||
}
|
||||
} until $r;
|
||||
return $r;
|
||||
}
|
||||
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"))
|
||||
'
|
||||
|
||||
my ($e1, $v1, $r1) = $evr1 =~ /^(?:(\d*):)?(.*?)(?:-([^-]*))?$/;
|
||||
my ($e2, $v2, $r2) = $evr2 =~ /^(?:(\d*):)?(.*?)(?:-([^-]*))?$/;
|
||||
my $r = _rpm_cmp($e1 || 0, $e2 || 0);
|
||||
$r = _rpm_cmp($v1, $v2)
|
||||
unless $r;
|
||||
$r = _rpm_cmp($r1, $r2)
|
||||
unless $r;
|
||||
return $r;
|
||||
rpm --eval "%{lua: ${script}}"
|
||||
}
|
||||
|
||||
my $reorder = sub { return @_ };
|
||||
my $key = 0;
|
||||
my $test = 0;
|
||||
usage() {
|
||||
cat >&2 <<EOF
|
||||
$0 - sort input according to rpm version sorting conventions
|
||||
|
||||
sub rpm_cmp_versions {
|
||||
my ($evr1, $evr2) = @_;
|
||||
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.
|
||||
|
||||
chomp($evr1, $evr2);
|
||||
my $res1 = do_rpm_cmp_versions($evr1, $evr2);
|
||||
if ($test) {
|
||||
open(my $fd, '-|', 'zypper', '--terse', 'versioncmp',
|
||||
$evr1, $evr2) or die "zypper: $!\n";
|
||||
my $res2 = <$fd>;
|
||||
close($fd) or die "zypper: $!\n";
|
||||
chomp $res2;
|
||||
if ($res1 != $res2) {
|
||||
my @operators = qw(< == >);
|
||||
my $op1 = $operators[$res1 + 1];
|
||||
my $op2 = $operators[$res2 + 1];
|
||||
|
||||
print STDERR "BUG: $evr1 $op1 $evr2 vs. zypper: $evr1 $op2 $evr2\n";
|
||||
}
|
||||
}
|
||||
return $res1;
|
||||
Options:
|
||||
-r|--reverse sort backwards
|
||||
-h|--help print this help
|
||||
EOF
|
||||
exit 0
|
||||
}
|
||||
|
||||
GetOptions ("r|reverse" => sub { $reorder = sub { return reverse @_ } },
|
||||
"k|key=i" => \$key,
|
||||
"test" => \$test)
|
||||
or do {
|
||||
print STDERR "Usage $0 [-r, --reverse] [-k N, --key=N] [--test]\n";
|
||||
exit 1;
|
||||
};
|
||||
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
|
||||
|
||||
if ($key == 0) {
|
||||
# Sort by entire lines
|
||||
map { print } &$reorder(sort { rpm_cmp_versions($a, $b) } <>);
|
||||
} else {
|
||||
# Sort by field $key
|
||||
my @data = map { [(split)[$key-1], $_] } <>;
|
||||
map { print } &$reorder(map { $_->[1] }
|
||||
sort { rpm_cmp_versions($a->[0], $b->[0]) } @data);
|
||||
}
|
||||
rpmsort "$DIRECTION"
|
||||
|
Reference in New Issue
Block a user