Пример #1
0
    def _index(self, request):
        user = self.user
        yours = user.get_user_submit_pull_requests()
        participated = user.get_participated_pull_requests()
        invited = user.get_invited_pull_requests()

        yours_list = [PullRequest.get_by_ticket(ticket).as_dict()
                      for ticket in yours]
        participated_list = [PullRequest.get_by_ticket(ticket).as_dict()
                             for ticket in participated]
        invited_list = [PullRequest.get_by_ticket(ticket).as_dict()
                        for ticket in invited]

        yours_list = filter(lambda t: t, yours_list)
        participated = filter(lambda t: t, participated)
        invited_list = filter(lambda t: t, invited_list)

        rs = []
        if yours_list:
            rs.append({'section': 'Yours', 'pulls': yours_list})
        if participated_list:
            rs.append({'section': 'Participated', 'pulls': participated_list})
        if invited_list:
            rs.append({'section': 'Invited', 'pulls': invited_list})

        return rs
Пример #2
0
    def _index(self, request):
        user = self.user
        yours = user.get_user_submit_pull_requests()
        participated = user.get_participated_pull_requests()
        invited = user.get_invited_pull_requests()

        yours_list = [
            PullRequest.get_by_ticket(ticket).as_dict() for ticket in yours
        ]
        participated_list = [
            PullRequest.get_by_ticket(ticket).as_dict()
            for ticket in participated
        ]
        invited_list = [
            PullRequest.get_by_ticket(ticket).as_dict() for ticket in invited
        ]

        yours_list = filter(lambda t: t, yours_list)
        participated = filter(lambda t: t, participated)
        invited_list = filter(lambda t: t, invited_list)

        rs = []
        if yours_list:
            rs.append({'section': 'Yours', 'pulls': yours_list})
        if participated_list:
            rs.append({'section': 'Participated', 'pulls': participated_list})
        if invited_list:
            rs.append({'section': 'Invited', 'pulls': invited_list})

        return rs
Пример #3
0
    def new(self, request):
        user = request.user
        if not user:
            raise AccessError
        from_proj = self.project
        from_ref = request.get_form_var('head_ref', from_proj.default_branch)
        parent_proj = from_proj.get_forked_from()
        to_proj = request.get_form_var('base_repo')
        if to_proj:
            to_proj = CodeDoubanProject.get_by_name(to_proj)
        elif parent_proj:
            to_proj = parent_proj
        else:
            to_proj = from_proj
        if not to_proj:
            raise TraversalError("The PR's upstream project is not existed")
        to_ref = request.get_form_var('base_ref', to_proj.default_branch)
        if from_proj != to_proj:
            # Allow to create PR to a different project only if user has push perm
            # ~~A bit weird, maybe should be separate perms
            # ~~If from and to projects are the same, we should be in online edit mode
            if not from_proj.has_push_perm(user.name):
                raise AccessError(
                    "Need push permission to add a PR on another project")
        pullreq = PullRequest.open(from_proj, from_ref, to_proj, to_ref)
        family = from_proj.get_fork_network()
        from_branches = from_proj.repo.branches
        to_branches = to_proj.repo.branches
        from_commit = pullreq.from_commit
        to_commit = pullreq.to_commit
        if not pullreq.can_pull:
            raise TraversalError(
                "The PR's head_ref or base_ref is not existed")
        highlighted_projects = filter(None, [from_proj, parent_proj])
        commits = pullreq.commits
        n_commits = len(commits)
        n_authors = len(set(c.author.username for c in commits))
        ticket_title, ticket_desc = self._choose_default_PR_title_and_description(
            commits)  # noqa

        # get diff
        diff = pullreq.get_diff(rename_detection=True)
        n_files = diff.length

        grouped_commits = groupby(commits, lambda c: c.author_time.date())

        prs = PullRequest.get_by_from_and_to(from_proj.id, from_ref,
                                             to_proj.id, to_ref)
        open_pullreqs = []
        for pr in prs:
            t = Ticket.get_by_projectid_and_ticketnumber(
                to_proj.id, pr.ticket_id)
            if t and t.closed is None:
                open_pullreqs.append(pr)
        guideline_url = get_project_guidelines(to_proj)
        teams = Team.get_all_team_uids()
        return st('/pull/new.html', **locals())
