[Buildroot] [PATCH 1/1] check-package: fix Python3 support

Ricardo Martincoski ricardo.martincoski at gmail.com
Mon Jul 23 00:41:07 UTC 2018


This script currently uses "/usr/bin/env python" as shebang but it does
not really support Python3. Instead of limiting the script to Python2,
fix it to support both versions.

Do this by first using an automated tool:
$ python -m modernize -w -p <files>
and then manually fixing what remains:
 - keep the imports in alphabetical order;
 - fix handling of files that cannot be decoded by 'utf-8' codec, such
   as package/urg/0002-urg-gcc6-fix-narrowing-conversion.patch .

In order to avoid errors when decoding files, use
errors="surrogateescape" when opening files, the docs for open() states:
"This is useful for processing files in an unknown encoding.".
This argument is not compatible with Python2 open() so import 'six' to
use it only when running in Python3.
As a consequence the file handler becomes explicit, so use it to close()
the file after it got processed.

Signed-off-by: Ricardo Martincoski <ricardo.martincoski at gmail.com>
---
Using the default docker (debian) image which uses Python2:
before this patch:
https://gitlab.com/buildroot.org/buildroot/-/jobs/83454639
after this patch:
https://gitlab.com/RicardoMartincoski/buildroot/-/jobs/83542815

Using an arch docker image which uses Python3:
before this patch:
https://gitlab.com/RicardoMartincoski/buildroot/-/jobs/81892607
after this patch:
https://gitlab.com/RicardoMartincoski/buildroot/-/jobs/83543363
The arch image for docker was generated using:
http://patchwork.ozlabs.org/patch/943301/
---
 utils/check-package                 |  9 ++++++++-
 utils/checkpackagelib/lib.py        |  3 ++-
 utils/checkpackagelib/lib_config.py | 13 +++++++------
 utils/checkpackagelib/lib_hash.py   | 13 +++++++------
 utils/checkpackagelib/lib_mk.py     | 11 ++++++-----
 utils/checkpackagelib/lib_patch.py  |  5 +++--
 6 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/utils/check-package b/utils/check-package
index 3dbc28b0a2..a8f5ce6157 100755
--- a/utils/check-package
+++ b/utils/check-package
@@ -1,11 +1,13 @@
 #!/usr/bin/env python
 # See utils/checkpackagelib/readme.txt before editing this file.
 
+from __future__ import absolute_import
 from __future__ import print_function
 import argparse
 import inspect
 import os
 import re
+import six
 import sys
 
 import checkpackagelib.lib_config
@@ -127,10 +129,15 @@ def check_file_using_lib(fname):
 
     for cf in objects:
         nwarnings += print_warnings(cf.before())
-    for lineno, text in enumerate(open(fname, "r").readlines()):
+    if six.PY3:
+        f = open(fname, "r", errors="surrogateescape")
+    else:
+        f = open(fname, "r")
+    for lineno, text in enumerate(f.readlines()):
         nlines += 1
         for cf in objects:
             nwarnings += print_warnings(cf.check_line(lineno + 1, text))
+    f.close()
     for cf in objects:
         nwarnings += print_warnings(cf.after())
 
diff --git a/utils/checkpackagelib/lib.py b/utils/checkpackagelib/lib.py
index 91f4ad49b7..61fa46125d 100644
--- a/utils/checkpackagelib/lib.py
+++ b/utils/checkpackagelib/lib.py
@@ -1,6 +1,7 @@
 # See utils/checkpackagelib/readme.txt before editing this file.
 
-from base import _CheckFunction
+from __future__ import absolute_import
+from .base import _CheckFunction
 
 
 class ConsecutiveEmptyLines(_CheckFunction):
diff --git a/utils/checkpackagelib/lib_config.py b/utils/checkpackagelib/lib_config.py
index 1d273f1c5f..5f316a6d5b 100644
--- a/utils/checkpackagelib/lib_config.py
+++ b/utils/checkpackagelib/lib_config.py
@@ -3,13 +3,14 @@
 # "bool", so below check functions don't need to check for things already
 # checked by running "make menuconfig".
 
+from __future__ import absolute_import
 import re
 
