]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/checks.py
daklib/archive.py: allow copying files between components
[dak.git] / daklib / checks.py
index 0a22dde88a2d46bd9dfe8d5d1c4503578e5c326f..14fb02d35628bc0707562cdc4651b49ada5bd72f 100644 (file)
@@ -43,6 +43,15 @@ import yaml
 # TODO: replace by subprocess
 import commands
 
+def check_fields_for_valid_utf8(filename, control):
+    """Check all fields of a control file for valid UTF-8"""
+    for field in control.keys():
+        try:
+            field.decode('utf-8')
+            control[field].decode('utf-8')
+        except UnicodeDecodeError:
+            raise Reject('{0}: The {1} field is not valid UTF-8'.format(filename, field))
+
 class Reject(Exception):
     """exception raised by failing checks"""
     pass
@@ -160,6 +169,8 @@ class ChangesCheck(Check):
             if field not in control:
                 raise Reject('{0}: misses mandatory field {1}'.format(fn, field))
 
+        check_fields_for_valid_utf8(fn, control)
+
         source_match = re_field_source.match(control['Source'])
         if not source_match:
             raise Reject('{0}: Invalid Source field'.format(fn))
@@ -264,6 +275,8 @@ class BinaryCheck(Check):
             if field not in control:
                 raise Reject('{0}: Missing mandatory field {0}.'.format(fn, field))
 
+        check_fields_for_valid_utf8(fn, control)
+
         # check fields
 
         package = control['Package']
@@ -393,6 +406,8 @@ class SourceCheck(Check):
         control = source.dsc
         dsc_fn = source._dsc_file.filename
 
+        check_fields_for_valid_utf8(dsc_fn, control)
+
         # check fields
         if not re_field_package.match(control['Source']):
             raise Reject('{0}: Invalid Source field'.format(dsc_fn))
@@ -719,7 +734,7 @@ class VersionCheck(Check):
             if v is not None and not op(version_compare(source_version, v)):
                 raise Reject("Version check failed:\n"
                              "Your upload included the source package {0}, version {1},\n"
-                             "however {3} already has the {4} version {2}.\n"
+                             "however {3} already has version {2}.\n"
                              "Uploads to {5} must have a {4} version than present in {3}."
                              .format(source_name, source_version, v, other_suite.suite_name, op_name, suite.suite_name))
 
@@ -731,7 +746,7 @@ class VersionCheck(Check):
             if v is not None and not op(version_compare(binary_version, v)):
                 raise Reject("Version check failed:\n"
                              "Your upload included the binary package {0}, version {1}, for {2},\n"
-                             "however {4} already has the {5} version {3}.\n"
+                             "however {4} already has version {3}.\n"
                              "Uploads to {6} must have a {5} version than present in {4}."
                              .format(binary_name, binary_version, architecture, v, other_suite.suite_name, op_name, suite.suite_name))