1# vim:set et sw=4: 

2 

3""" 

4Central repository of regexes for dak 

5 

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""" 

12 

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. 

17 

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. 

22 

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 

26 

27############################################################################### 

28 

29import re 

30 

31#: Is it a number? 

32re_isanum = re.compile(r"^\d+$") 

33 

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+$") 

38 

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$") 

46 

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) 

53 

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]+$") 

57 

58re_parse_maintainer = re.compile(r"^\s*(\S.*\S)\s*\<([^\>]+)\>") 

59 

60re_srchasver = re.compile(r"^(\S+)\s+\((\S+)\)$") 

61re_verwithext = re.compile(r"^(\d+)(?:\.(\d+))(?:\s+\((\S+)\))?$") 

62 

63# From clean_proposed_updates.py 

64re_isdeb = re.compile(r"^(.+)_(.+?)_(.+?).u?deb$") 

65 

66# From examine_package.py 

67re_package = re.compile(r"^(.+?)_.*") 

68re_doc_directory = re.compile(r".*/doc/([^/]*).*") 

69 

70re_contrib = re.compile("^contrib/") 

71re_nonfree = re.compile("^(?:non-free-firmware|non-free)/") 

72 

73re_localhost = re.compile(r"localhost\.localdomain") 

74re_version = re.compile(r"^(.*)\((.*)\)") 

75 

76re_newlinespace = re.compile("\n") 

77re_spacestrip = re.compile(r"(\s)") 

78 

79# From new_security_install.py 

80re_taint_free = re.compile(r"^['/;\-\+\.~\s\w]+$") 

81 

82# From process_unchecked.py 

83re_changelog_versions = re.compile(r"^\w[-+0-9a-z.]+ \([^\(\) \t]+\)") 

84 

85# From dak/rm.py 

86re_strip_source_version = re.compile(r"\s+.*$") 

87re_build_dep_arch = re.compile(r"\[[^]]+\]") 

88 

89# From dak/transitions.py 

90re_broken_package = re.compile(r"[a-zA-Z]\w+\s+\-.*") 

91 

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:") 

99 

100re_parse_lintian = re.compile( 

101 r"^(?P<level>W|E|O): (?P<package>.*?): (?P<tag>[^ ]*) ?(?P<description>.*)$" 

102) 

103 

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)$") 

110 

111# in generate_index_diffs 

112re_includeinpdiff = re.compile(r"(Translation-[a-zA-Z_]+\.(?:bz2|xz|zst))") 

113 

114 

115###################################################################### 

116# Patterns matching filenames # 

117###################################################################### 

118 

119# Match safe filenames 

120re_file_safe = re.compile(r"^[a-zA-Z0-9][a-zA-Z0-9_.~+-]*$") 

121 

122# Match safe filenames, including slashes 

123re_file_safe_slash = re.compile(r"^[a-zA-Z0-9][/a-zA-Z0-9_.~+-]*$") 

124 

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.~+-]+?)" 

127 

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) 

133 

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$") 

137 

138# Match dsc files 

139# Groups: package, version 

140re_file_dsc = re.compile(_re_file_prefix + r"\.dsc$") 

141 

142# Match other source files 

143# Groups: package, version 

144re_file_source = re.compile(_re_file_prefix + r"\." + file_source_ext_re) 

145 

146# Match upstream tarball 

147# Groups: package, version 

148re_file_orig = re.compile(_re_file_prefix + r"\." + orig_source_ext_re) 

149 

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) 

155 

156###################################################################### 

157# Patterns matching fields # 

158###################################################################### 

159 

160# Match package name 

161re_field_package = re.compile(r"^[a-z0-9][a-z0-9.+-]+$") 

162 

163# Match version 

164# Groups: without-epoch 

165re_field_version = re.compile(r"^(?:[0-9]+:)?(?P<without_epoch>[A-Za-z0-9.:~+-]+)$") 

166 

167# Extract upstream version 

168# Groups: upstream 

169re_field_version_upstream = re.compile(r"^(?:[0-9]+:)?(?P<upstream>.*)-[^-]*$") 

170 

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)