Пример #4
0
    def new(self, request):
        user = request.user
        if not user:
            raise AccessError
        from_proj = self.project
        from_ref = request.get_form_var('head_ref', from_proj.default_branch)
        parent_proj = from_proj.get_forked_from()
        to_proj = request.get_form_var('base_repo')
        if to_proj:
            to_proj = CodeDoubanProject.get_by_name(to_proj)
        elif parent_proj:
            to_proj = parent_proj
        else:
            to_proj = from_proj
        if not to_proj:
            raise TraversalError("The PR's upstream project is not existed")
        to_ref = request.get_form_var('base_ref', to_proj.default_branch)
        if from_proj != to_proj:
            # Allow to create PR to a different project only if user has push perm
            # ~~A bit weird, maybe should be separate perms
            # ~~If from and to projects are the same, we should be in online edit mode
            if not from_proj.has_push_perm(user.name):
                raise AccessError(
                    "Need push permission to add a PR on another project")
        pullreq = PullRequest.open(from_proj, from_ref, to_proj, to_ref)
        family = from_proj.get_fork_network()
        from_branches = from_proj.repo.branches
        to_branches = to_proj.repo.branches
        from_commit = pullreq.from_commit
        to_commit = pullreq.to_commit
        if not pullreq.can_pull:
            raise TraversalError(
                "The PR's head_ref or base_ref is not existed")
        highlighted_projects = filter(None, [from_proj, parent_proj])
        commits = pullreq.commits
        n_commits = len(commits)
        n_authors = len(set(c.author.username for c in commits))
        ticket_title, ticket_desc = self._choose_default_PR_title_and_description(commits)  # noqa

        # get diff
        diff = pullreq.get_diff(rename_detection=True)
        n_files = diff.length

        grouped_commits = groupby(commits, lambda c: c.author_time.date())

        prs = PullRequest.get_by_from_and_to(
            from_proj.id, from_ref, to_proj.id, to_ref)
        open_pullreqs = []
        for pr in prs:
            t = Ticket.get_by_projectid_and_ticketnumber(
                to_proj.id, pr.ticket_id)
            if t and t.closed is None:
                open_pullreqs.append(pr)
        guideline_url = get_project_guidelines(to_proj)
        teams = Team.get_all_team_uids()
        return st('/pull/new.html', **locals())
Пример #5
0
    def get(self, request):
        _date_from = None
        _date_to = None
        state = request.get_form_var('state', '')
        author = request.get_form_var('author', '')
        date_from = request.get_form_var('from', '')
        date_to = request.get_form_var('to', '')
        if not state or state == "open":
            closed = False
        else:
            closed = True
        if date_from:
            _date_from = date_from
        if date_to:
            _date_to = date_to

        tickets = Ticket.gets(project_id=self.repo.id,
                              author=author,
                              date_from=_date_from,
                              date_to=_date_to,
                              closed=closed)
        pulls = []
        for t in tickets:
            pull = PullRequest.get_by_proj_and_ticket(self.repo.id,
                                                      t.ticket_number)
            pulls.append(pull.as_dict())
        return pulls
Пример #6
0
    def test_get_commits(self):
        """应该能够得到所有将合并的改动"""
        with setup2repos('prj3') as (path, repo, fork_path, fork_repo):

            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            commits = pullreq.commits
            eq_(len(commits), 1)
Пример #7
0
    def test_get_commits(self):
        """应该能够得到所有将合并的改动"""
        with setup2repos('prj3') as (path, repo, fork_path, fork_repo):

            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            commits = pullreq.commits
            eq_(len(commits), 1)
Пример #8
0
def main():
    rs = store.execute("select id "
                       "from codedouban_ticket")
    for r in rs:
        id, = r
        ticket = Ticket.get(id)
        # update merge
        pullreq = PullRequest.get_by_ticket(ticket)
        author = pullreq.merge_by or pullreq.to_proj.owner_id
        time = pullreq.merge_time
        ticket_id = ticket.id
        id = 0
        if not get_node(author, TICKET_NODE_TYPE_MERGE, id, ticket_id, time) and time:
            print id, author, time, ticket_id
            store.execute("insert into ticket_nodes "
                          "(author, type, type_id, ticket_id, created_at) "
                          "value (%s, %s, %s, %s, %s)",
                          (author, TICKET_NODE_TYPE_MERGE, id, ticket_id, time))
            store.commit()
        # update close
        author = ticket.close_by or ticket.author
        time = ticket.closed
        ticket_id = ticket.id
        id = 0
        if not get_node(author, TICKET_NODE_TYPE_CLOSE, id, ticket_id, time) and time:
            print id, author, time, ticket_id
            store.execute("insert into ticket_nodes "
                          "(author, type, type_id, ticket_id, created_at) "
                          "value (%s, %s, %s, %s, %s)",
                          (author, TICKET_NODE_TYPE_CLOSE, id, ticket_id, time))
            store.commit()
    print "update %s close & merge pulls" % len(rs)
Пример #9
0
    def create(self, request):
        user = request.user
        if not user:
            raise AccessError
        from_proj = request.get_form_var('from_proj')
        from_ref = request.get_form_var('from_ref')
        to_ref = request.get_form_var('to_ref')
        to_proj = request.get_form_var('to_proj')
        title = request.get_form_var('title', '').decode('utf-8')
        comment = request.get_form_var('body', '').decode('utf-8')
        if not all([from_ref, from_proj, to_ref, to_proj]):
            raise TraversalError
        from_proj = CodeDoubanProject.get_by_name(from_proj)
        to_proj = CodeDoubanProject.get_by_name(to_proj)
        if from_proj != to_proj:
            if not from_proj.has_push_perm(user.name):
                raise AccessError(
                    "Need push permission to create PR on another project")

        pullreq = PullRequest.open(from_proj, from_ref, to_proj, to_ref)
        ticket = Ticket(None, None, to_proj.id, title, comment, user.username,
                        None, None)
        pullreq = add_pull(ticket, pullreq, user)
        ticket = pullreq.ticket
        return request.redirect(
            str('/%s/pull/%s/' % (to_proj.name, ticket.ticket_id)))
