changeset 1:3e7e5534b16e

First version of the bitbucket issue importer
author Radomir Dopieralski <devel@sheep.art.pl>
date Sun, 07 Oct 2012 10:36:39 +0000
parents a6fd4f7b5b3a
children f182c35f8afb
files bbbug.py
diffstat 1 files changed, 88 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bbbug.py	Sun Oct 07 10:36:39 2012 +0000
@@ -0,0 +1,88 @@
+import csv
+import requests
+import json
+
+
+BASE_URL = 'https://api.bitbucket.org/1.0'
+AUTH = ('username', 'passowrd')
+REPO = 'username/reponame'
+TYPES = {
+    'defect': 'bug',
+    'enhancement': 'enhancement',
+    'discussion': 'proposal',
+    'note': 'proposal',
+    'task': 'task',
+}
+STATUSES = {
+    'new': 'new',
+    'accepted': 'open',
+    'reopened': 'open',
+    'closed': 'resolved',
+
+    'worksforme': 'wontfix',
+    'invalid': 'invalid',
+    'duplicate': 'duplicate',
+    'wontfix': 'wontfix',
+    'fixed': 'resolved',
+    '': None,
+    '--': None,
+}
+PRIORITIES = {
+    '--': None,
+    'High': 'major',
+    'Normal': 'minor',
+    'Low': 'trivial',
+}
+
+
+def create_issue(**kwargs):
+    url = '/'.join([BASE_URL, 'repositories', REPO, 'issues'])
+    response = requests.post(url, auth=AUTH, data=kwargs)
+
+
+def get_cmv(what):
+    url = '/'.join([BASE_URL, 'repositories', REPO, 'issues', what])
+    response = requests.get(url, auth=AUTH)
+    for info in json.loads(response.content):
+        yield info['name']
+
+
+def create_cmv(what, name):
+    url = '/'.join([BASE_URL, 'repositories', REPO, 'issues', what])
+    response = requests.post(url, auth=AUTH, data={'name': name})
+
+
+def import_issues(filename):
+    cmv = {}
+    for what in ('components', 'milestones', 'versions'):
+        cmv[what]  = set(get_cmv(what))
+    with open(filename) as f:
+        for (id_, summary, status, owner, type_, priority, milestone,
+             component, version, resolution, time, changetime, reporter,
+             keywords, cc, description) in csv.reader(f):
+            if id_ == 'id':
+                continue
+            if component not in cmv['components']:
+                create_cmv('components', component)
+                cmv['components'].add(component)
+            if milestone not in cmv['milestones']:
+                create_cmv('milestones', milestone)
+                cmv['milestones'].add(milestone)
+            if version not in cmv['versions']:
+                create_cmv('versions', version)
+                cmv['versions'].add(version)
+            issue = {
+                'status': STATUSES[resolution] or STATUSES[status],
+                'priority': PRIORITIES[priority],
+                'title': summary,
+                'content': description,
+                'kind': TYPES[type_],
+                'component': component,
+                'milestone': milestone,
+                'version': version,
+                'responsible': None,
+            }
+            create_issue(**issue)
+
+
+import_issues('issues.csv')