123def main(args = None):
124 if args is None:
125 args = sys.argv[1:]
126
127 (options, args) = parse_args(args)
128
129 def log_level():
130 if options.verbose:
131 return logging.DEBUG
132 return logging.INFO
133
134 logging.basicConfig(stream = sys.stdout,
135 format = '%(levelname) 7s: %(message)s',
136 level = log_level())
137
138 if options.mtn_db == '':
139 logging.error('No monotone db set (use --mtn-db)')
140 return 1
141
142 if not os.access(options.mtn_db, os.R_OK):
143 logging.error('Monotone db %s not found' % (options.mtn_db))
144 return 1
145
146 if len(args) != 1:
147 logging.error('Usage: %s version' % (sys.argv[0]))
148 return 1
149
150 version = args[0]
151
152 rev_id = run_monotone(options.mtn_db,
153 ['automate', 'select', 't:' + version])
154
155 if rev_id == '':
156 logging.error('No revision for %s found' % (version))
157 return 2
158
159 output_basename = os.path.join(options.output_dir, 'Botan-' + version)
160
161 output_tgz = output_basename + '.tgz'
162 output_tbz = output_basename + '.tbz'
163
164 logging.info('Found revision id %s' % (rev_id))
165
166 if os.access(output_basename, os.X_OK):
167 shutil.rmtree(output_basename)
168
169 run_monotone(options.mtn_db,
170 ['checkout', '-r', rev_id, output_basename])
171
172 shutil.rmtree(os.path.join(output_basename, '_MTN'))
173 remove_file_if_exists(os.path.join(output_basename, '.mtn-ignore'))
174
175 version_file = os.path.join(output_basename, 'botan_version.py')
176
177 if os.access(version_file, os.R_OK):
178
179
180 contents = open(version_file).readlines()
181
182 def content_rewriter():
183 for line in contents:
184 if line == 'release_vc_rev = None\n':
185 yield 'release_vc_rev = \'mtn:%s\'\n' % (rev_id)
186 elif line == 'release_datestamp = 0\n':
187 yield 'release_datestamp = %d\n' % (datestamp(options.mtn_db, rev_id))
188 else:
189 yield line
190
191 open(version_file, 'w').write(''.join(list(content_rewriter())))
192 else:
193 logging.error('Cannot find %s' % (version_file))
194 return 2
195
196 try:
197 os.makedirs(options.output_dir)
198 except OSError as e:
199 if e.errno != errno.EEXIST:
200 logging.error('Creating dir %s failed %s' % (options.output_dir, e))
201 return 2
202
203 remove_file_if_exists(output_tgz)
204 remove_file_if_exists(output_tgz + '.asc')
205 archive = tarfile.open(output_tgz, 'w:gz')
206 archive.add(output_basename)
207 archive.close()
208
209 remove_file_if_exists(output_tbz)
210 remove_file_if_exists(output_tbz + '.asc')
211 archive = tarfile.open(output_tbz, 'w:bz2')
212 archive.add(output_basename)
213 archive.close()
214
215 if options.pgp_key_id != '':
216 gpg_sign(options.pgp_key_id, [output_tbz, output_tgz])
217
218 shutil.rmtree(output_basename)
219
220 return 0
221