Re: [PATCH] python: remove more instances of sys.version_info

2020-05-29 Thread Philippe Mathieu-Daudé
On 5/14/20 5:52 AM, John Snow wrote:
> We guarantee 3.5+ everywhere; remove more dead checks. In general, try
> to avoid using version checks and instead prefer to attempt behavior
> when possible.
> 
> Signed-off-by: John Snow 
> ---
>  scripts/analyze-migration.py |  5 -
>  scripts/decodetree.py| 25 +---
>  scripts/qmp/qmp-shell|  3 ---
>  tests/docker/docker.py   |  5 +++--
>  tests/qemu-iotests/nbd-fault-injector.py |  5 +
>  5 files changed, 13 insertions(+), 30 deletions(-)

Thanks, applied to my python-next tree:
https://gitlab.com/philmd/qemu/commits/python-next




Re: [PATCH] python: remove more instances of sys.version_info

2020-05-14 Thread Philippe Mathieu-Daudé

On 5/14/20 5:52 AM, John Snow wrote:

We guarantee 3.5+ everywhere; remove more dead checks. In general, try
to avoid using version checks and instead prefer to attempt behavior
when possible.

Signed-off-by: John Snow 
---
  scripts/analyze-migration.py |  5 -
  scripts/decodetree.py| 25 +---
  scripts/qmp/qmp-shell|  3 ---
  tests/docker/docker.py   |  5 +++--
  tests/qemu-iotests/nbd-fault-injector.py |  5 +
  5 files changed, 13 insertions(+), 30 deletions(-)

diff --git a/scripts/analyze-migration.py b/scripts/analyze-migration.py
index 96a31d3974..95838cbff3 100755
--- a/scripts/analyze-migration.py
+++ b/scripts/analyze-migration.py
@@ -25,11 +25,6 @@
  import sys
  
  
-MIN_PYTHON = (3, 2)

-if sys.version_info < MIN_PYTHON:
-sys.exit("Python %s.%s or later is required.\n" % MIN_PYTHON)
-
-
  def mkdir_p(path):
  try:
  os.makedirs(path)
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
index 46ab917807..f9d204aa36 100755
--- a/scripts/decodetree.py
+++ b/scripts/decodetree.py
@@ -75,13 +75,6 @@ def output(*args):
  output_fd.write(a)
  
  
-if sys.version_info >= (3, 4):

-re_fullmatch = re.fullmatch
-else:
-def re_fullmatch(pat, str):
-return re.match('^' + pat + '$', str)
-
-
  def output_autogen():
  output('/* This file is autogenerated by scripts/decodetree.py.  */\n\n')
  
@@ -428,18 +421,18 @@ def parse_field(lineno, name, toks):

  width = 0
  func = None
  for t in toks:
-if re_fullmatch('!function=' + re_ident, t):
+if re.fullmatch('!function=' + re_ident, t):
  if func:
  error(lineno, 'duplicate function')
  func = t.split('=')
  func = func[1]
  continue
  
-if re_fullmatch('[0-9]+:s[0-9]+', t):

+if re.fullmatch('[0-9]+:s[0-9]+', t):
  # Signed field extract
  subtoks = t.split(':s')
  sign = True
-elif re_fullmatch('[0-9]+:[0-9]+', t):
+elif re.fullmatch('[0-9]+:[0-9]+', t):
  # Unsigned field extract
  subtoks = t.split(':')
  sign = False
@@ -488,11 +481,11 @@ def parse_arguments(lineno, name, toks):
  flds = []
  extern = False
  for t in toks:
-if re_fullmatch('!extern', t):
+if re.fullmatch('!extern', t):
  extern = True
  anyextern = True
  continue
-if not re_fullmatch(re_ident, t):
+if not re.fullmatch(re_ident, t):
  error(lineno, 'invalid argument set token "{0}"'.format(t))
  if t in flds:
  error(lineno, 'duplicate argument "{0}"'.format(t))
