30 from datetime import datetime |
30 from datetime import datetime |
31 import hgpoll |
31 import hgpoll |
32 import re |
32 import re |
33 import subprocess |
33 import subprocess |
34 from configfile import Config |
34 from configfile import Config |
35 from modulecore import command_error |
35 import modulecore |
36 from hgdb import HgCommitsDatabase |
36 from hgdb import HgCommitsDatabase |
37 |
|
38 ModuleData = { |
|
39 'commands': |
|
40 [ |
|
41 { |
|
42 'name': 'checkhg', |
|
43 'description': 'Polls the zandronum repositories for updates', |
|
44 'args': None, |
|
45 'level': 'admin', |
|
46 }, |
|
47 |
|
48 { |
|
49 'name': 'cset', |
|
50 'description': 'Yields changeset information (use a hash or date as key)', |
|
51 'args': '<key>', |
|
52 'level': 'normal', |
|
53 }, |
|
54 |
|
55 { |
|
56 'name': 'resolves', |
|
57 'description': '''Manually cause a ticket to be resolved by a changeset''', |
|
58 'args': '<ticket> <changeset>', |
|
59 'level': 'admin', # TODO |
|
60 }, |
|
61 ] |
|
62 } |
|
63 |
37 |
64 def plural (a): |
38 def plural (a): |
65 return '' if a == 1 else 's' |
39 return '' if a == 1 else 's' |
66 |
|
67 def cmd_checkhg (bot, **rest): |
|
68 hgpoll.force_poll() |
|
69 |
40 |
70 def is_dateversion (key): |
41 def is_dateversion (key): |
71 try: |
42 try: |
72 datetime.strptime (key, '%y%m%d-%H%M') |
43 datetime.strptime (key, '%y%m%d-%H%M') |
73 return True |
44 return True |
82 reponame, node = node.split ('/')[:2] |
53 reponame, node = node.split ('/')[:2] |
83 |
54 |
84 try: |
55 try: |
85 repo = hgpoll.RepositoriesByName[reponame] |
56 repo = hgpoll.RepositoriesByName[reponame] |
86 except KeyError: |
57 except KeyError: |
87 command_error ('''unknown repository %s''' % reponame) |
58 modulecore.command_error ('''unknown repository %s''' % reponame) |
88 |
59 |
89 # Possibly we're passed a date version instead. Try find the node for this. |
60 # Possibly we're passed a date version instead. Try find the node for this. |
90 if is_dateversion (node): |
61 if is_dateversion (node): |
91 node = db.find_commit_by_dateversion (node) |
62 node = db.find_commit_by_dateversion (node) |
92 |
63 |
93 if node == None: |
64 if node == None: |
94 command_error ('''couldn't find changeset for date %s''' % node) |
65 modulecore.command_error ('''couldn't find changeset for date %s''' % node) |
95 return |
66 return |
96 |
67 |
97 node = node[0:7] |
68 node = node[0:7] |
98 |
69 |
99 noderepos = db.get_commit_repos (node) |
70 noderepos = db.get_commit_repos (node) |
100 |
71 |
101 if repo == None: |
72 if repo == None: |
102 if not noderepos: |
73 if not noderepos: |
103 command_error ('''couldn't find changeset %s''' % node) |
74 modulecore.command_error ('''couldn't find changeset %s''' % node) |
104 |
75 |
105 repo = noderepos[0] |
76 repo = noderepos[0] |
106 |
77 |
107 return (node, repo) |
78 return (node, repo) |
108 |
79 |
126 match = rex.match (line) |
97 match = rex.match (line) |
127 |
98 |
128 if match: |
99 if match: |
129 return match.group (1) |
100 return match.group (1) |
130 |
101 |
131 def cmd_cset (bot, args, reply, **rest): |
102 @modulecore.irc_command (level='admin') |
|
103 def checkhg (bot, **rest): |
|
104 '''Polls the zandronum repositories for updates''' |
|
105 hgpoll.force_poll() |
|
106 |
|
107 @modulecore.irc_command (args='<key>') |
|
108 def cset (bot, args, reply, **rest): |
132 node, repo = resolve_node (args['key']) |
109 node, repo = resolve_node (args['key']) |
133 commit = repo.get_commit_data (rev=node, |
110 commit = repo.get_commit_data (rev=node, |
134 node='node|short', |
111 node='node|short', |
135 message='desc', |
112 message='desc', |
136 author='author', |
113 author='author', |
194 for line in commit['message'].split ('\n'): |
171 for line in commit['message'].split ('\n'): |
195 reply (' ' + line) |
172 reply (' ' + line) |
196 |
173 |
197 reply ('url: %s/commits/%s' % (repo.url, commit['node'])) |
174 reply ('url: %s/commits/%s' % (repo.url, commit['node'])) |
198 |
175 |
199 def cmd_resolves (bot, args, **rest): |
176 @modulecore.irc_command (args='<ticket> <changeset>', level='admin') |
200 hgpoll.announce_ticket_resolved (args['ticket'], args['changeset']) |
177 def resolves (bot, args, **rest): |
|
178 hgpoll.announce_ticket_resolved (args['ticket'], args['changeset'], HgCommitsDatabase()) |