You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2013/09/19 17:31:44 UTC
[02/23] git commit: [#6535] ticket:417 github tickets import labels
and attaches
[#6535] ticket:417 github tickets import labels and attaches
Conflicts:
ForgeImporters/forgeimporters/github/__init__.py
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/6062bc73
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/6062bc73
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/6062bc73
Branch: refs/heads/master
Commit: 6062bc73b3502f4e7ba2dbd9ebef506ec987638f
Parents: 5a82f13
Author: Anton Kasyanov <mi...@gmail.com>
Authored: Mon Aug 26 21:24:38 2013 +0300
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Thu Sep 19 14:46:49 2013 +0000
----------------------------------------------------------------------
.../forgeimporters/github/__init__.py | 3 +-
ForgeImporters/forgeimporters/github/tracker.py | 66 +++++++++++++-------
2 files changed, 47 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6062bc73/ForgeImporters/forgeimporters/github/__init__.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/github/__init__.py b/ForgeImporters/forgeimporters/github/__init__.py
index 35c5d03..8e1a802 100644
--- a/ForgeImporters/forgeimporters/github/__init__.py
+++ b/ForgeImporters/forgeimporters/github/__init__.py
@@ -17,6 +17,8 @@
import logging
import json
+import urllib
+import urllib2
from forgeimporters import base
@@ -39,7 +41,6 @@ class GitHubProjectExtractor(base.ProjectExtractor):
self.url = self.PAGE_MAP[page].format(
project=urllib.quote(gh_project_name),
)
- self.page = json.loads(urllib2.urlopen(self.url).read().decode('utf8'))
def get_summary(self):
return self.get_page('project_info').get('description')
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/6062bc73/ForgeImporters/forgeimporters/github/tracker.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/github/tracker.py b/ForgeImporters/forgeimporters/github/tracker.py
index 4aa73a4..4cd433b 100644
--- a/ForgeImporters/forgeimporters/github/tracker.py
+++ b/ForgeImporters/forgeimporters/github/tracker.py
@@ -1,5 +1,11 @@
+import re
from datetime import datetime
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+
from allura import model as M
from allura.lib import helpers as h
from ming.orm import session, ThreadLocalORMSession
@@ -43,11 +49,10 @@ class GitHubTrackerImporter(ToolImporter):
custom_fields=dict(),
ticket_num=ticket_num)
self.process_fields(ticket, issue)
- #self.process_labels(ticket, issue)
#self.process_comments(ticket, issue)
session(ticket).flush(ticket)
session(ticket).expunge(ticket)
- #app.globals.custom_fields = self.postprocess_custom_fields()
+ #app.globals.custom_fields = self.get_milestones()
app.globals.last_ticket_num = self.max_ticket_num
ThreadLocalORMSession.flush_all()
g.post_event('project_updated')
@@ -65,6 +70,9 @@ class GitHubTrackerImporter(ToolImporter):
owner_line = '*Originally owned by:* {}\n'.format(issue['assignee']['login'])
else:
owner_line = ''
+ # body processing happens here
+ body, attachments = self._get_attachments(issue['body'])
+ ticket.add_multiple_attachments(attachments)
ticket.description = (
u'*Originally created by:* {creator}\n'
u'{owner}'
@@ -72,24 +80,9 @@ class GitHubTrackerImporter(ToolImporter):
u'{body}').format(
creator=issue['user']['login'],
owner=owner_line,
- body=issue['body'],
+ body=body,
)
-
- def process_labels(self, ticket, issue):
- labels = set()
- custom_fields = defaultdict(set)
- for label in issue.get_issue_labels():
- if u'-' in label:
- name, value = label.split(u'-', 1)
- cf = self.custom_field(name)
- cf['options'].add(value)
- custom_fields[cf['name']].add(value)
- if cf['name'] == '_milestone' and ticket.status in c.app.globals.open_status_names:
- self.open_milestones.add(value)
- else:
- labels.add(label)
- ticket.labels = list(labels)
- ticket.custom_fields = {n: u', '.join(sorted(v)) for n,v in custom_fields.iteritems()}
+ ticket.labels = [label['name'] for label in issue['labels']]
def process_comments(self, ticket, issue):
for comment in issue.iter_comments():
@@ -100,8 +93,9 @@ class GitHubTrackerImporter(ToolImporter):
)
p.add_multiple_attachments(comment.attachments)
- def postprocess_custom_fields(self):
+ def get_milestones(self):
custom_fields = []
+ milestones = []
for name, field in self.custom_fields.iteritems():
if field['name'] == '_milestone':
field['milestones'] = [{
@@ -115,4 +109,34 @@ class GitHubTrackerImporter(ToolImporter):
else:
field['options'] = ''
custom_fields.append(field)
- return custom_fields
\ No newline at end of file
+ return custom_fields
+
+ def _get_attachments(self, body):
+ # at github, attachments are images only and are included into comment's body
+ # usual syntax is
+ # ![cdbpzjc5ex4](https://f.cloud.github.com/assets/979771/1027411/a393ab5e-0e70-11e3-8a38-b93a3df904cf.jpg)\r\n
+ REGEXP = r'!\[[\w0-9]+?\]\(((?:https?:\/\/)?[\da-z\.-]+\.[a-z\.]{2,6}'\
+ '(?:[\/\w\.-]+)*.(jpg|jpeg|png|gif))\)\r\n'
+ attachments = []
+ found_matches = re.finditer(REGEXP, body, re.IGNORECASE)
+ for i, match in enumerate(found_matches):
+ # removing attach text from comment
+ body = body.replace(match.group(0), '')
+ # stripping url and extension
+ attachments.append(Attachment(
+ match.group(1), # url
+ 'attach{}.{}'.format(i + 1, match.group(2)) # extension
+ ))
+ return (body, attachments)
+
+class Attachment(object):
+ def __init__(self, url, filename):
+ self.url = url
+ self.filename = filename
+ self.type = None
+
+ @property
+ def file(self):
+ fp_ish = GitHubProjectExtractor.urlopen(self.url)
+ fp = StringIO(fp_ish.read())
+ return fp