| 89 | | class tracinfo(cmd.Cmd): |
| 90 | | __env = None |
| 91 | | def __init__(self, envdir=None): |
| 92 | | if envdir: |
| 93 | | self.env_set(os.path.abspath(envdir)) |
| 94 | | |
| 95 | | def env_set(self, envname, env=None): |
| 96 | | self.envname = envname |
| 97 | | if env is not None: |
| 98 | | self.__env = env |
| 99 | | |
| 100 | | def env_check(self): |
| 101 | | try: |
| 102 | | self.__env = Environment(self.envname) |
| 103 | | except: |
| 104 | | return 0 |
| 105 | | return 1 |
| 106 | | |
| 107 | | def env_open(self): |
| 108 | | try: |
| 109 | | if not self.__env: |
| 110 | | self.__env = Environment(self.envname) |
| 111 | | return self.__env |
| 112 | | except Exception, e: |
| 113 | | print 'Failed to open environment.', e |
| 114 | | traceback.print_exc() |
| 115 | | sys.exit(1) |
| 116 | | |
| 117 | | def db_open(self): |
| 118 | | return self.env_open().get_db_cnx() |
| 119 | | |
| 120 | | def db_query(self, sql, cursor=None, params=None): |
| 121 | | if not cursor: |
| 122 | | cnx = self.db_open() |
| 123 | | cursor = cnx.cursor() |
| 124 | | if params: |
| 125 | | cursor.execute(sql, params) |
| 126 | | else: |
| 127 | | cursor.execute(sql) |
| 128 | | for row in cursor: |
| 129 | | yield row |
| 130 | | |
| 131 | | def do_version(self): |
| 132 | | return trac.__version__ |
| 133 | | |
| 134 | | def do_ticket(self, ticketnum): |
| 135 | | tickets = self.db_query("SELECT status, type, resolution, id, priority, summary, reporter FROM ticket WHERE id = %s", params=(ticketnum,)) |
| 136 | | if tickets: |
| 137 | | return [(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[3]) for row in tickets] |
| 138 | | |
| 139 | | def do_revision(self, revision): |
| 140 | | revisions = self.db_query("SELECT rev, author, time, message FROM revision WHERE rev = %s", params=(revision,)) |
| 141 | | if revisions: |
| 142 | | return [(row[0], row[1], row[2], row[3]) for row in revisions] |
| 143 | | |
| 181 | | def on_pubmsg(self, c, e): |
| 182 | | msg = e.arguments()[0] |
| 183 | | |
| 184 | | parts = msg.split(":", 1) |
| 185 | | if len(parts) > 1 and irc_lower(parts[0]) == irc_lower(self.connection.get_nickname()): |
| 186 | | subparts = parts[1].strip().split(" ", 1) |
| 187 | | if len(subparts) == 2: |
| 188 | | cmd, params = subparts |
| 189 | | else: |
| 190 | | cmd = subparts |
| 191 | | params = " " |
| 192 | | self.do_command(c, e, cmd, params) |
| 193 | | return |
| 194 | | |
| 195 | | def do_command(self, c, e, cmd, params): |
| 196 | | if cmd == "ticket": |
| 197 | | ticket = self.trac.do_ticket(params) |
| 198 | | if ticket: |
| 199 | | output = "[%s %s: %s] #%s [%s] %s reported by %s http://dev.mvblog.org/trac/ticket/%s" % (ticket[0]) |
| 200 | | else: |
| 201 | | output = "No such ticket" |
| 202 | | c.privmsg(e.target(), output) |
| 203 | | elif cmd == "commit" : |
| 204 | | revision = self.trac.do_revision(params) |
| 205 | | if revision: |
| 206 | | lines = revision[0][3].split("\n") |
| 207 | | if len(lines) < 2: |
| 208 | | c.privmsg(e.target(), "[%s] Committed by %s on %s: %s" % (revision[0][0], revision[0][1], datetime.datetime.fromtimestamp(revision[0][2]), lines[0])) |
| 209 | | else: |
| 210 | | c.privmsg(e.target(), "[%s] Committed by %s on %s:" % (revision[0][0], revision[0][1], datetime.datetime.fromtimestamp(revision[0][2]))) |
| 211 | | for line in lines: |
| 212 | | c.privmsg(e.target(), "%s" % (line)) |
| 213 | | else: |
| 214 | | c.privmsg(e.target(), "No such commit") |
| 215 | | elif cmd == "tracversion": |
| 216 | | tracversion = self.trac.do_version() |
| 217 | | c.privmsg(e.target(), "trac version: "+tracversion) |
| 218 | | |