1# vim:set et sw=4:
3"""
4Central repository of regexes for dak
6@contact: Debian FTP Master <ftpmaster@debian.org>
7@copyright: 2001, 2002, 2003, 2004, 2005, 2006 James Troup <james@nocrew.org>
8@copyright: 2009 Mark Hymers <mhy@debian.org>
9@copyright: 2009, 2010 Joerg Jaspert <joerg@debian.org>
10@license: GNU General Public License version 2 or later
11"""
13# This program is free software; you can redistribute it and/or modify
14# it under the terms of the GNU General Public License as published by
15# the Free Software Foundation; either version 2 of the License, or
16# (at your option) any later version.
18# This program is distributed in the hope that it will be useful,
19# but WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21# GNU General Public License for more details.
23# You should have received a copy of the GNU General Public License
24# along with this program; if not, write to the Free Software
25# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27###############################################################################
29import re
31#: Is it a number?
32re_isanum = re.compile(r"^\d+$")
34#: Looking for the default reply
35re_default_answer = re.compile(r"\[(.*)\]")
36#: Detect a binnmu
37re_bin_only_nmu = re.compile(r"\+b\d+$")
39#: To sort out comment lines
40re_comments = re.compile(r"\#.*")
41#: To ignore comment and whitespace lines.
42re_whitespace_comment = re.compile(r"^\s*(#|$)")
43re_no_epoch = re.compile(r"^\d+\:")
44re_extract_src_version = re.compile(r"(\S+)\s*\((.*)\)")
45re_isadeb = re.compile(r"(.+?)_(.+?)_(.+)\.u?deb$")
47orig_source_ext_re = r"orig(?:-[a-zA-Z0-9-]+)?\.tar\.(?:gz|bz2|xz)(?:\.asc)?"
48file_source_ext_re = (
49 "(" + orig_source_ext_re + r"|(?:debian\.)?tar\.(?:gz|bz2|xz)|diff\.gz)"
50)
51re_source_ext = re.compile("(" + file_source_ext_re + r"|dsc)$")
52re_issource = re.compile(r"(.+)_(.+?)\." + re_source_ext.pattern)
54re_single_line_field = re.compile(r"^(\S*?)\s*:\s*(.*)")
55re_multi_line_field = re.compile(r"^\s(.*)")
56re_taint_free = re.compile(r"^[-+~/\.\w]+$")
58re_parse_maintainer = re.compile(r"^\s*(\S.*\S)\s*\<([^\>]+)\>")
60re_srchasver = re.compile(r"^(\S+)\s+\((\S+)\)$")
61re_verwithext = re.compile(r"^(\d+)(?:\.(\d+))(?:\s+\((\S+)\))?$")
63# From clean_proposed_updates.py
64re_isdeb = re.compile(r"^(.+)_(.+?)_(.+?).u?deb$")
66# From examine_package.py
67re_package = re.compile(r"^(.+?)_.*")
68re_doc_directory = re.compile(r".*/doc/([^/]*).*")
70re_contrib = re.compile("^contrib/")
71re_nonfree = re.compile("^(?:non-free-firmware|non-free)/")
73re_localhost = re.compile(r"localhost\.localdomain")
74re_version = re.compile(r"^(.*)\((.*)\)")
76re_newlinespace = re.compile("\n")
77re_spacestrip = re.compile(r"(\s)")
79# From new_security_install.py
80re_taint_free = re.compile(r"^['/;\-\+\.~\s\w]+$")
82# From process_unchecked.py
83re_changelog_versions = re.compile(r"^\w[-+0-9a-z.]+ \([^\(\) \t]+\)")
85# From dak/rm.py
86re_strip_source_version = re.compile(r"\s+.*$")
87re_build_dep_arch = re.compile(r"\[[^]]+\]")
89# From dak/transitions.py
90re_broken_package = re.compile(r"[a-zA-Z]\w+\s+\-.*")
92# From dak/add_user.py
93re_gpg_fingerprint_colon = re.compile(r"^fpr:+(.*):$", re.MULTILINE)
94# The next one is dirty
95re_user_address = re.compile(r"^pub:.*<(.*)@.*>.*$", re.MULTILINE)
96re_user_mails = re.compile(r"^(pub|uid):[^rdin].*<(.*@.*)>.*$", re.MULTILINE)
97re_user_name = re.compile(r"^pub:.*:(.*)<.*$", re.MULTILINE)
98re_re_mark = re.compile(r"^RE:")
100re_parse_lintian = re.compile(
101 r"^(?P<level>W|E|O): (?P<package>.*?): (?P<tag>[^ ]*) ?(?P<description>.*)$"
102)
104# in generate-releases
105re_gensubrelease = re.compile(r".*/(binary-[0-9a-z-]+|source)$")
106re_includeinrelease_byhash = re.compile(
107 r"(Translation-[a-zA-Z_]+\.(?:bz2|xz|zst)|Contents-[0-9a-z-]+.gz|Index|Packages(.gz|.bz2|.xz|.zst)?|Sources(.gz|.bz2|.xz|.zst)?|Components-[0-9a-z-]+.yml(.gz|.xz)|icons-[0-9x-]+.tar(.gz|.xz)|Release)$"
108)
109re_includeinrelease_plain = re.compile(r"(MD5SUMS|SHA256SUMS)$")
111# in generate_index_diffs
112re_includeinpdiff = re.compile(r"(Translation-[a-zA-Z_]+\.(?:bz2|xz|zst))")
115######################################################################
116# Patterns matching filenames #
117######################################################################
119# Match safe filenames
120re_file_safe = re.compile(r"^[a-zA-Z0-9][a-zA-Z0-9_.~+-]*$")
122# Match safe filenames, including slashes
123re_file_safe_slash = re.compile(r"^[a-zA-Z0-9][/a-zA-Z0-9_.~+-]*$")
125# Prefix of binary and source filenames
126_re_file_prefix = r"^(?P<package>[a-z0-9][a-z0-9.+-]+)_(?P<version>[A-Za-z0-9.~+-]+?)"
128# Match binary packages
129# Groups: package, version, architecture, type
130re_file_binary = re.compile(
131 _re_file_prefix + r"_(?P<architecture>[a-z0-9-]+)\.(?P<type>u?deb)$"
132)
134# Match changes files
135# Groups: package, version, suffix
136re_file_changes = re.compile(_re_file_prefix + r"_(?P<suffix>[a-zA-Z0-9+-]+)\.changes$")
138# Match dsc files
139# Groups: package, version
140re_file_dsc = re.compile(_re_file_prefix + r"\.dsc$")
142# Match other source files
143# Groups: package, version
144re_file_source = re.compile(_re_file_prefix + r"\." + file_source_ext_re)
146# Match upstream tarball
147# Groups: package, version
148re_file_orig = re.compile(_re_file_prefix + r"\." + orig_source_ext_re)
150# Match buildinfo file
151# Groups: package, version, suffix
152re_file_buildinfo = re.compile(
153 _re_file_prefix + r"_(?P<suffix>[a-zA-Z0-9+-]+)\.buildinfo$"
154)
156######################################################################
157# Patterns matching fields #
158######################################################################
160# Match package name
161re_field_package = re.compile(r"^[a-z0-9][a-z0-9.+-]+$")
163# Match version
164# Groups: without-epoch
165re_field_version = re.compile(r"^(?:[0-9]+:)?(?P<without_epoch>[A-Za-z0-9.:~+-]+)$")
167# Extract upstream version
168# Groups: upstream
169re_field_version_upstream = re.compile(r"^(?:[0-9]+:)?(?P<upstream>.*)-[^-]*$")
171# Match source field
172# Groups: package, version
173re_field_source = re.compile(
174 r"^(?P<package>[a-z0-9][a-z0-9.+-]+)(?:\s*\((?P<version>[A-Za-z0-9.:~+-]+)\))?$"
175)