-from base import _CheckFunction
-from lib import ConsecutiveEmptyLines  # noqa: F401
-from lib import EmptyLastLine          # noqa: F401
-from lib import NewlineAtEof           # noqa: F401
-from lib import TrailingSpace          # noqa: F401
+from .base import _CheckFunction
+from .lib import ConsecutiveEmptyLines  # noqa: F401
+from .lib import EmptyLastLine          # noqa: F401
+from .lib import NewlineAtEof           # noqa: F401
+from .lib import TrailingSpace          # noqa: F401
 
 
 def _empty_or_comment(text):
@@ -45,7 +46,7 @@ class AttributesOrder(_CheckFunction):
         if attribute in entries_that_should_not_be_indented:
             self.state = 0
             return
-        if attribute not in self.attributes_order_convention.keys():
+        if attribute not in list(self.attributes_order_convention.keys()):
             return
         new_state = self.attributes_order_convention[attribute]
         wrong_order = self.state > new_state
diff --git a/utils/checkpackagelib/lib_hash.py b/utils/checkpackagelib/lib_hash.py
index 6d4cc9fd62..8ca92a5a90 100644
--- a/utils/checkpackagelib/lib_hash.py
+++ b/utils/checkpackagelib/lib_hash.py
@@ -3,13 +3,14 @@
 # functions don't need to check for things already checked by running
 # "make package-dirclean package-source".
 
+from __future__ import absolute_import
 import re
 
-from base import _CheckFunction
-from lib import ConsecutiveEmptyLines  # noqa: F401
-from lib import EmptyLastLine          # noqa: F401
-from lib import NewlineAtEof           # noqa: F401
-from lib import TrailingSpace          # noqa: F401
+from .base import _CheckFunction
+from .lib import ConsecutiveEmptyLines  # noqa: F401
+from .lib import EmptyLastLine          # noqa: F401
+from .lib import NewlineAtEof           # noqa: F401
+from .lib import TrailingSpace          # noqa: F401
 
 
 def _empty_line_or_comment(text):
@@ -43,7 +44,7 @@ class HashType(_CheckFunction):
         htype, hexa = fields[:2]
         if htype == "none":
             return
-        if htype not in self.len_of_hash.keys():
+        if htype not in list(self.len_of_hash.keys()):
             return ["{}:{}: unexpected type of hash ({}#adding-packages-hash)"
                     .format(self.filename, lineno, self.url_to_manual),
                     text]
diff --git a/utils/checkpackagelib/lib_mk.py b/utils/checkpackagelib/lib_mk.py
index 86e9aa2d97..9c17a3cfd2 100644
--- a/utils/checkpackagelib/lib_mk.py
+++ b/utils/checkpackagelib/lib_mk.py
@@ -4,13 +4,14 @@
 # menu options using "make menuconfig" and by running "make" with appropriate
 # packages enabled.
 
+from __future__ import absolute_import
 import re
 
-from base import _CheckFunction
-from lib import ConsecutiveEmptyLines  # noqa: F401
-from lib import EmptyLastLine          # noqa: F401
-from lib import NewlineAtEof           # noqa: F401
-from lib import TrailingSpace          # noqa: F401
+from .base import _CheckFunction
+from .lib import ConsecutiveEmptyLines  # noqa: F401
+from .lib import EmptyLastLine          # noqa: F401
+from .lib import NewlineAtEof           # noqa: F401
+from .lib import TrailingSpace          # noqa: F401
 
 
 class Indent(_CheckFunction):
diff --git a/utils/checkpackagelib/lib_patch.py b/utils/checkpackagelib/lib_patch.py
index 555621afa1..4b0d32268f 100644
--- a/utils/checkpackagelib/lib_patch.py
+++ b/utils/checkpackagelib/lib_patch.py
@@ -3,10 +3,11 @@
 # functions don't need to check for things already checked by running
 # "make package-dirclean package-patch".
 
+from __future__ import absolute_import
 import re
 
-from base import _CheckFunction
-from lib import NewlineAtEof           # noqa: F401
+from .base import _CheckFunction
+from .lib import NewlineAtEof           # noqa: F401
 
 
 class ApplyOrder(_CheckFunction):
-- 
2.17.1



More information about the buildroot mailing list