 Issue 29336790:
  Issue 3674 - Add a hg hook that references commits in issues  (Closed)
    
  
    Issue 29336790:
  Issue 3674 - Add a hg hook that references commits in issues  (Closed) 
  | Left: | ||
| Right: | 
| OLD | NEW | 
|---|---|
| (Empty) | |
| 1 #!/usr/bin/env python | |
| 2 | |
| 3 # This file is part of Adblock Plus <https://adblockplus.org/>, | |
| 4 # Copyright (C) 2006-2016 Eyeo GmbH | |
| 5 # | |
| 6 # Adblock Plus is free software: you can redistribute it and/or modify | |
| 7 # it under the terms of the GNU General Public License version 3 as | |
| 8 # published by the Free Software Foundation. | |
| 9 # | |
| 10 # Adblock Plus is distributed in the hope that it will be useful, | |
| 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 13 # GNU General Public License for more details. | |
| 14 # | |
| 15 # You should have received a copy of the GNU General Public License | |
| 16 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
| 17 | |
| 18 """ | |
| 19 This module implements a changegroup hook that inspects all commit messages and | |
| 20 checks if issues from the Adblock Plus issue tracker are being referenced. If | |
| 21 there are, it updates them with the respective changeset URLs. | |
| 22 """ | |
| 23 | |
| 24 import posixpath | |
| 25 import re | |
| 26 import xmlrpclib | |
| 27 | |
| 28 from sitescripts.utils import get_config | |
| 29 | |
| 30 def _generate_changeset_url(repository_name, changeset_id): | |
| 31 template = get_config().get("hg", "changeset_url_template") | |
| 32 return template.format(repo=repository_name, id=changeset_id[:12]) | |
| 33 | |
| 34 def _generate_comments(repository_name, changes_by_issue): | |
| 35 comments = {} | |
| 36 for issue_id, changes in changes_by_issue.iteritems(): | |
| 37 multiple_changes = len(changes) > 1 | |
| 38 if multiple_changes: | |
| 39 comment = "Some commits referencing this issue have landed:\n" | |
| 40 else: | |
| 41 comment = "A commit referencing this issue has landed:\n" | |
| 42 for change in changes: | |
| 43 if multiple_changes: | |
| 44 comment += "- " | |
| 45 comment += _generate_changeset_url(repository_name, change.hex()) | |
| 46 comment += "\n" | |
| 47 comments[issue_id] = comment | |
| 
Wladimir Palant
2016/02/22 11:32:33
I'd rather have this logic in a template. This sho
 
Felix Dahlke
2016/02/22 20:09:49
Done.
 | |
| 48 return comments | |
| 49 | |
| 50 def _post_comment(issue_id, comment): | |
| 51 issue_id = int(issue_id) | |
| 52 url = get_config().get("hg", "trac_xmlrpc_url") | |
| 53 server = xmlrpclib.ServerProxy(url) | |
| 54 attributes = server.ticket.get(issue_id)[3] | |
| 55 server.ticket.update(issue_id, comment, | |
| 56 {"_ts": attributes["_ts"], "action": "leave"}) | |
| 
Wladimir Palant
2016/02/22 12:02:51
The ridiculous part about this is: there is a race
 
Wladimir Palant
2016/02/22 12:06:01
Sorry about so many mails, I've only noticed some
 
Felix Dahlke
2016/02/22 20:09:49
Done.
 
Felix Dahlke
2016/02/22 20:09:50
That seems to be quite the hassle for what I think
 | |
| 57 | |
| 58 def hook(ui, repo, node, **kwargs): | |
| 59 first_change = repo[node] | |
| 60 issue_number_regex = re.compile(r"Issue (\d+) - ") | |
| 
Wladimir Palant
2016/02/22 11:32:33
This is too restrictive, see https://hg.adblockplu
 
Felix Dahlke
2016/02/22 20:09:49
Done.
 | |
| 61 changes_by_issue = {} | |
| 62 for revision in xrange(first_change.rev(), len(repo)): | |
| 63 change = repo[revision] | |
| 64 description = change.description() | |
| 65 match = issue_number_regex.search(description) | |
| 
Wladimir Palant
2016/02/22 11:32:33
What if there multiple issues referenced in the co
 
Felix Dahlke
2016/02/22 20:09:49
Never seen that before, but since you've shown a r
 | |
| 66 if match: | |
| 67 issue_number = match.group(1) | |
| 68 changes_by_issue.setdefault(issue_number, []).append(change) | |
| 69 | |
| 70 repository_name = posixpath.split(repo.url())[1] | |
| 71 comments = _generate_comments(repository_name, changes_by_issue) | |
| 72 | |
| 73 issue_url_template = get_config().get("hg", "issue_url_template") | |
| 74 for issue_id, comment in comments.iteritems(): | |
| 75 try: | |
| 76 _post_comment(issue_id, comment) | |
| 77 ui.status("updating %s\n" % issue_url_template.format(id=issue_id)) | |
| 78 except: | |
| 79 ui.warn("failed to update %s - does it exist?\n" % \ | |
| 
Wladimir Palant
2016/02/22 11:32:33
This backslash is unnecessary.
 
Felix Dahlke
2016/02/22 20:09:49
Done, also changed the message a bit.
 | |
| 80 issue_url_template.format(id=issue_id)) | |
| OLD | NEW |