3 from dak_exceptions import UnknownFormatError
7 def get_format_from_string(txt):
9 Returns the SourceFormat class that corresponds to the specified .changes
10 Format value. If the string does not match any class, UnknownFormatError
14 for format in srcformats:
15 if format.re_format.match(txt):
18 raise UnknownFormatError, "Unknown format %r" % txt
20 class SourceFormat(type):
21 def __new__(cls, name, bases, attrs):
22 klass = super(SourceFormat, cls).__new__(cls, name, bases, attrs)
23 srcformats.append(klass)
25 assert str(klass.name)
26 assert iter(klass.requires)
27 assert iter(klass.disallowed)
29 klass.re_format = re.compile(klass.format)
34 def reject_msgs(cls, has):
35 if len(cls.requires) != len([x for x in cls.requires if has[x]]):
36 yield "lack of required files for format %s" % cls.name
38 for key in cls.disallowed:
40 yield "contains source files not allowed in format %s" % cls.name
43 def validate_format(cls, format, is_a_dsc=False, field='files'):
45 Raises UnknownFormatError if the specified format tuple is not valid for
46 this format (for example, the format (1, 0) is not valid for the
47 "3.0 (quilt)" format). Return value is undefined in all other cases.
51 class FormatOne(SourceFormat):
52 __metaclass__ = SourceFormat
58 disallowed = ('debian_tar', 'more_orig_tar')
61 def reject_msgs(cls, has):
62 if not (has['native_tar_gz'] or (has['orig_tar_gz'] and has['debian_diff'])):
63 yield "no .tar.gz or .orig.tar.gz+.diff.gz in 'Files' field."
64 if has['native_tar_gz'] and has['debian_diff']:
65 yield "native package with diff makes no sense"
66 if (has['orig_tar_gz'] != has['orig_tar']) or \
67 (has['native_tar_gz'] != has['native_tar']):
68 yield "contains source files not allowed in format %s" % cls.name
70 for msg in super(FormatOne, cls).reject_msgs(has):
74 def validate_format(cls, format, is_a_dsc=False, field='files'):
75 msg = "Invalid format %s definition: %r" % (cls.name, format)
79 raise UnknownFormatError, msg
81 if (format < (1,5) or format > (1,8)):
82 raise UnknownFormatError, msg
83 if field != "files" and format < (1,8):
84 raise UnknownFormatError, msg
86 class FormatThree(SourceFormat):
87 __metaclass__ = SourceFormat
90 format = r'3\.\d+ \(native\)'
92 requires = ('native_tar',)
93 disallowed = ('orig_tar', 'debian_diff', 'debian_tar', 'more_orig_tar')
96 def validate_format(cls, format, **kwargs):
97 if format != (3, 0, 'native'):
98 raise UnknownFormatError, "Invalid format %s definition: %r" % \
101 class FormatThreeQuilt(SourceFormat):
102 __metaclass__ = SourceFormat
105 format = r'3\.\d+ \(quilt\)'
107 requires = ('orig_tar', 'debian_tar')
108 disallowed = ('debian_diff', 'native_tar')
111 def validate_format(cls, format, **kwargs):
112 if format != (3, 0, 'quilt'):
113 raise UnknownFormatError, "Invalid format %s definition: %r" % \