@@ -621,13 +614,13 @@ def parse_generic(lineno, is_format, name, toks):
  continue
  
  # 'Foo=%Bar' imports a field with a different name.

-if re_fullmatch(re_ident + '=%' + re_ident, t):
+if re.fullmatch(re_ident + '=%' + re_ident, t):
  (fname, iname) = t.split('=%')
  flds = add_field_byname(lineno, flds, fname, iname)
  continue
  
  # 'Foo=number' sets an argument field to a constant value

-if re_fullmatch(re_ident + '=[+-]?[0-9]+', t):
+if re.fullmatch(re_ident + '=[+-]?[0-9]+', t):
  (fname, value) = t.split('=')
  value = int(value)
  flds = add_field(lineno, flds, fname, ConstField(value))
@@ -635,7 +628,7 @@ def parse_generic(lineno, is_format, name, toks):
  
  # Pattern of 0s, 1s, dots and dashes indicate required zeros,

  # required ones, or dont-cares.
-if re_fullmatch('[01.-]+', t):
+if re.fullmatch('[01.-]+', t):
  shift = len(t)
  fms = t.replace('0', '1')
  fms = fms.replace('.', '0')
@@ -652,7 +645,7 @@ def parse_generic(lineno, is_format, name, toks):
  fixedmask = (fixedmask << shift) | fms
  undefmask = (undefmask << shift) | ubm
  # Otherwise, fieldname:fieldwidth
-elif re_fullmatch(re_ident + ':s?[0-9]+', t):
+elif re.fullmatch(re_ident + ':s?[0-9]+', t):
  (fname, flen) = t.split(':')
  sign = False
  if flen[0] == 's':
diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
index a01d31de1e..c5eef06f3f 100755
--- a/scripts/qmp/qmp-shell
+++ b/scripts/qmp/qmp-shell
@@ -77,9 +77,6 @@ import re
  sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
  from qemu import qmp
  
-if sys.version_info[0] == 2:


:)

Reviewed-by: Philippe Mathieu-Daudé 


-input = raw_input
-
  class QMPCompleter(list):
  def complete(self, text, state):
  for cmd in self:
diff --git a/tests/docker/docker.py b/tests/docker/docker.py
index d8268c..5a9735db78 100755
--- a/tests/docker/docker.py
+++ b/tests/docker/docker.py
@@ -258,12 +258,13 @@ def 

[PATCH] python: remove more instances of sys.version_info

2020-05-13 Thread John Snow
We guarantee 3.5+ everywhere; remove more dead checks. In general, try
to avoid using version checks and instead prefer to attempt behavior
when possible.

Signed-off-by: John Snow 
---
 scripts/analyze-migration.py |  5 -
 scripts/decodetree.py| 25 +---
 scripts/qmp/qmp-shell|  3 ---
 tests/docker/docker.py   |  5 +++--
 tests/qemu-iotests/nbd-fault-injector.py |  5 +
 5 files changed, 13 insertions(+), 30 deletions(-)

diff --git a/scripts/analyze-migration.py b/scripts/analyze-migration.py
index 96a31d3974..95838cbff3 100755
--- a/scripts/analyze-migration.py
+++ b/scripts/analyze-migration.py
@@ -25,11 +25,6 @@
 import sys
 
 
-MIN_PYTHON = (3, 2)
-if sys.version_info < MIN_PYTHON:
-sys.exit("Python %s.%s or later is required.\n" % MIN_PYTHON)
-
-
 def mkdir_p(path):
 try:
 os.makedirs(path)
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
index 46ab917807..f9d204aa36 100755
--- a/scripts/decodetree.py
+++ b/scripts/decodetree.py
@@ -75,13 +75,6 @@ def output(*args):
 output_fd.write(a)
 
 
-if sys.version_info >= (3, 4):
-re_fullmatch = re.fullmatch
-else:
-def re_fullmatch(pat, str):
-return re.match('^' + pat + '$', str)
-
-
 def output_autogen():
 output('/* This file is autogenerated by scripts/decodetree.py.  */\n\n')
 