Пример #10
0
    def create(self, request):
        user = request.user
        if not user:
            raise AccessError
        from_proj = request.get_form_var('from_proj')
        from_ref = request.get_form_var('from_ref')
        to_ref = request.get_form_var('to_ref')
        to_proj = request.get_form_var('to_proj')
        title = request.get_form_var('title', '').decode('utf-8')
        comment = request.get_form_var('body', '').decode('utf-8')
        if not all([from_ref, from_proj, to_ref, to_proj]):
            raise TraversalError
        from_proj = CodeDoubanProject.get_by_name(from_proj)
        to_proj = CodeDoubanProject.get_by_name(to_proj)
        if from_proj != to_proj:
            if not from_proj.has_push_perm(user.name):
                raise AccessError(
                    "Need push permission to create PR on another project")

        pullreq = PullRequest.open(from_proj, from_ref, to_proj, to_ref)
        ticket = Ticket(None, None, to_proj.id, title, comment,
                        user.username, None, None)
        pullreq = add_pull(ticket, pullreq, user)
        ticket = pullreq.ticket
        return request.redirect(str('/%s/pull/%s/' % (to_proj.name,
                                                      ticket.ticket_id)))
Пример #11
0
 def __init__(self, ticket):
     self.project = CodeDoubanProject.get(ticket.project_id)
     self.proj_name = self.project.name
     self.ticket_id = ticket.ticket_number
     self.ticket = ticket
     self.pullreq = PullRequest.get_by_proj_and_ticket(
         self.project.id, self.ticket_id)
Пример #12
0
    def test_single_project(self):
        skip_test()
        u_to = User("admin")
        u_from = User("testuser")
        to_proj = self._prj("test", "admin")
        self._add(to_proj, u_to, "README.md", "hi")
        from_proj = self._prj("testuser/test", "testuser", to_proj.id)
        self._add(from_proj, u_from, "README.md", "hello")
        pullreq = PullRequest.open(from_proj, "master", to_proj, "master")
        ticket = Ticket(None, None, to_proj.id, "title", "desc", "testuser",
                        None, None)
        pullreq = add_pull(ticket, pullreq, u_from)

        iss = ProjectIssue.add(title='title1',
                               description='desc1',
                               creator='owner',
                               project=to_proj.id)
        IssuePRSearch.index_a_project(to_proj)
        res = IssueSearch.search_a_phrase('title1', to_proj.id)
        res = SearchEngine.decode(res, ('issue_id', ))
        res = [id for id, in res]
        assert len(res) == 1
        assert res[0] == iss.id
        res = PullRequestSearch.search_a_phrase('title', to_proj.id)
        res = SearchEngine.decode(res, ('issue_id', ))
        res = [id for id, in res]
        assert len(res) == 1
Пример #13
0
    def test_single_project(self):
        skip_test()
        u_to = User("admin")
        u_from = User("testuser")
        to_proj = self._prj("test", "admin")
        self._add(to_proj, u_to, "README.md", "hi")
        from_proj = self._prj("testuser/test", "testuser", to_proj.id)
        self._add(from_proj, u_from, "README.md", "hello")
        pullreq = PullRequest.open(from_proj, "master", to_proj, "master")
        ticket = Ticket(None, None, to_proj.id, "title", "desc", "testuser",
                        None, None)
        pullreq = add_pull(ticket, pullreq, u_from)

        iss = ProjectIssue.add(title='title1', description='desc1',
                               creator='owner', project=to_proj.id)
        IssuePRSearch.index_a_project(to_proj)
        res = IssueSearch.search_a_phrase('title1', to_proj.id)
        res = SearchEngine.decode(res, ('issue_id',))
        res = [id for id, in res]
        assert len(res) == 1
        assert res[0] == iss.id
        res = PullRequestSearch.search_a_phrase('title', to_proj.id)
        res = SearchEngine.decode(res, ('issue_id',))
        res = [id for id, in res]
        assert len(res) == 1
Пример #14
0
    def get(self, request):
        _date_from = None
        _date_to = None
        state = request.get_form_var('state', '')
        author = request.get_form_var('author', '')
        date_from = request.get_form_var('from', '')
        date_to = request.get_form_var('to', '')
        if not state or state == "open":
            closed = False
        else:
            closed = True
        if date_from:
            _date_from = date_from
        if date_to:
            _date_to = date_to

        tickets = Ticket.gets(project_id=self.repo.id,
                              author=author,
                              date_from=_date_from,
                              date_to=_date_to,
                              closed=closed)
        pulls = []
        for t in tickets:
            pull = PullRequest.get_by_proj_and_ticket(self.repo.id,
                                                      t.ticket_number)
            pulls.append(pull.as_dict())
        return pulls
Пример #15
0
    def test_ticket_count(self):
        title = 'test title'
        desc = 'test desc'
        author = 'testuser'

        p1_t1 = Ticket.add(self.proj1.id, title, desc, author)
        pullreq1 = PullRequest.open(
            self.proj1_fork, 'master', self.proj1, 'master')
        pullreq1 = pullreq1.insert(p1_t1.ticket_number)

        p1_t2 = Ticket.add(self.proj1.id, title, desc, author)
        pullreq = PullRequest.open(
            self.proj1_fork, 'master', self.proj1, 'master')
        pullreq = pullreq.insert(p1_t2.ticket_number)

        # test ticket count
        assert int(Ticket.get_count_by_proj(self.proj1.id)) == 2
