diff options
author | Andy Doan <andy.doan@linaro.org> | 2017-01-25 13:32:43 -0600 |
---|---|---|
committer | Andy Doan <andy.doan@linaro.org> | 2017-01-26 23:00:26 -0600 |
commit | bff1ff5fd16210a072d4842be93bd3de17a93da2 (patch) | |
tree | 1b46285967341f1f1b4437a546d670efd3a9232c | |
parent | 3e34a14e8d38fdec7fdc96a61c5aa9d5874a40ed (diff) |
linaro-metrics: create a Patch entry for a pull-request
Change-Id: I4eeb810c942c9860e0c9d042a035d0fd49c6d12f
-rwxr-xr-x | linaro_metrics/sync_github_changes.py | 48 |
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) |