284
287
Option("review-list", short_name='l', type=unicode,
285
288
help=("The email address of the review list the review "
286
289
"request should be Cc:ed to.")),
289
293
def run(self, target=None, diff=None, cover=None, reviewer='',
290
294
remember=False, dry_run=False, review_tool_url=None,
295
review_list=None, pr=False):
292
296
merge_source_branch = Branch.open('.')
294
298
branch_url = merge_source_branch.get_public_branch()
347
351
note("Sending to %s and %s from %s.", email, review_list, from_)
348
352
mail(merge_source_branch, from_,
349
353
email, review_list, diff, cover, short_branch_url, dry_run)
355
print make_pending_reviews_template(merge_source_branch, cover)
352
358
class cmd_write_cover_letter(Command):
360
366
Option("output", short_name='o', type=unicode,
361
367
help=("Where to save the cover letter, './cover.txt' by "
365
def run(self, output='cover.txt'):
372
def run(self, output='cover.txt', pr=None):
366
373
merge_source_branch = Branch.open('.')
367
374
cover = make_cover_letter_template(merge_source_branch, check=False)
368
375
open(output, 'w').write(cover)
377
print make_pending_reviews_template(merge_source_branch, cover)
380
pending_reviews_template = '''
382
%(summary)s%(lines)s [[BR]]
383
Target release: ''%(milestone)s'' [[BR]]
384
needs-review [@DATE@]
387
def active_lp_milestone():
389
for line in urllib.urlopen('https://edge.launchpad.net/launchpad/+portlet-milestones'):
391
return line.split('>')[1].split('<')[0]
393
def make_pending_reviews_template(source_branch, cover_letter):
395
coverlines = cover_letter.splitlines()
397
for i, line in enumerate(coverlines):
399
key, value = line.split(':', 1)
400
chop[key.strip()] = value.strip()
403
for line in coverlines[i+1:]:
405
summary.append(line.strip())
406
if len(summary) >= 3:
408
summary = ' '.join(summary)
410
summary += ' [[BR]]\n '
411
keys = [('Demo URL', '%s'),
412
('Test command', '`%s`'),
413
('Pre-implementation call with', "''%s''")
415
input, output = os.popen2(
416
os.path.expanduser('~/canonical/lp-branches/trunk/utilities/paste'))
417
input.write(cover_letter)
419
cover_url = output.read().strip()
421
lines = ['Cover letter: %s' % cover_url]
422
for (k, fmt) in keys:
424
lines.append('%s: %s'%(k, fmt%chop[k]))
426
'lines': ' [[BR]]\n '.join(lines),
427
'milestone': active_lp_milestone(),
428
'url': source_branch.get_public_branch(),
431
return pending_reviews_template%vals
433
class cmd_pr_block(Command):
434
"""Create a cover letter template and prompt to fill it out.
436
The file will be saved as 'cover.txt' in the current directory by
441
Option("cover", short_name='c', type=open,
445
def run(self, cover=None):
446
merge_source_branch = Branch.open('.')
448
cover = make_cover_letter_template(merge_source_branch)
451
print make_pending_reviews_template(merge_source_branch, cover)
371
453
register_command(cmd_review_submit)
372
454
register_command(cmd_diff_for_review)
373
455
register_command(cmd_write_cover_letter)
456
register_command(cmd_pr_block)