Пример #16
0
    def test_ticket_count(self):
        title = 'test title'
        desc = 'test desc'
        author = 'testuser'

        p1_t1 = Ticket.add(self.proj1.id, title, desc, author)
        pullreq1 = PullRequest.open(self.proj1_fork, 'master', self.proj1,
                                    'master')
        pullreq1 = pullreq1.insert(p1_t1.ticket_number)

        p1_t2 = Ticket.add(self.proj1.id, title, desc, author)
        pullreq = PullRequest.open(self.proj1_fork, 'master', self.proj1,
                                   'master')
        pullreq = pullreq.insert(p1_t2.ticket_number)

        # test ticket count
        assert int(Ticket.get_count_by_proj(self.proj1.id)) == 2
Пример #17
0
def add_code_review_action(sender, **kw):
    data = format_code_review_info(sender, **kw)
    ticket = kw['ticket']
    author = kw['author']
    pullreq = PullRequest.get_by_ticket(ticket)
    feeds = get_related_feeds(author, pullreq.to_proj)
    for feed in feeds:
        feed.add_action(data)
Пример #18
0
 def open_pulls(self):
     from vilya.models.ticket import Ticket
     from vilya.models.pull import PullRequest
     pulls = [PullRequest.get_by_proj_and_ticket(self.id,
                                                 t.ticket_id)
              for t in Ticket.gets_by_proj(self.id,
                                           limit=9999)]
     return pulls
Пример #19
0
def add_code_review_action(sender, **kw):
    data = format_code_review_info(sender, **kw)
    ticket = kw['ticket']
    author = kw['author']
    pullreq = PullRequest.get_by_ticket(ticket)
    feeds = get_related_feeds(author, pullreq.to_proj)
    for feed in feeds:
        feed.add_action(data)
Пример #20
0
 def open_pulls(self):
     from vilya.models.ticket import Ticket
     from vilya.models.pull import PullRequest
     pulls = [PullRequest.get_by_proj_and_ticket(self.id,
                                                 t.ticket_id)
              for t in Ticket.gets_by_proj(self.id,
                                           limit=9999)]
     return pulls
Пример #21
0
    def test_is_auto_mergable_should_not_commit_merge(self):
        """调用 is_auto_mergable() 不应该导致仓库被 merge """
        with setup2repos('prj1') as \
                (path, repo, fork_path, fork_repo):
            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            ok_(pullreq.is_auto_mergable())

            with self.clone_clean(path) as workdir:
                assert not os.path.exists(join(workdir, 'a'))
Пример #22
0
    def test_is_auto_mergable_should_not_commit_merge(self):
        """调用 is_auto_mergable() 不应该导致仓库被 merge """
        with setup2repos('prj1') as \
                (path, repo, fork_path, fork_repo):
            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            ok_(pullreq.is_auto_mergable())

            with self.clone_clean(path) as workdir:
                assert not os.path.exists(join(workdir, 'a'))
Пример #23
0
 def __init__(self, data):
     NotificationDispatcher.__init__(self, data)
     self._sender = data.get('sender')
     self._comment = data.get('comment')
     self._content = self._comment.content if self._comment else data.get('content', '')
     self._ticket = data.get('ticket')
     self._pullreq = PullRequest.get_by_ticket(self._ticket)
     self._target = self._pullreq.to_proj
     self._is_ticketcomment = isinstance(self._comment, TicketComment)
Пример #24
0
 def index_a_project_pr(cls, project):
     rs = store.execute("select ticket_id from pullreq "
                        "where to_project=%s", project.id)
     for r, in rs:
         pr = PullRequest.get_by_proj_and_ticket(project.id, r)
         if pr:
             data = pr.as_dict()
             if data:
                 serial = "%s_%s" % (project.index_name, r)
                 cls.index_an_object(serial, data)
Пример #25
0
 def clear_pull(cls, name, pull_id):
     project = cls.get_by_name(name)
     if not project:
         return None
     from vilya.models.pull import PullRequest
     pull = PullRequest.gets_by(to_project=project.id, ticket_id=pull_id,
                                force_flush=True)
     if pull:
         return True
     return None
Пример #26
0
 def clear_pull(cls, name, pull_id):
     project = cls.get_by_name(name)
     if not project:
         return None
     from vilya.models.pull import PullRequest
     pull = PullRequest.gets_by(to_project=project.id, ticket_id=pull_id,
                                force_flush=True)
     if pull:
         return True
     return None
Пример #27
0
    def _index(self, request):
        project = CodeDoubanProject.get_by_name(self.proj_name)
        open_tickets = Ticket.gets_by_proj(project.id, limit=9999)

        pr_list = []
        for t in open_tickets:
            pullreq = PullRequest.get_by_proj_and_ticket(project.id,
                                                         t.ticket_number)
            if pullreq:
                pr_list.append(pullreq.as_dict())
        return pr_list
Пример #28
0
    def commits(self, request):
        if not self.ticket:
            raise TraversalError()

        pr = PullRequest.get_by_proj_and_ticket(
            self.project.id, self.ticket.ticket_number)
        commits = pr.get_commits_shas()
        commits = [TicketCommits.commit_as_dict(self.project, c)
                   for c in commits]
        # commits = reduce(lambda x, y: x + y, commits)
        return commits
Пример #29
0
    def test_is_up_to_date(self):
        """应该能探测是否是已经merge过的"""
        with setup2repos('prj_uptodate') as (path, repo, fork_path, fork_repo):

            with self.clone_clean(path) as work_path:
                with chdir(work_path):
                    gyt.call(['git', 'pull', fork_path])
                    gyt.call(['git', 'push', 'origin', 'master'])

            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            ok_(pullreq.is_up_to_date())
