source: mergebot/trunk/mergebot/TrackerTools.py @ 16

Last change on this file since 16 was 16, checked in by retracile, 15 years ago

Mergebot: Codebase as released with permission from CommProve?, plus cleanups to remove traces of that environment.

File size: 2.4 KB
Line 
1#!/usr/bin/env python
2"""
3The purpose of this file is to provide some high-functionality to the MergeBot
4while hiding the details of the task tracking software.
5
6This implementation uses Trac as the task tracker.
7"""
8
9import os
10import time
11
12import trac.env
13import trac.ticket
14
15class 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
41def 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
55def 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
62def GetRepositoryPublicUrl(tracEnv):
63    return tracEnv.config.get("mergebot", "repository_url")
64
65def 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
Note: See TracBrowser for help on using the repository browser.