[libvirt] [PATCH v5 16/23] tests: rewrite qemu capability grouper in Python

Cole Robinson crobinso at redhat.com
Mon Nov 18 19:05:55 UTC 2019


On 11/11/19 9:38 AM, Daniel P. Berrangé wrote:
> As part of an 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.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  Makefile.am                |   1 +
>  build-aux/syntax-check.mk  |   3 +-
>  scripts/group-qemu-caps.py | 123 ++++++++++++++++++++++++++++++++++++
>  tests/group-qemu-caps.pl   | 124 -------------------------------------
>  4 files changed, 126 insertions(+), 125 deletions(-)
>  create mode 100755 scripts/group-qemu-caps.py
>  delete mode 100755 tests/group-qemu-caps.pl
> 
> diff --git a/Makefile.am b/Makefile.am
> index 6f6cead526..769cd4ce64 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -57,6 +57,7 @@ EXTRA_DIST = \
>    scripts/dtrace2systemtap.py \
>    scripts/genpolkit.py \
>    scripts/gensystemtap.py \
> +  scripts/group-qemu-caps.py \
>    scripts/header-ifdef.py \
>    scripts/minimize-po.py \
>    scripts/mock-noinline.py \
> diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk
> index 7d54df182a..44639f499e 100644
> --- a/build-aux/syntax-check.mk
> +++ b/build-aux/syntax-check.mk
> @@ -2176,7 +2176,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$$
> diff --git a/scripts/group-qemu-caps.py b/scripts/group-qemu-caps.py
> new file mode 100755
> index 0000000000..3edaf5d09f
> --- /dev/null
> +++ b/scripts/group-qemu-caps.py
> @@ -0,0 +1,123 @@
> +#!/usr/bin/env python
> +#
> +# 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.
> +
> +from __future__ import print_function
> +
> +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 test-wrap-argv.py to wrap test data files",
> +                  file=sys.stderr)

test-wrap-arg reference here

> +            return False
> +    else:
> +        with open(filename, "w") as fh:
> +            for line in fixed:
> +                print(line, file=fh, end='')
> +
> +    return True
> +
> +
> +parser = argparse.ArgumentParser(description='Test arg line wrapper')

test-wrap-arg reference here, should be group-qemu-caps

Otherwise it seems to work as expected

Tested-by: Cole Robinson <crobinso at redhat.com>




More information about the libvir-list mailing list