Пример #30
0
    def test_is_up_to_date(self):
        """应该能探测是否是已经merge过的"""
        with setup2repos('prj_uptodate') as (path, repo, fork_path, fork_repo):

            with self.clone_clean(path) as work_path:
                with chdir(work_path):
                    gyt.call(['git', 'pull', fork_path])
                    gyt.call(['git', 'push', 'origin', 'master'])

            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            ok_(pullreq.is_up_to_date())
Пример #31
0
    def _index(self, request):
        project = CodeDoubanProject.get_by_name(self.proj_name)
        open_tickets = Ticket.gets_by_proj(project.id, limit=9999)

        pr_list = []
        for t in open_tickets:
            pullreq = PullRequest.get_by_proj_and_ticket(
                project.id, t.ticket_number)
            if pullreq:
                pr_list.append(pullreq.as_dict())
        return pr_list
Пример #32
0
    def __init__(self, project_id, ticket_id):
        self.project_id = project_id
        self.ticket_id = ticket_id

        self.ticket = Ticket.get_by_projectid_and_ticketnumber(
            self.project_id, self.ticket_id)

        if not self.ticket:
            raise NotFoundError('pull')

        self.pullreq = PullRequest.get_by_proj_and_ticket(
            self.project_id, self.ticket.ticket_number)
Пример #33
0
    def commits(self, request):
        if not self.ticket:
            raise TraversalError()

        pr = PullRequest.get_by_proj_and_ticket(self.project.id,
                                                self.ticket.ticket_number)
        commits = pr.get_commits_shas()
        commits = [
            TicketCommits.commit_as_dict(self.project, c) for c in commits
        ]
        # commits = reduce(lambda x, y: x + y, commits)
        return commits
Пример #34
0
 def __init__(self, proj_name, ticket_id):
     self.proj_name = proj_name
     self.ticket_id = ticket_id
     self.project = CodeDoubanProject.get_by_name(proj_name)
     self.ticket = Ticket.get_by_projectid_and_ticketnumber(
         self.project.id, self.ticket_id)
     self.pullreq = PullRequest.get_by_proj_and_ticket(
         self.project.id, self.ticket_id)
     try:
         self.all_commits = self.pullreq.commits
     except Exception:
         self.all_commits = self.pullreq.get_merged_commits()
Пример #35
0
    def __init__(self, project_id, ticket_id):
        self.project_id = project_id
        self.ticket_id = ticket_id

        self.ticket = Ticket.get_by_projectid_and_ticketnumber(self.project_id,
                                                               self.ticket_id)

        if not self.ticket:
            raise NotFoundError('pull')

        self.pullreq = PullRequest.get_by_proj_and_ticket(
            self.project_id, self.ticket.ticket_number)
Пример #36
0
    def test_merge(self):
        """merge()应该将远程代码合并到bare仓库中"""

        with setup2repos('prj_merge') as (path, repo, fork_path, fork_repo):

            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            u = User('testmerge')
            pullreq.merge(u)

            with self.clone_clean(path) as work_path:
                content = open(join(work_path, 'a')).read()
                eq_(content, "a_hunk = [('idem', u'/* highlight style */'), ('rem', u'.highlight { color: #008000; font-weight: bold; } /* Keyword */'), ('add', u'.highlight .hll { background-color: #ffffcc; }'), ('add', u'.highlight  { backggggground: #ffffff; }'), ('add', u'.high .c { color: #808080; } /* Coomment */'), ('add', u'.highlight .err { color: #F00000; background-color: #F00A0A0; } /* Error */'), ('add', u'.highlight .k { color: #008000; font-weight: bold; } /* Keyword */'), ('idem', u'.highlight .o { color: #303; } /* Operator ****/'), ('idem', u'.highlight .cm { color: #808080; } /* Comment.Multiline */'),('idem', u'adfadsfadsf'),  ('idem', u'.highlight .cp { color: #507090; } /* Comment.Preproc */')]\n")  # noqa
Пример #37
0
 def __init__(self, proj_name, ticket_id):
     self.proj_name = proj_name
     self.ticket_id = ticket_id
     self.project = CodeDoubanProject.get_by_name(proj_name)
     self.ticket = Ticket.get_by_projectid_and_ticketnumber(
         self.project.id, self.ticket_id)
     self.pullreq = PullRequest.get_by_proj_and_ticket(
         self.project.id, self.ticket_id)
     try:
         self.all_commits = self.pullreq.commits
     except Exception:
         self.all_commits = self.pullreq.get_merged_commits()
Пример #38
0
 def open_parent_pulls(self):
     from vilya.models.ticket import Ticket
     from vilya.models.pull import PullRequest
     pulls = []
     parent = self.get_forked_from()
     if parent:
         pulls = [PullRequest.get_by_proj_and_ticket(parent.id,
                                                     t.ticket_id)
                  for t in Ticket.gets_by_proj(parent.id,
                                               limit=9999)]
         pulls = [p for p in pulls
                  if p and p.from_proj and p.from_proj.id == self.id]
     return pulls
Пример #39
0
 def open_network_pulls(self):
     from vilya.models.ticket import Ticket
     from vilya.models.pull import PullRequest
     pulls = []
     projects = self.get_fork_network()
     for project in projects:
         ps = [PullRequest.get_by_proj_and_ticket(project.id,
                                                  t.ticket_id)
               for t in Ticket.gets_by_proj(project.id,
                                            limit=9999)]
         pulls.extend([p for p in ps
                       if p and p.from_proj and p.from_proj.id == self.id])
     return pulls + self.open_pulls
