示例#1
0
 def rb_client(self):
     options = {}
     if os.path.exists(".reviewboardrc"):
         with open(".reviewboardrc") as reviewboardrc:
             for line in reviewboardrc:
                 if line.startswith("#"):
                     continue
                 if len(line.strip()) == 0:
                     continue
                 k, v = line.strip().split("=")
                 k = k.strip()
                 v = eval(v.strip())
                 options[k] = v
     rbclient = RBClient(options.get('REVIEWBOARD_URL') or 'https://reviews.apache.org/', RetryingSyncTransport)
     if not rbclient.get_root().get_session()['authenticated']:
         username = self.opt.reviewboard_username[0] if self.opt.reviewboard_username and \
                                                        self.opt.reviewboard_username[0] else raw_input(
             "Enter review board Username: "******"Enter password for %s: " % username)
         rbclient.login(username, password)
     root = rbclient.get_root()
     root.repository = options.get('REPOSITORY') or None
     root.branch = options.get('BRANCH') or options.get('TRACKING_BRANCH')
     root.target_groups = None
     if options.has_key('TARGET_GROUPS'):
         root.target_groups = options['TARGET_GROUPS']
     return root
示例#2
0
 def get_rb_client(self):
     if not self.rb_client:
         options = {}
         with open(".reviewboardrc") as reviewboardrc:
             for line in reviewboardrc:
                 if line.startswith("#"):
                     continue
                 if len(line.strip()) == 0:
                     continue
                 k, v = line.strip().split("=")
                 k = k.strip()
                 v = eval(v.strip())
                 options[k] = v
         rbclient = RBClient(options['REVIEWBOARD_URL'])
         self.repository = options['REPOSITORY']
         self.branch = options.get('BRANCH') or options.get('TRACKING_BRANCH')
         self.target_groups = None
         if options.has_key('TARGET_GROUPS'):
             self.target_groups = options['TARGET_GROUPS']
         if rbclient.get_root().get_session()['authenticated']:
             return rbclient.get_root()
         username = self.opt.reviewboard_username or raw_input("Enter review board Username: "******"Enter password: ")
         rbclient.login(username, password)
         self.rb_client = rbclient.get_root()
     return self.rb_client
示例#3
0
 def rb_client(self):
     options = {}
     if os.path.exists(".reviewboardrc"):
         with open(".reviewboardrc") as reviewboardrc:
             for line in reviewboardrc:
                 if line.startswith("#"):
                     continue
                 if len(line.strip()) == 0:
                     continue
                 k, v = line.strip().split("=")
                 k = k.strip()
                 v = eval(v.strip())
                 options[k] = v
     rbclient = RBClient(
         options.get('REVIEWBOARD_URL') or 'https://reviews.apache.org/',
         RetryingSyncTransport)
     if not rbclient.get_root().get_session()['authenticated']:
         username = self.opt.reviewboard_username[0] if self.opt.reviewboard_username and \
                                                        self.opt.reviewboard_username[0] else raw_input(
             "Enter review board Username: "******"Enter password for %s: " % username)
         rbclient.login(username, password)
     root = rbclient.get_root()
     root.repository = options.get('REPOSITORY') or None
     root.branch = options.get('BRANCH') or options.get('TRACKING_BRANCH')
     root.target_groups = None
     if options.has_key('TARGET_GROUPS'):
         root.target_groups = options['TARGET_GROUPS']
     return root
示例#4
0
def get_root():
    settings = get_config()
    review = settings['reviewboard']
    client = RBClient(review['server'])
    client.login(review['user'], review['password'])

    return client.get_root()
示例#5
0
 def get_rb_client(self):
     options = {}
     with open(".reviewboardrc") as reviewboardrc:
         for line in reviewboardrc:
             k, v = line.split("=")
             k = k.strip()
             v = eval(v.strip())
             options[k] = v
     rbclient = RBClient(options['REVIEWBOARD_URL'])
     self.repository = options['REPOSITORY']
     self.branch = options['BRANCH']
     self.target_groups = None
     if options.has_key('TARGET_GROUPS'):
         self.target_groups = options['TARGET_GROUPS']
     if rbclient.get_root().get_session()['authenticated']:
         return rbclient
     username = raw_input("Enter review board Username: "******"Enter password: ")
     rbclient.login(username, password)
     return rbclient
def get_open_reviews(args):
    """
    get open reviews to a specified user, group, etc.
    """
    args['status'] = 'pending'
    if 'max_results' not in args:
        args['max_results'] = 100

    client = RBClient(REVIEWBOARD_URL)

    # If we have a username and password, login
    if REVIEWBOARD_USERNAME and REVIEWBOARD_PASSWORD:
        client.login(REVIEWBOARD_USERNAME, REVIEWBOARD_PASSWORD)

    root = client.get_root()

    if not root:
        logger.error(u'Could not get RBClient root')
        return None

    try:
        req = root.get_review_requests(**args)
    except APIError:
        logger.exception(u'Error querying API')
        return None

    ret = {'total': req.total_results, 'reviews': []}
    review_fmt = u"[{user}] {summary} ({url}/r/{id})"

    for review in req:
        ret['reviews'].append(review_fmt.format(user=review.get_submitter().username,
                                                summary=review.summary,
                                                url=REVIEWBOARD_URL,
                                                id=review.id))

    return ret
