def pullreviews(repo, proto, args=None):
    proto.redirect()
    req = parsejsonpayload(proto, args)

    # Workaround an issue with "import _imp" in pkg_resources.
    with demandimport.deactivated():
        from reviewboardmods.pushhooks import ReviewBoardClient
    client = ReviewBoardClient(repo.ui.config('reviewboard', 'url').rstrip('/'),
                               username=req.get('bzusername'),
                               apikey=req.get('bzapikey'))
    root = client.get_root()

    res = {
        'reviewrequests': {},
    }

    for identifier in req.get('identifiers', []):
        rrs = root.get_review_requests(commit_id=identifier)

        if rrs.total_results != 1:
            continue

        rr = rrs[0]
        commit_data = client.get_path(
            '/extensions/mozreview.extension.MozReviewExtension/'
            'commit-data/%s/' % rr.id)

        try:
            is_squashed = commit_data.extra_data['p2rb.is_squashed']
        except KeyError:
            is_squashed = None

        # 'True' in RB <= 2.0.11; True in 2.0.11+. We may have old
        # values in the database, so keep checking for 'True' until we
        # have a migration.
        if is_squashed is True or is_squashed == 'True':
            if 'p2rb.commits' in commit_data.extra_data:
                commits = commit_data.extra_data['p2rb.commits']
            else:
                draft = rr.get_draft()
                if 'p2rb.commits' in commit_data.draft_extra_data:
                    commits = commit_data.draft_extra_data['p2rb.commits']
                else:
                    commits = '[]'

            for relation in json.loads(commits):
                rid = str(relation[1])

                res['reviewrequests'][str(rid)] = {
                    'status': rr.status,
                    'public': rr.public,
                }

        res['reviewrequests'][str(rr.id)] = {
            'status': rr.status,
            'public': rr.public,
            'reviewers': [p.title for p in rr.target_people],
        }

    return json.dumps(res, sort_keys=True)
Пример #2
0
def _processpublishreview(repo, req):
    from rbtools.api.errors import APIError
    # Workaround an issue with "import _imp" in pkg_resources.
    with demandimport.deactivated():
        from reviewboardmods.pushhooks import ReviewBoardClient
    client = ReviewBoardClient(repo.ui.config('reviewboard',
                                              'url').rstrip('/'),
                               username=req['bzusername'],
                               apikey=req['bzapikey'])
    root = client.get_root()

    res = {
        'results': [],
    }

    for rrid in req.get('rrids', []):
        try:
            rr = root.get_review_request(review_request_id=rrid)
            draft = rr.get_draft()
            draft.update(public=True)
            res['results'].append({'rrid': rrid, 'success': True})
        except APIError as e:
            res['results'].append({'rrid': rrid, 'error': str(e)})

    return res
def submit_reviews(url, repoid, identifier, commits, privileged_username,
                   privileged_password, username=None, apikey=None):
    """Submit commits to Review Board."""
    # Workaround an issue with "import _imp" in pkg_resources.
    with demandimport.deactivated():
        from reviewboardmods.pushhooks import ReviewBoardClient

    client = ReviewBoardClient(url, username=privileged_username,
                               password=privileged_password)
    root = client.get_root()

    batch_request_resource = root.get_extension(
        extension_name='mozreview.extension.MozReviewExtension')\
        .get_batch_review_requests()
    series_result = batch_request_resource.create(
        username=username,
        api_key=apikey,
        # This assumes that we pushed to the repository/URL that Review Board is
        # configured to use. This assumption may not always hold.
        repo_id=repoid,
        identifier=identifier,
        commits=json.dumps(commits, encoding='utf-8'))

    nodes = {node.encode('utf-8'): str(rid)
             for node, rid in series_result.nodes.iteritems()}

    return (
        str(series_result.squashed_rr),
        nodes,
        series_result.review_requests,
        series_result.warnings,
    )
Пример #4
0
def getreposfromreviewboard(repo):
    from reviewboardmods.pushhooks import ReviewBoardClient

    client = ReviewBoardClient(repo.ui.config('reviewboard', 'url').rstrip('/'))
    root = client.get_root()
    urls = set()

    repos = root.get_repositories(max_results=250, tool='Mercurial')
    try:
        while True:
            for r in repos:
                urls.add(r.path)

            repos = repos.get_next()

    except StopIteration:
        pass

    return urls