@@ -428,18 +421,18 @@ def parse_field(lineno, name, toks):
 width = 0
 func = None
 for t in toks:
-if re_fullmatch('!function=' + re_ident, t):
+if re.fullmatch('!function=' + re_ident, t):
 if func:
 error(lineno, 'duplicate function')
 func = t.split('=')
 func = func[1]
 continue
 
-if re_fullmatch('[0-9]+:s[0-9]+', t):
+if re.fullmatch('[0-9]+:s[0-9]+', t):
 # Signed field extract
 subtoks = t.split(':s')
 sign = True
-elif re_fullmatch('[0-9]+:[0-9]+', t):
+elif re.fullmatch('[0-9]+:[0-9]+', t):
 # Unsigned field extract
 subtoks = t.split(':')
 sign = False
@@ -488,11 +481,11 @@ def parse_arguments(lineno, name, toks):
 flds = []
 extern = False
 for t in toks:
-if re_fullmatch('!extern', t):
+if re.fullmatch('!extern', t):
 extern = True
 anyextern = True
 continue
-if not re_fullmatch(re_ident, t):
+if not re.fullmatch(re_ident, t):
 error(lineno, 'invalid argument set token "{0}"'.format(t))
 if t in flds:
 error(lineno, 'duplicate argument "{0}"'.format(t))
@@ -621,13 +614,13 @@ def parse_generic(lineno, is_format, name, toks):
 continue
 
 # 'Foo=%Bar' imports a field with a different name.
-if re_fullmatch(re_ident + '=%' + re_ident, t):
+if re.fullmatch(re_ident + '=%' + re_ident, t):
 (fname, iname) = t.split('=%')
 flds = add_field_byname(lineno, flds, fname, iname)
 continue
 
 # 'Foo=number' sets an argument field to a constant value
-if re_fullmatch(re_ident + '=[+-]?[0-9]+', t):
+if re.fullmatch(re_ident + '=[+-]?[0-9]+', t):
 (fname, value) = t.split('=')
 value = int(value)
 flds = add_field(lineno, flds, fname, ConstField(value))
@@ -635,7 +628,7 @@ def parse_generic(lineno, is_format, name, toks):
 
 # Pattern of 0s, 1s, dots and dashes indicate required zeros,
 # required ones, or dont-cares.
-if re_fullmatch('[01.-]+', t):
+if re.fullmatch('[01.-]+', t):
 shift = len(t)
 fms = t.replace('0', '1')
 fms = fms.replace('.', '0')
@@ -652,7 +645,7 @@ def parse_generic(lineno, is_format, name, toks):
 fixedmask = (fixedmask << shift) | fms
 undefmask = (undefmask << shift) | ubm
 # Otherwise, fieldname:fieldwidth
-elif re_fullmatch(re_ident + ':s?[0-9]+', t):
+elif re.fullmatch(re_ident + ':s?[0-9]+', t):
 (fname, flen) = t.split(':')
 sign = False
 if flen[0] == 's':
diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
index a01d31de1e..c5eef06f3f 100755
--- a/scripts/qmp/qmp-shell
+++ b/scripts/qmp/qmp-shell
@@ -77,9 +77,6 @@ import re
 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
 from qemu import qmp
 
-if sys.version_info[0] == 2:
-input = raw_input
-
 class QMPCompleter(list):
 def complete(self, text, state):
 for cmd in self:
diff --git a/tests/docker/docker.py b/tests/docker/docker.py
index d8268c..5a9735db78 100755
--- a/tests/docker/docker.py
+++ b/tests/docker/docker.py
@@ -258,12 +258,13 @@ def _kill_instances(self, *args, **kwargs):
 return self._do_kill_instances(True)
 
 def _output(self, cmd, **kwargs):
-if sys.version_info[1] >= 6:
+