示例#7
0
class RBInterface():
    def __init__(self, url):
        self.client = RBClient(url)
        self.root = self.client.get_root()
        try:
            self._version = float(
                self.root.rsp['product']['version'].split()[0])
        except:
            self._version = 0.0
        self._templates = self.root.rsp['uri_templates']
        self._files = {}
        self._file_data = {}
        self._simplefile_data = {}

    @authentication_wrapper
    def get_review_requests(self, current_line):
        return self.root.get_review_requests(start=current_line)

    @authentication_wrapper
    def get_review_request(self, review_request_id):
        review_request_template = self._templates['review_request']
        url = review_request_template.format(
            review_request_id=review_request_id)
        return self.client.get_url(url)

    @authentication_wrapper
    def get_file_src(self, review_request_id, diff_revision, filediff_id):
        url = self._templates['diff'].format(
            review_request_id=review_request_id, diff_revision=diff_revision)
        if url not in self._simplefile_data:
            diff_obj = self.client.get_url(url)
            self._simplefile_data[url] = diff_obj
        diff_obj = self._simplefile_data[url]
        for filesimple in diff_obj.get_files():
            if filesimple['id'] == filediff_id:
                return filesimple['source_file']

    @authentication_wrapper
    def get_file_dst(self, review_request_id, diff_revision, filediff_id):
        url = self._templates['diff'].format(
            review_request_id=review_request_id, diff_revision=diff_revision)
        if url not in self._simplefile_data:
            diff_obj = self.client.get_url(url)
            self._simplefile_data[url] = diff_obj
        diff_obj = self._simplefile_data[url]
        for filesimple in diff_obj.get_files():
            if filesimple['id'] == filediff_id:
                return filesimple['dest_file']

    @authentication_wrapper
    def get_file(self, review_request_id, diff_revision, filediff_id):
        url = self._templates['file'].format(
            review_request_id=review_request_id,
            diff_revision=diff_revision,
            filediff_id=filediff_id)

        if url in self._files:
            return self._files[url]

        file_obj = self.client.get_url(url)
        self._files[url] = file_obj
        return self._files[url]

    def get_dst_lines(self, review_request_id, diff_revision, filediff_id):
        if self._version >= 3.0:
            file_obj = self.get_file(review_request_id, diff_revision,
                                     filediff_id)
            return file_obj.get_patched_file()['data'].splitlines()

        dest_file = self.get_file_dst(review_request_id, diff_revision,
                                      filediff_id)
        updates = self.get_filediff_data(review_request_id, diff_revision,
                                         filediff_id)
        dst_updates = updates['dst_updates']
        dst_lines = get_p4_file(dest_file)
        for lineno, linevalue in dst_updates.iteritems():
            dst_lines[lineno] = linevalue
        return dst_lines

    def get_src_lines(self, review_request_id, diff_revision, filediff_id):
        try:
            if self._version >= 3.0:
                file_obj = self.get_file(review_request_id, diff_revision,
                                         filediff_id)
                return file_obj.get_original_file()['data'].splitlines()
            source_file = self.get_file_src(review_request_id, diff_revision,
                                            filediff_id)
            return get_p4_file(source_file)
        except:
            return None

    @authentication_wrapper
    def get_filediff_data(self, review_request_id, diff_revision, filediff_id):

        url = self._templates['file'].format(
            review_request_id=review_request_id,
            diff_revision=diff_revision,
            filediff_id=filediff_id)
        if url in self._file_data:
            return self._file_data[url]

        file_obj = self.get_file(review_request_id, diff_revision, filediff_id)

        # chunks are collected differently
        if self._version >= 3.0:
            chunks = file_obj.get_diff_data()['chunks']
        else:
            chunks = file_obj['chunks']

        source_line_global_pos = {}
        dest_line_global_pos = {}
        dst_updates = {}
        for chunk in chunks:
            for line in chunk['lines']:
                try:
                    source_line_global_pos[int(line[1]) - 1] = int(line[0]) - 1
                    dest_line_global_pos[int(line[4]) - 1] = int(line[0]) - 1
                    dst_updates[line[1] - 1] = _html_parser.unescape(line[5])
                except:
                    pass

        self._file_data[url] = {
            'source_global_pos': source_line_global_pos,
            'dest_global_pos': dest_line_global_pos,
            'dst_updates': dst_updates
        }

        return self._file_data[url]

    @authentication_wrapper
    def make_review(self, review_request_id):
        review_request = self.get_review_request(review_request_id)
        try:
            return review_request.get_reviews().get_review_draft()
        except:
            return review_request.get_reviews().create()

    @authentication_wrapper
    def make_comment(self, review_request_id, first_line, text, filediff_id,
                     num_lines):
        request = self.make_review(review_request_id)
        request.get_diff_comments().create(first_line=first_line,
                                           text=text,
                                           filediff_id=filediff_id,
                                           num_lines=num_lines)

    def login(self, user, password):
        self.client.login(user, password)