mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
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:
parent
e11a186b97
commit
6ca74054b9
@ -59,6 +59,7 @@ EXTRA_DIST = \
|
|||||||
scripts/esx_vi_generator.py \
|
scripts/esx_vi_generator.py \
|
||||||
scripts/genpolkit.py \
|
scripts/genpolkit.py \
|
||||||
scripts/gensystemtap.py \
|
scripts/gensystemtap.py \
|
||||||
|
scripts/group-qemu-caps.py \
|
||||||
scripts/header-ifdef.py \
|
scripts/header-ifdef.py \
|
||||||
scripts/hyperv_wmi_generator.py \
|
scripts/hyperv_wmi_generator.py \
|
||||||
scripts/minimize-po.py \
|
scripts/minimize-po.py \
|
||||||
|
@ -2187,7 +2187,8 @@ test-wrap-argv:
|
|||||||
$(PYTHON) $(top_srcdir)/scripts/test-wrap-argv.py --check
|
$(PYTHON) $(top_srcdir)/scripts/test-wrap-argv.py --check
|
||||||
|
|
||||||
group-qemu-caps:
|
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:
|
# List all syntax-check exemptions:
|
||||||
exclude_file_name_regexp--sc_avoid_strcase = ^tools/vsh\.h$$
|
exclude_file_name_regexp--sc_avoid_strcase = ^tools/vsh\.h$$
|
||||||
|
121
scripts/group-qemu-caps.py
Executable file
121
scripts/group-qemu-caps.py
Executable 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)
|
@ -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 (®roup_caps($prefix . 'src/qemu/qemu_capabilities.c',
|
|
||||||
'virQEMUCaps grouping marker',
|
|
||||||
'\);',
|
|
||||||
0,
|
|
||||||
" ") < 0) {
|
|
||||||
$ret = 1;
|
|
||||||
}
|
|
||||||
if (®roup_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;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user