tests: rewrite qemu capability grouper in Python

As part of a goal to eliminate Perl from libvirt build tools,
rewrite the group-qemu-caps.pl tool in Python.

This was a straight conversion, manually going line-by-line to
change the syntax from Perl to Python. Thus the overall structure
of the file and approach is the same.

Tested-by: Cole Robinson <crobinso@redhat.com>
Reviewed-by: Cole Robinson <crobinso@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2019-08-30 13:22:54 +01:00
parent e11a186b97
commit 6ca74054b9
4 changed files with 124 additions and 125 deletions

View File

@ -59,6 +59,7 @@ EXTRA_DIST = \
scripts/esx_vi_generator.py \
scripts/genpolkit.py \
scripts/gensystemtap.py \
scripts/group-qemu-caps.py \
scripts/header-ifdef.py \
scripts/hyperv_wmi_generator.py \
scripts/minimize-po.py \

View File

@ -2187,7 +2187,8 @@ test-wrap-argv:
$(PYTHON) $(top_srcdir)/scripts/test-wrap-argv.py --check
group-qemu-caps:
$(AM_V_GEN)$(PERL) $(top_srcdir)/tests/group-qemu-caps.pl --check $(top_srcdir)/
$(AM_V_GEN)$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/group-qemu-caps.py \
--check --prefix $(top_srcdir)/
# List all syntax-check exemptions:
exclude_file_name_regexp--sc_avoid_strcase = ^tools/vsh\.h$$

121
scripts/group-qemu-caps.py Executable file
View File

@ -0,0 +1,121 @@
#!/usr/bin/env python3
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see
# <http://www.gnu.org/licenses/>.
#
#
# Regroup array values into smaller groups separated by numbered comments.
#
# If --check is the first parameter, the script will return
# a non-zero value if a file is not grouped correctly.
# Otherwise the files are regrouped in place.
import argparse
import re
import subprocess
import sys
def regroup_caps(check, filename, start_regex, end_regex,
trailing_newline, counter_prefix):
step = 5
original = []
with open(filename, "r") as fh:
for line in fh:
original.append(line)
fixed = []
game_on = False
counter = 0
for line in original:
line = line.rstrip("\n")
if game_on:
if re.search(r'''.*/\* [0-9]+ \*/.*''', line):
continue
if re.search(r'''^\s*$''', line):
continue
if counter % step == 0:
if counter != 0:
fixed.append("\n")
fixed.append("%s/* %d */\n" % (counter_prefix, counter))
if not (line.find("/*") != -1 and line.find("*/") == -1):
# count two-line comments as one line
counter = counter + 1
if re.search(start_regex, line):
game_on = True
elif game_on and re.search(end_regex, line):
if (counter - 1) % step == 0:
fixed = fixed[:-1] # /* $counter */
if counter != 1:
fixed = fixed[:-1] # \n
if trailing_newline:
fixed.append("\n")
game_on = False
fixed.append(line + "\n")
if check:
orig = "".join(original)
new = "".join(fixed)
if new != orig:
diff = subprocess.Popen(["diff", "-u", filename, "-"],
stdin=subprocess.PIPE)
diff.communicate(input=new.encode('utf-8'))
print("Incorrect line wrapping in $file",
file=sys.stderr)
print("Use group-qemu-caps.py to generate data files",
file=sys.stderr)
return False
else:
with open(filename, "w") as fh:
for line in fixed:
print(line, file=fh, end='')
return True
parser = argparse.ArgumentParser(description='QEMU capabilities group formatter')
parser.add_argument('--check', action="store_true",
help='check existing files only')
parser.add_argument('--prefix', default='',
help='source code tree prefix')
args = parser.parse_args()
errs = False
if not regroup_caps(args.check,
args.prefix + 'src/qemu/qemu_capabilities.c',
r'virQEMUCaps grouping marker',
r'\);',
0,
" "):
errs = True
if not regroup_caps(args.check,
args.prefix + 'src/qemu/qemu_capabilities.h',
r'virQEMUCapsFlags grouping marker',
r'QEMU_CAPS_LAST \/\* this must',
1,
" "):
errs = True
if errs:
sys.exit(1)
sys.exit(0)

View File

@ -1,124 +0,0 @@
#!/usr/bin/env perl
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library. If not, see
# <http://www.gnu.org/licenses/>.
#
#
# Regroup array values into smaller groups separated by numbered comments.
#
# If --check is the first parameter, the script will return
# a non-zero value if a file is not grouped correctly.
# Otherwise the files are regrouped in place.
use strict;
use warnings;
my $check = 0;
if (defined $ARGV[0] && $ARGV[0] eq "--check") {
$check = 1;
shift @ARGV;
}
my $prefix = '';
if (defined $ARGV[0]) {
$prefix = $ARGV[0];
shift @ARGV;
}
my $ret = 0;
if (&regroup_caps($prefix . 'src/qemu/qemu_capabilities.c',
'virQEMUCaps grouping marker',
'\);',
0,
" ") < 0) {
$ret = 1;
}
if (&regroup_caps($prefix . 'src/qemu/qemu_capabilities.h',
'virQEMUCapsFlags grouping marker',
'QEMU_CAPS_LAST \/\* this must',
1,
" ") < 0) {
$ret = 1;
}
exit $ret;
sub regroup_caps {
my $filename = shift;
my $start_regex = shift;
my $end_regex = shift;
my $trailing_newline = shift;
my $counter_prefix = shift;
my $step = 5;
open FILE, '<', $filename or die "cannot open $filename: $!";
my @original = <FILE>;
close FILE;
my @fixed;
my $game_on = 0;
my $counter = 0;
foreach (@original) {
if ($game_on) {
next if ($_ =~ '/\* [0-9]+ \*/');
next if (/^\s+$/);
if ($counter % $step == 0) {
if ($counter != 0) {
push @fixed, "\n";
}
push @fixed, "$counter_prefix/* $counter */\n";
}
if (!($_ =~ '/\*' && !($_ =~ '\*/'))) {
# count two-line comments as one line
$counter++;
}
}
if (/$start_regex/) {
$game_on = 1;
} elsif ($game_on && $_ =~ /$end_regex/) {
if (($counter -1) % $step == 0) {
pop @fixed; # /* $counter */
if ($counter != 1) {
pop @fixed; # \n
}
}
if ($trailing_newline) {
push @fixed, "\n";
}
$game_on = 0;
}
push @fixed, $_;
}
if ($check) {
my $nl = join('', @fixed);
my $ol = join('', @original);
unless ($nl eq $ol) {
open DIFF, "| diff -u $filename -" or die "cannot run diff: $!";
print DIFF $nl;
close DIFF;
print STDERR "Incorrect array grouping in $filename\n";
print STDERR "Use group-qemu-caps.pl to group long array members\n";
return -1;
}
} else {
open FILE, '>', $filename or die "cannot open $filename: $!";
foreach my $line (@fixed) {
print FILE $line;
}
close FILE;
}
}