1 | #!/usr/bin/env python |
---|
2 | """ |
---|
3 | The purpose of this file is to provide some high-functionality to the MergeBot |
---|
4 | while hiding the details of the task tracking software. |
---|
5 | |
---|
6 | This implementation uses Trac as the task tracker. |
---|
7 | """ |
---|
8 | |
---|
9 | import os |
---|
10 | import time |
---|
11 | |
---|
12 | import trac.env |
---|
13 | import trac.ticket |
---|
14 | |
---|
15 | class Task(object): |
---|
16 | "A convenience wrapper for Trac's ticket objects." |
---|
17 | def __init__(self, tracEnv, ticketnum): |
---|
18 | self.tracEnv = tracEnv |
---|
19 | self.tracTicket = trac.ticket.Ticket(self.tracEnv, ticketnum) |
---|
20 | self.comments = [] |
---|
21 | def AddComment(self, comment): |
---|
22 | "Add a comment to the list of comments to add to the ticket." |
---|
23 | self.comments.append(comment) |
---|
24 | def SetMergeBotStatus(self, state): |
---|
25 | self.tracTicket['mergebotstate'] = state |
---|
26 | def CloseAsFixed(self): |
---|
27 | self.tracTicket['status'] = 'closed' |
---|
28 | self.tracTicket['resolution'] = 'fixed' |
---|
29 | def Save(self): |
---|
30 | comment = "\n\n".join(self.comments) |
---|
31 | try: |
---|
32 | self.tracTicket.save_changes("mergebot", comment) |
---|
33 | except: #IntegrityError: |
---|
34 | # Two changes too close together? Try again, but just once, so we |
---|
35 | # don't get an infinite loop. |
---|
36 | time.sleep(1) |
---|
37 | self.tracTicket.save_changes("mergebot", comment) |
---|
38 | def GetSummary(self): |
---|
39 | return self.tracTicket['summary'] |
---|
40 | |
---|
41 | def GetWorkDir(tracEnv, ticket=None, module=None): |
---|
42 | """Generate a work directory name based on the ticket and/or module""" |
---|
43 | workdir = tracEnv.config.get("mergebot", "work_dir") |
---|
44 | if not os.path.isabs(workdir): |
---|
45 | workdir = os.path.join(os.path.abspath(tracEnv.path), workdir) |
---|
46 | nameparts = [] |
---|
47 | if module: |
---|
48 | nameparts.append(module) |
---|
49 | if ticket: |
---|
50 | nameparts.append("ticket-%s" % (ticket, )) |
---|
51 | if nameparts: |
---|
52 | workdir = os.path.join(workdir, ".".join(nameparts)) |
---|
53 | return workdir |
---|
54 | |
---|
55 | def GetLogFile(tracEnv, ticket=None): |
---|
56 | if ticket: |
---|
57 | filename = "ticket-%s.log" % (ticket, ) |
---|
58 | else: |
---|
59 | filename = "mergebot.log" |
---|
60 | return os.path.join(GetWorkDir(tracEnv), filename) |
---|
61 | |
---|
62 | def GetRepositoryPublicUrl(tracEnv): |
---|
63 | return tracEnv.config.get("mergebot", "repository_url") |
---|
64 | |
---|
65 | def GetRepositoryLocalUrl(tracEnv): |
---|
66 | dirname = tracEnv.config.get("trac", "repository_dir") |
---|
67 | if not os.path.isabs(dirname): |
---|
68 | dirname = os.path.join(os.path.abspath(tracEnv.path), dirname) |
---|
69 | return "file://%s" % (dirname, ) |
---|
70 | |
---|
71 | # vim:foldmethod=indent foldcolumn=8 |
---|
72 | # vim:softtabstop=4 shiftwidth=4 tabstop=4 expandtab |
---|