summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Doan <andy.doan@linaro.org>2017-01-25 13:32:43 -0600
committerAndy Doan <andy.doan@linaro.org>2017-01-26 23:00:26 -0600
commitbff1ff5fd16210a072d4842be93bd3de17a93da2 (patch)
tree1b46285967341f1f1b4437a546d670efd3a9232c
parent3e34a14e8d38fdec7fdc96a61c5aa9d5874a40ed (diff)
linaro-metrics: create a Patch entry for a pull-request
Change-Id: I4eeb810c942c9860e0c9d042a035d0fd49c6d12f
-rwxr-xr-xlinaro_metrics/sync_github_changes.py48
1 files changed, 47 insertions, 1 deletions
diff --git a/linaro_metrics/sync_github_changes.py b/linaro_metrics/sync_github_changes.py
index 54661ef..b12aef5 100755
--- a/linaro_metrics/sync_github_changes.py
+++ b/linaro_metrics/sync_github_changes.py
@@ -6,6 +6,7 @@ import logging
import os
import re
import sys
+import textwrap
import urllib2
from datetime import datetime
@@ -17,11 +18,15 @@ django_setup() # must be called to get sys.path and django settings in place
from django.conf import settings
+from patchwork.models import Patch, Project, State
+
from linaro_metrics.crowd import Crowd
+from linaro_metrics.models import TeamCredit
from linaro_metrics.parsemail import get_linaro_person
log = logging.getLogger('sync_github_changes')
+STATE_MAP = {'closed': 'Accepted', 'open': 'New'}
GITHUB_REPOS = [
# tuple of: owner, repo, patchwork-project
('jackmitch', 'libsoc', 'libsoc'),
@@ -74,6 +79,47 @@ def get_author(crowd, pr):
return get_linaro_person(crowd, email)
+def patchwork_state(github_status):
+ return State.objects.get(name=STATE_MAP[github_status])
+
+
+def get_patch_content(owner, repo, pr):
+ fmt = textwrap.dedent('''\
+ # %s
+ This represents a change submitted via Github. It is mirrored
+ here so that it is included in our statistics.''')
+ return fmt % pr['html_url']
+
+
+def create_or_update(proj, owner, repo, author, pr):
+ msgid = '%s/%s@%d' % (owner, repo, pr['number'])
+ created = datetime.strptime(pr['created_at'], '%Y-%m-%dT%H:%M:%SZ')
+ updated = datetime.strptime(pr['updated_at'], '%Y-%m-%dT%H:%M:%SZ')
+ fields = {
+ 'name': pr['title'],
+ 'project': Project.objects.get(name=proj),
+ 'state': patchwork_state(pr['state']),
+ }
+ try:
+ p = Patch.objects.get(msgid=msgid)
+ tcs = TeamCredit.objects.filter(patch=p)
+ if updated > tcs[0].last_state_change:
+ for k, v in fields.iteritems():
+ setattr(p, k, v)
+ p.save()
+ TeamCredit.objects.filter(patch=p).update(
+ last_state_change=updated)
+ except Patch.DoesNotExist:
+ fields['msgid'] = msgid
+ fields['date'] = created
+ fields['submitter'] = author
+ fields['content'] = get_patch_content(owner, repo, pr)
+ Patch.objects.create(**fields)
+ # teamcredits are auto-set to "now", so we need to update it to what
+ # came from gerrit
+ TeamCredit.objects.filter(patch=p).update(last_state_change=updated)
+
+
@contextlib.contextmanager
def repo_cache():
def dt_serialize(obj):
@@ -111,7 +157,7 @@ def main(args):
auth = get_author(crwd, pr)
if auth:
log.debug('checking change: %d', pr['number'])
- # TODO check the PR
+ create_or_update(proj, owner, repo, auth, pr)
repos[repo_path] = now
finally:
log.info('analayzed %d pull-requests', x)