Пример #40
0
 def close(self, request):
     user = request.user
     if user:
         ticket = self.ticket
         pullreq = PullRequest.get_by_proj_and_ticket(
             self.project.id, self.ticket.ticket_number)
         comment = ticket.add_comment('close pr', user.name)
         error = close_pull(self.ticket, pullreq, user, 'close pr', comment,
                            request)
         if error:
             raise NoPushPermissionError(error)
         return {'ok': True}
     raise UnauthorizedError
Пример #41
0
 def merge(self, request):
     user = request.user
     if user:
         pullreq = PullRequest.get_by_proj_and_ticket(
             self.project.id, self.ticket.ticket_number)
         if pullreq.merged:
             return {'ok': True}
         error = merge_pull(self.ticket, pullreq, user, '', request)
         if error:
             raise NoPushPermissionError(error)
         else:
             return {'ok': True}
     raise UnauthorizedError
Пример #42
0
 def open_network_pulls(self):
     from vilya.models.ticket import Ticket
     from vilya.models.pull import PullRequest
     pulls = []
     projects = self.get_fork_network()
     for project in projects:
         ps = [PullRequest.get_by_proj_and_ticket(project.id,
                                                  t.ticket_id)
               for t in Ticket.gets_by_proj(project.id,
                                            limit=9999)]
         pulls.extend([p for p in ps
                       if p and p.from_proj and p.from_proj.id == self.id])
     return pulls + self.open_pulls
Пример #43
0
 def open_parent_pulls(self):
     from vilya.models.ticket import Ticket
     from vilya.models.pull import PullRequest
     pulls = []
     parent = self.get_forked_from()
     if parent:
         pulls = [PullRequest.get_by_proj_and_ticket(parent.id,
                                                     t.ticket_id)
                  for t in Ticket.gets_by_proj(parent.id,
                                               limit=9999)]
         pulls = [p for p in pulls
                  if p and p.from_proj and p.from_proj.id == self.id]
     return pulls
Пример #44
0
def _latest_update_branch(project, ref, user):
    if user:
        get_pr = user.get_user_submit_pull_requests
        latest_tickets = get_pr(limit=5, is_closed=False) + get_pr(limit=5, is_closed=True)
        latest_tickets = filter(None, [PullRequest.get_by_ticket(t) for t in latest_tickets if t.project])
        has_pr_branches = [t.from_ref for t in latest_tickets]
    else:
        has_pr_branches = []
    latest_update_branches = filter(
        lambda b: b[1] != ref and b[1] not in has_pr_branches, project.repo.get_latest_update_branches()
    )
    latest_update_branch = latest_update_branches[0][1] if latest_update_branches else ""
    return latest_update_branch
Пример #45
0
    def test_pr_stat(self):
        TestCase.setUp(self)
        _, self.proj1, _, self.proj1_fork = setup_repos(
            mkdtemp(), 'testproject1')
        _, self.proj2, _, self.proj2_fork = setup_repos(
            mkdtemp(), 'testproject2')
        pr_rs = get_all_ticket()
        assert len(pr_rs) == 0
        pr_open_count = len(filter(lambda x: x[1] is None, pr_rs))
        assert pr_open_count == 0
        assert len(pr_rs) - pr_open_count == 0

        pullreq1 = PullRequest.open(self.proj1_fork, 'master', self.proj1,
                                    'master')
        ticket1 = Ticket.add(self.proj1.id, 'title', 'content', 'testuser')
        pullreq1 = pullreq1.insert(ticket1.ticket_number)
        pullreq2 = PullRequest.open(self.proj2_fork, 'master', self.proj2,
                                    'master')
        ticket2 = Ticket.add(self.proj2.id, 'title', 'content', 'testuser')
        pullreq2 = pullreq2.insert(ticket2.ticket_number)
        pr_rs = get_all_ticket()
        assert len(pr_rs) == 2
        pr_open_count = len(filter(lambda x: x[1] is None, pr_rs))
        assert pr_open_count == 2
        assert len(pr_rs) - pr_open_count == 0

        ticket1.close("testuser")
        pr_rs = get_all_ticket()
        assert len(pr_rs) == 2
        pr_open_count = len(filter(lambda x: x[1] is None, pr_rs))
        assert pr_open_count == 1
        assert len(pr_rs) - pr_open_count == 1

        pr_comment_count = get_ticket_comment_count()
        assert (pr_comment_count) == 0
        ticket2.add_comment("comment1", "testuse1")
        ticket2.add_comment("comment2", "testuse2")
        pr_comment_count = get_ticket_comment_count()
        assert (pr_comment_count) == 2
