[Buildroot] [PATCH 4/9] check-package: check *.hash files

Ricardo Martincoski ricardo.martincoski at gmail.com
Sat Dec 31 03:21:05 UTC 2016


Check each hash entry (see [1]) and warn when:
- it does not have three fields;
- its type is unknown;
- its length does not match its type;
- the name of the file contains a directory component.

[1] http://nightly.buildroot.org/#adding-packages-hash

Signed-off-by: Ricardo Martincoski <ricardo.martincoski at gmail.com>
---

Notes:
    $ time support/scripts/check-package $(find package -type f) >/dev/null 2>/dev/null
    
    real	0m0.837s
    user	0m0.780s
    sys	0m0.056s
    
    CHECK_HASH_FILENAME:
     support/scripts/check-package --include-only check_hash_filename \
     $(find package -name '*.hash') 2>/dev/null | wc -l
      0
     (cd support/scripts/check-package-example && \
     ../check-package --include-only check_hash_filename -vv package/*/*)
      package/package1/package1.hash:5: use filename without directory component (http://nightly.buildroot.org/#adding-packages-hash)
      sha256< tab  >12345678901234567890123456789012345678901234567890123456789012345< tab  >dl/package1-1.0.tar.gz
      159 lines processed
      1 warnings generated
    
    CHECK_HASH_NUMBER_OF_FIELDS:
     support/scripts/check-package --include-only check_hash_number_of_fields \
     $(find package -name '*.hash') 2>/dev/null | wc -l
      0
     (cd support/scripts/check-package-example && \
     ../check-package --include-only check_hash_number_of_fields -vv package/*/*)
      package/package1/package1.hash:6: expected three fields (http://nightly.buildroot.org/#adding-packages-hash)
      sha256 1234567890123456789012345678901234567890123456789012345678901234
      159 lines processed
      1 warnings generated
    
    CHECK_HASH_TYPE:
     support/scripts/check-package --include-only check_hash_type \
     $(find package -name '*.hash') 2>/dev/null | wc -l
      1
     (cd support/scripts/check-package-example && \
     ../check-package --include-only check_hash_type -vv package/*/*)
      package/package1/package1.hash:3: hash size does not match type (http://nightly.buildroot.org/#adding-packages-hash)
      sha256 123456789 package1-1.0.tar.gz
      expected 64 hex digits
      package/package1/package1.hash:4: unexpected type of hash (http://nightly.buildroot.org/#adding-packages-hash)
      crc16< tab  >123456789< tab  >package1-1.0.tar.gz
      package/package1/package1.hash:5: hash size does not match type (http://nightly.buildroot.org/#adding-packages-hash)
      sha256< tab  >12345678901234567890123456789012345678901234567890123456789012345< tab  >dl/package1-1.0.tar.gz
      expected 64 hex digits
      159 lines processed
      3 warnings generated

 support/scripts/checkpackagelib_hash.py | 66 +++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/support/scripts/checkpackagelib_hash.py b/support/scripts/checkpackagelib_hash.py
index d095f9255..646c6cc12 100644
--- a/support/scripts/checkpackagelib_hash.py
+++ b/support/scripts/checkpackagelib_hash.py
@@ -3,8 +3,74 @@
 # functions don't need to check for things already checked by running
 # "make package-dirclean package-source".
 
+import re
+
 # Notice: ignore 'imported but unused' from pyflakes for check functions.
 from checkpackagelib import check_consecutive_empty_lines
 from checkpackagelib import check_empty_last_line
 from checkpackagelib import check_newline_at_eof
 from checkpackagelib import check_trailing_space
+
+
+def _empty_line_or_comment(text):
+    return text.strip() == "" or text.startswith("#")
+
+
+FILENAME_WITH_SLASH = re.compile("/")
+
+
+def check_hash_filename(
+        fname, args, lineno=0, text=None, start=False, end=False):
+    if start or end or _empty_line_or_comment(text):
+        return
+
+    fields = text.split()
+    if len(fields) < 3:
+        return
+
+    filename = fields[2]
+    if FILENAME_WITH_SLASH.search(filename):
+        return ["{}:{}: use filename without directory component"
+                " ({}#adding-packages-hash)"
+                .format(fname, lineno, args.manual_url),
+                text]
+
+
+def check_hash_number_of_fields(
+        fname, args, lineno=0, text=None, start=False, end=False):
+    if start or end or _empty_line_or_comment(text):
+        return
+
+    fields = text.split()
+    if len(fields) != 3:
+        return ["{}:{}: expected three fields ({}#adding-packages-hash)"
+                .format(fname, lineno, args.manual_url),
+                text]
+
+
+len_of_hash = {"md5": 32, "sha1": 40, "sha224": 56, "sha256": 64, "sha384": 96,
+               "sha512": 128}
+
+
+def check_hash_type(
+        fname, args, lineno=0, text=None, start=False, end=False):
+    if start or end or _empty_line_or_comment(text):
+        return
+
+    fields = text.split()
+    if len(fields) < 2:
+        return
+
+    hash_type, hexa = fields[:2]
+    if hash_type == "none":
+        return
+    if hash_type not in len_of_hash.keys():
+        return ["{}:{}: unexpected type of hash ({}#adding-packages-hash)"
+                .format(fname, lineno, args.manual_url),
+                text]
+    if not re.match("^[0-9A-Fa-f]{%s}$" % len_of_hash[hash_type], hexa):
+        return ["{}:{}: hash size does not match type "
+                "({}#adding-packages-hash)"
+                .format(fname, lineno, args.manual_url),
+                text,
+                "expected {} hex digits".format(len_of_hash[hash_type])]
-- 
2.11.0



More information about the buildroot mailing list