def get(self, author_id): authors = Author.find(author_id, get_current_user()) if not authors and author_id == 'me': return '''Either there is no current user or you are not in the author table''', 401 elif not authors: return 'author not found', 404 try: author_email = authors[0].email request = PhabricatorRequest() request.connect() user_info = request.call('user.query', {'emails': [author_email]}) if not user_info: return 'phabricator: %s not found' % author_email, 404 author_phid = user_info[0]["phid"] diff_info = request.call('differential.query', { 'authors': [author_phid], 'status': "status-open" }) diff_info.sort(key=lambda k: -1 * int(k['dateModified'])) except requests.exceptions.ConnectionError: return 'Unable to connect to Phabricator', 503 if not diff_info: # No diffs, no point in trying to find builds. return self.respond([]) rows = list( db.session.query(PhabricatorDiff, Build).join( Build, Build.source_id == PhabricatorDiff.source_id).filter( PhabricatorDiff.revision_id.in_( [d['id'] for d in diff_info]))) serialized_builds = zip(self.serialize([row.Build for row in rows]), [row.PhabricatorDiff for row in rows]) builds_map = defaultdict(list) for build, phabricator_diff in serialized_builds: builds_map[str(phabricator_diff.revision_id)].append(build) for d in diff_info: d['builds'] = builds_map[str(d['id'])] return self.respond(diff_info)
def get(self, diff_ident): if not diff_ident.startswith('D') or not diff_ident[1:].isdigit(): return 400, 'diff id not valid' # grab diff info from phabricator. phabricator_info = {} try: request = PhabricatorRequest() request.connect() phabricator_info = request.call('differential.query', {'ids': [int(diff_ident[1:])]}) if len(phabricator_info) == 0: return 404, '%s not found in phabricator' % diff_ident assert len(phabricator_info) == 1 phabricator_info = phabricator_info[0] except Exception as e: # If the phabricator call fails # for whatever reason, we'll still return the builds info from # changes print e phabricator_info = {} pass # grab builds rows = list( db.session.query(Build, PhabricatorDiff).join( PhabricatorDiff, Build.source_id == PhabricatorDiff.source_id, ).filter(PhabricatorDiff.revision_id == diff_ident[1:])) build_ids = set([row.Build.id for row in rows]) jobs = self.serialize( list(Job.query.filter(Job.build_id.in_(build_ids)))) serialized_builds = zip(self.serialize([row.Build for row in rows]), [row.PhabricatorDiff for row in rows]) build_info = {} for build, phabricator_diff in serialized_builds: # we may have multiple diffs within a single differential revision single_diff_id = phabricator_diff.diff_id if single_diff_id not in build_info: build_info[single_diff_id] = { 'id': phabricator_diff.id, 'builds': [], 'diff_id': phabricator_diff.diff_id, 'revision_id': phabricator_diff.revision_id, 'url': phabricator_diff.url, 'source_id': phabricator_diff.source_id, 'dateCreated': phabricator_diff.date_created } build['jobs'] = [ j for j in jobs if j['build']['id'] == build['id'] ] build_info[single_diff_id]['builds'].append(build) phabricator_info['changes'] = build_info return self.respond(phabricator_info, serialize=False)