Пример #46
0
    def test_pr_stat(self):
        TestCase.setUp(self)
        _, self.proj1, _, self.proj1_fork = setup_repos(
            mkdtemp(), 'testproject1')
        _, self.proj2, _, self.proj2_fork = setup_repos(
            mkdtemp(), 'testproject2')
        pr_rs = get_all_ticket()
        assert len(pr_rs) == 0
        pr_open_count = len(filter(lambda x: x[1] is None, pr_rs))
        assert pr_open_count == 0
        assert len(pr_rs) - pr_open_count == 0

        pullreq1 = PullRequest.open(
            self.proj1_fork, 'master', self.proj1, 'master')
        ticket1 = Ticket.add(self.proj1.id, 'title', 'content', 'testuser')
        pullreq1 = pullreq1.insert(ticket1.ticket_number)
        pullreq2 = PullRequest.open(
            self.proj2_fork, 'master', self.proj2, 'master')
        ticket2 = Ticket.add(self.proj2.id, 'title', 'content', 'testuser')
        pullreq2 = pullreq2.insert(ticket2.ticket_number)
        pr_rs = get_all_ticket()
        assert len(pr_rs) == 2
        pr_open_count = len(filter(lambda x: x[1] is None, pr_rs))
        assert pr_open_count == 2
        assert len(pr_rs) - pr_open_count == 0

        ticket1.close("testuser")
        pr_rs = get_all_ticket()
        assert len(pr_rs) == 2
        pr_open_count = len(filter(lambda x: x[1] is None, pr_rs))
        assert pr_open_count == 1
        assert len(pr_rs) - pr_open_count == 1

        pr_comment_count = get_ticket_comment_count()
        assert(pr_comment_count) == 0
        ticket2.add_comment("comment1", "testuse1")
        ticket2.add_comment("comment2", "testuse2")
        pr_comment_count = get_ticket_comment_count()
        assert(pr_comment_count) == 2
Пример #47
0
    def _toggle_whitespace(self, request, project, paths, ignore_space,
                           **kwargs):
        # For pull/new
        from_proj = request.get_form_var('from_proj')
        from_ref = request.get_form_var('from_ref')
        to_ref = request.get_form_var('to_ref')
        to_proj = request.get_form_var('to_proj')

        sha1 = kwargs.get('sha1')
        context_lines = kwargs.get('context_lines')
        ref = sha1
        if ref is None:
            ref = project.default_branch
        if hasattr(self, 'ticket'):
            pullreq = PullRequest.get_by_proj_and_ticket(
                project.id, self.ticket.ticket_number)
            linecomments = PullLineComment.gets_by_target(self.ticket.id)
        else:
            from_proj = CodeDoubanProject.get_by_name(from_proj)
            parent_proj = from_proj.get_forked_from()
            if to_proj:
                to_proj = CodeDoubanProject.get_by_name(to_proj)
            elif parent_proj:
                to_proj = parent_proj
            else:
                to_proj = from_proj
            pullreq = PullRequest.open(from_proj, from_ref, to_proj, to_ref)
            linecomments = []

        kw = {
            'paths': paths,
            'rename_detection': True,
            'linecomments': linecomments
        }
        if context_lines is not None:
            kw.update({'context_lines': context_lines})
        diff = pullreq.get_diff(**kw)
        return diff
Пример #48
0
    def _toggle_whitespace(self, request, project, paths, ignore_space,
                           **kwargs):
        # For pull/new
        from_proj = request.get_form_var('from_proj')
        from_ref = request.get_form_var('from_ref')
        to_ref = request.get_form_var('to_ref')
        to_proj = request.get_form_var('to_proj')

        sha1 = kwargs.get('sha1')
        context_lines = kwargs.get('context_lines')
        ref = sha1
        if ref is None:
            ref = project.default_branch
        if hasattr(self, 'ticket'):
            pullreq = PullRequest.get_by_proj_and_ticket(
                project.id, self.ticket.ticket_number)
            linecomments = PullLineComment.gets_by_target(self.ticket.id)
        else:
            from_proj = CodeDoubanProject.get_by_name(from_proj)
            parent_proj = from_proj.get_forked_from()
            if to_proj:
                to_proj = CodeDoubanProject.get_by_name(to_proj)
            elif parent_proj:
                to_proj = parent_proj
            else:
                to_proj = from_proj
            pullreq = PullRequest.open(from_proj, from_ref, to_proj, to_ref)
            linecomments = []

        kw = {
            'paths': paths,
            'rename_detection': True,
            'linecomments': linecomments
        }
        if context_lines is not None:
            kw.update({'context_lines': context_lines})
        diff = pullreq.get_diff(**kw)
        return diff
Пример #49
0
    def test_merge(self):
        """merge()应该将远程代码合并到bare仓库中"""

        with setup2repos('prj_merge') as (path, repo, fork_path, fork_repo):

            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            u = User('testmerge')
            pullreq.merge(u)

            with self.clone_clean(path) as work_path:
                content = open(join(work_path, 'a')).read()
                eq_(content,
                    "a_hunk = [('idem', u'/* highlight style */'), ('rem', u'.highlight { color: #008000; font-weight: bold; } /* Keyword */'), ('add', u'.highlight .hll { background-color: #ffffcc; }'), ('add', u'.highlight  { backggggground: #ffffff; }'), ('add', u'.high .c { color: #808080; } /* Coomment */'), ('add', u'.highlight .err { color: #F00000; background-color: #F00A0A0; } /* Error */'), ('add', u'.highlight .k { color: #008000; font-weight: bold; } /* Keyword */'), ('idem', u'.highlight .o { color: #303; } /* Operator ****/'), ('idem', u'.highlight .cm { color: #808080; } /* Comment.Multiline */'),('idem', u'adfadsfadsf'),  ('idem', u'.highlight .cp { color: #507090; } /* Comment.Preproc */')]\n"
                    )  # noqa