Пример #5
0
def submit_reviews(url,
                   repoid,
                   identifier,
                   commits,
                   privileged_username,
                   privileged_password,
                   username=None,
                   apikey=None):
    """Submit commits to Review Board."""
    # Workaround an issue with "import _imp" in pkg_resources.
    with demandimport.deactivated():
        from reviewboardmods.pushhooks import ReviewBoardClient

    client = ReviewBoardClient(url,
                               username=privileged_username,
                               password=privileged_password)
    root = client.get_root()

    batch_request_resource = root.get_extension(
        extension_name='mozreview.extension.MozReviewExtension')\
        .get_batch_review_requests()
    series_result = batch_request_resource.create(
        username=username,
        api_key=apikey,
        # This assumes that we pushed to the repository/URL that Review Board is
        # configured to use. This assumption may not always hold.
        repo_id=repoid,
        identifier=identifier,
        commits=json.dumps(commits, encoding='utf-8'))

    nodes = {
        node.encode('utf-8'): str(rid)
        for node, rid in series_result.nodes.iteritems()
    }

    return (
        str(series_result.squashed_rr),
        nodes,
        series_result.review_requests,
        series_result.warnings,
    )
Пример #6
0
def getreposfromreviewboard(repo):
    # Workaround an issue with "import _imp" in pkg_resources.
    with demandimport.deactivated():
        from reviewboardmods.pushhooks import ReviewBoardClient

    client = ReviewBoardClient(repo.ui.config('reviewboard', 'url').rstrip('/'))
    root = client.get_root()
    urls = set()

    repos = root.get_repositories(max_results=250, tool='Mercurial')
    try:
        while True:
            for r in repos:
                urls.add(r.path)

            repos = repos.get_next()

    except StopIteration:
        pass

    return urls
Пример #7
0
def getreposfromreviewboard(repo):
    # Workaround an issue with "import _imp" in pkg_resources.
    with demandimport.deactivated():
        from reviewboardmods.pushhooks import ReviewBoardClient

    client = ReviewBoardClient(repo.ui.config('reviewboard', 'url').rstrip('/'))
    root = client.get_root()
    urls = set()

    repos = root.get_repositories(max_results=250, tool='Mercurial')
    try:
        while True:
            for r in repos:
                urls.add(r.path)

            repos = repos.get_next()

    except StopIteration:
        pass

    return urls
Пример #8
0
def _processpublishreview(repo, req):
    from rbtools.api.errors import APIError
    from reviewboardmods.pushhooks import ReviewBoardClient
    client = ReviewBoardClient(repo.ui.config('reviewboard', 'url').rstrip('/'),
                               username=req['bzusername'],
                               apikey=req['bzapikey'])
    root = client.get_root()

    res = {
        'results': [],
    }

    for rrid in req.get('rrids', []):
        try:
            rr = root.get_review_request(review_request_id=rrid)
            draft = rr.get_draft()
            draft.update(public=True)
            res['results'].append({'rrid': rrid, 'success': True})
        except APIError as e:
            res['results'].append({'rrid': rrid, 'error': str(e)})

    return res
Пример #9
0
def pullreviews(repo, proto, args=None):
    proto.redirect()
    req = parsejsonpayload(proto, args)

    # Workaround an issue with "import _imp" in pkg_resources.
    with demandimport.deactivated():
        from reviewboardmods.pushhooks import ReviewBoardClient
    client = ReviewBoardClient(repo.ui.config('reviewboard',
                                              'url').rstrip('/'),
                               username=req.get('bzusername'),
                               apikey=req.get('bzapikey'))
    root = client.get_root()

    res = {
        'reviewrequests': {},
    }

    for identifier in req.get('identifiers', []):
        rrs = root.get_review_requests(commit_id=identifier)

        if rrs.total_results != 1:
            continue

        rr = rrs[0]
        commit_data = client.get_path(
            '/extensions/mozreview.extension.MozReviewExtension/'
            'commit-data/%s/' % rr.id)

        try:
            is_squashed = commit_data.extra_data['p2rb.is_squashed']
        except KeyError:
            is_squashed = None

        # 'True' in RB <= 2.0.11; True in 2.0.11+. We may have old
        # values in the database, so keep checking for 'True' until we
        # have a migration.
        if is_squashed is True or is_squashed == 'True':
            if 'p2rb.commits' in commit_data.extra_data:
                commits = commit_data.extra_data['p2rb.commits']
            else:
                draft = rr.get_draft()
                if 'p2rb.commits' in commit_data.draft_extra_data:
                    commits = commit_data.draft_extra_data['p2rb.commits']
                else:
                    commits = '[]'

            for relation in json.loads(commits):
                rid = str(relation[1])

                res['reviewrequests'][str(rid)] = {
                    'status': rr.status,
                    'public': rr.public,
                }

        res['reviewrequests'][str(rr.id)] = {
            'status': rr.status,
            'public': rr.public,
            'reviewers': [p.title for p in rr.target_people],
        }

    return json.dumps(res, sort_keys=True)