Botan  1.10.9
Functions
dist Namespace Reference

Functions

def check_subprocess_results
 
def datestamp
 
def get_certs
 
def gpg_sign
 
def main
 
def parse_args
 
def remove_file_if_exists
 
def run_monotone
 

Function Documentation

def dist.check_subprocess_results (   subproc,
  name 
)

Definition at line 22 of file dist.py.

Referenced by gpg_sign(), and run_monotone().

22 
23 def check_subprocess_results(subproc, name):
24  (stdout, stderr) = subproc.communicate()
25 
26  stdout = stdout.strip()
27  stderr = stderr.strip()
28 
29  if subproc.returncode != 0:
30  if stdout != '':
31  logging.error(stdout)
32  if stderr != '':
33  logging.error(stderr)
34  raise Exception('Running %s failed' % (name))
35  else:
36  if stderr != '':
37  logging.debug(stderr)
38 
39  return stdout
def check_subprocess_results
Definition: dist.py:22
std::runtime_error Exception
Definition: exceptn.h:19
def dist.datestamp (   db,
  rev_id 
)

Definition at line 77 of file dist.py.

References get_certs().

Referenced by main().

77 
78 def datestamp(db, rev_id):
79  certs = get_certs(db, rev_id)
80 
81  if 'date' in certs:
82  return int(certs['date'].replace('-','')[0:8])
83 
84  logging.info('Could not retreive date for %s' % (rev_id))
85  return 0
def datestamp
Definition: dist.py:77
def get_certs
Definition: dist.py:47
def dist.get_certs (   db,
  rev_id 
)

Definition at line 47 of file dist.py.

References run_monotone().

Referenced by datestamp().

47 
48 def get_certs(db, rev_id):
49  tokens = shlex.split(run_monotone(db, ['automate', 'certs', rev_id]))
50 
51  def usable_cert(cert):
52  if 'signature' not in cert or cert['signature'] != 'ok':
53  return False
54  if 'trust' not in cert or cert['trust'] != 'trusted':
55  return False
56  if 'name' not in cert or 'value' not in cert:
57  return False
58  return True
59 
60  def cert_builder(tokens):
61  pairs = zip(tokens[::2], tokens[1::2])
62  current_cert = {}
63  for pair in pairs:
64  if pair[0] == 'key':
65  if usable_cert(current_cert):
66  name = current_cert['name']
67  value = current_cert['value']
68  current_cert = {}
69 
70  logging.debug('Cert %s "%s" for rev %s' % (name, value, rev_id))
71  yield (name, value)
72 
73  current_cert[pair[0]] = pair[1]
74 
75  certs = dict(cert_builder(tokens))
76  return certs
def get_certs
Definition: dist.py:47
def run_monotone
Definition: dist.py:40
def dist.gpg_sign (   keyid,
  files 
)

Definition at line 86 of file dist.py.

References check_subprocess_results().

Referenced by main().

86 
87 def gpg_sign(keyid, files):
88  for filename in files:
89  logging.info('Signing %s using PGP id %s' % (filename, keyid))
90 
91  gpg = subprocess.Popen(['gpg', '--armor', '--detach-sign',
92  '--local-user', keyid, filename],
93  stdout=subprocess.PIPE,
94  stderr=subprocess.PIPE)
95 
96  check_subprocess_results(gpg, 'gpg')
def check_subprocess_results
Definition: dist.py:22
def gpg_sign
Definition: dist.py:86
def dist.main (   args = None)

Definition at line 123 of file dist.py.

References datestamp(), gpg_sign(), parse_args(), remove_file_if_exists(), and run_monotone().

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

Definition at line 97 of file dist.py.

Referenced by main().

97 
98 def parse_args(args):
99  parser = optparse.OptionParser()
100  parser.add_option('--verbose', action='store_true',
101  default=False, help='Extra debug output')
102 
103  parser.add_option('--output-dir', metavar='DIR',
104  default='.',
105  help='Where to place output (default %default)')
106 
107  parser.add_option('--mtn-db', metavar='DB',
108  default=os.getenv('BOTAN_MTN_DB', ''),
109  help='Set monotone db (default \'%default\')')
110 
111  parser.add_option('--pgp-key-id', metavar='KEYID',
112  default='EFBADFBC',
113  help='PGP signing key (default %default)')
114 
115  return parser.parse_args(args)
def parse_args
Definition: dist.py:97
def dist.remove_file_if_exists (   fspath)

Definition at line 116 of file dist.py.

Referenced by main().

117 def remove_file_if_exists(fspath):
118  try:
119  os.unlink(fspath)
120  except OSError as e:
121  if e.errno != errno.ENOENT:
122  raise
def remove_file_if_exists
Definition: dist.py:116
def dist.run_monotone (   db,
  args 
)

Definition at line 40 of file dist.py.

References check_subprocess_results().

Referenced by get_certs(), and main().

40 
41 def run_monotone(db, args):
42  mtn = subprocess.Popen(['mtn', '--db', db] + args,
43  stdout=subprocess.PIPE,
44  stderr=subprocess.PIPE)
45 
46  return check_subprocess_results(mtn, 'mtn')
def check_subprocess_results
Definition: dist.py:22
def run_monotone
Definition: dist.py:40