Пример #50
0
    def test_ticket_close(self):
        # close ticket
        title = 'test title'
        desc = 'test desc'
        author = 'testuser'

        p2_t1 = Ticket.add(self.proj2.id, title, desc, author)
        pullreq2 = PullRequest.open(self.proj2_fork, 'master', self.proj2,
                                    'master')
        pullreq2 = pullreq2.insert(p2_t1.ticket_number)

        assert p2_t1.closed is None
        p2_t1.close('testuser')
        assert Ticket.get(p2_t1.id).closed is not None
Пример #51
0
def gen_telchar_data(data):
    ticket_id = data.get('ticket_id')
    ticket = Ticket.get(ticket_id)
    pullreq = PullRequest.get_by_proj_and_ticket(ticket.project.id,
                                                 ticket.ticket_id)
    fork_from = pullreq.from_proj.fork_from
    fork_from = pullreq.from_proj.get(fork_from).url if fork_from else None
    return {
        'ticket_id': ticket.ticket_id,
        'fork_from': fork_from,
        'url': pullreq.from_proj.url,
        'to_sha': pullreq.to_sha,
        'from_sha': pullreq.from_sha
    }
Пример #52
0
 def test_ticket(self):
     title = 'test title'
     desc = 'test desc'
     author = 'testuser'
     p1_t1 = Ticket.add(self.proj1.id, title, desc, author)
     pullreq1 = PullRequest.open(self.proj1_fork, 'master', self.proj1,
                                 'master')
     pullreq1 = pullreq1.insert(p1_t1.ticket_number)
     assert p1_t1.ticket_id == 1
     assert p1_t1.title == title
     assert p1_t1.description == desc
     assert p1_t1.author == author
     p2_t1 = Ticket.add(self.proj2.id, title, desc, author)
     pullreq2 = PullRequest.open(self.proj2_fork, 'master', self.proj2,
                                 'master')
     pullreq2 = pullreq2.insert(p2_t1.ticket_number)
     assert p2_t1.ticket_id == 1
     ticket = Ticket.get_by_projectid_and_ticketnumber(
         self.proj1.id, p1_t1.ticket_id)
     assert ticket.id == p1_t1.id
     ticket = Ticket.get_by_projectid_and_ticketnumber(
         self.proj2.id, p2_t1.ticket_id)
     assert ticket.id == p2_t1.id
Пример #53
0
    def test_get_diffs(self):
        """应该能够得到所有将合并的diff"""
        with setup2repos('prj4') as (path, repo, fork_path, fork_repo):

            # make some change in origin repo, too
            with clone(path) as work_path:
                with chdir(work_path):
                    with open('b', 'w') as f:
                        f.write('b')

            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            diffs = pullreq.get_diff()
            # should not contain file b in origin
            eq_(diffs.length, 1)
Пример #54
0
 def close(self, request):
     user = request.user
     if user:
         ticket = self.ticket
         pullreq = PullRequest.get_by_proj_and_ticket(
             self.project.id,
             self.ticket.ticket_number)
         comment = ticket.add_comment('close pr', user.name)
         error = close_pull(self.ticket, pullreq, user, 'close pr',
                            comment, request)
         if error:
             raise NoPushPermissionError(error)
         return {'ok': True}
     raise UnauthorizedError
Пример #55
0
 def test_ticket(self):
     title = 'test title'
     desc = 'test desc'
     author = 'testuser'
     p1_t1 = Ticket.add(self.proj1.id, title, desc, author)
     pullreq1 = PullRequest.open(
         self.proj1_fork, 'master', self.proj1, 'master')
     pullreq1 = pullreq1.insert(p1_t1.ticket_number)
     assert p1_t1.ticket_id == 1
     assert p1_t1.title == title
     assert p1_t1.description == desc
     assert p1_t1.author == author
     p2_t1 = Ticket.add(self.proj2.id, title, desc, author)
     pullreq2 = PullRequest.open(
         self.proj2_fork, 'master', self.proj2, 'master')
     pullreq2 = pullreq2.insert(p2_t1.ticket_number)
     assert p2_t1.ticket_id == 1
     ticket = Ticket.get_by_projectid_and_ticketnumber(
         self.proj1.id, p1_t1.ticket_id)
     assert ticket.id == p1_t1.id
     ticket = Ticket.get_by_projectid_and_ticketnumber(
         self.proj2.id, p2_t1.ticket_id)
     assert ticket.id == p2_t1.id
Пример #56
0
    def test_get_diffs(self):
        """应该能够得到所有将合并的diff"""
        with setup2repos('prj4') as (path, repo, fork_path, fork_repo):

            # make some change in origin repo, too
            with clone(path) as work_path:
                with chdir(work_path):
                    with open('b', 'w') as f:
                        f.write('b')

            pullreq = PullRequest.open(fork_repo, 'master', repo, 'master')
            diffs = pullreq.get_diff()
            # should not contain file b in origin
            eq_(diffs.length, 1)
Пример #57
0
    def test_ticket_close(self):
        # close ticket
        title = 'test title'
        desc = 'test desc'
        author = 'testuser'

        p2_t1 = Ticket.add(self.proj2.id, title, desc, author)
        pullreq2 = PullRequest.open(
            self.proj2_fork, 'master', self.proj2, 'master')
        pullreq2 = pullreq2.insert(p2_t1.ticket_number)

        assert p2_t1.closed is None
        p2_t1.close('testuser')
        assert Ticket.get(p2_t1.id).closed is not None