Esempio n. 1
0
class Activities(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        page = request.args.get('p', 1)
        try:
            page = int(page)
        except ValueError:
            raise abort(403)
        data, list_page = render_activities_page(page, t='repo', repo=repo)
        return self.render_template(
                    data=self.render_activities(data, organization, repo, team), \
                    list_page=list_page, \
                    member=member, repo=repo, \
                    organization=organization, \
                    admin=admin, team=team, team_member=team_member, \
                )

    def render_activities(self, data, organization, repo, team):
        for action, original, timestamp in data:
            if action['type'] == 'push':
                yield render_push_action(action,
                                         organization,
                                         repo=repo,
                                         team=team)
            else:
                #TODO for merge data
                continue
Esempio n. 2
0
class Blob(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member,
            version, path):
        watcher = get_repo_watcher(g.current_user.id, repo.id)
        jagare = get_jagare(repo.id, repo.parent)
        tname = team.name if team else None

        content, content_type, content_length = format_content(jagare,
                                                               repo,
                                                               path,
                                                               version=version)

        return self.render_template(
                    member=member, repo=repo, \
                    organization=organization, \
                    watcher=watcher, file_path=path, \
                    branches=get_branches(repo, jagare), \
                    content=content, \
                    content_length=content_length, \
                    content_type=content_type, \
                    admin=admin, team=team, team_member=team_member, \
                    version=version, \
                    path=render_path(
                            path, version, organization.git, tname, repo.name
                    )
                )
Esempio n. 3
0
class Forks(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        forks = get_repo_forks(repo.id)
        return self.render_template(
                    organization=organization, \
                    member=member, \
                    repo=repo, \
                    forks=self.render_forks(organization, forks, team)
                )

    def render_forks(self, organization, forks, team):
        for fork in forks:
            view_url = get_url(organization,
                               fork,
                               view='repos.view',
                               team=team)
            setattr(fork, 'view', view_url)
            setattr(fork, 'user', get_user(fork.uid))
            yield fork
Esempio n. 4
0
class DeleteFile(MethodView):
    decorators = [
        repo_required(need_write=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self,
            organization,
            member,
            repo,
            admin,
            team,
            team_member,
            version=None,
            path=None):
        if not check_obj_type(repo, path, version, 'blob'):
            raise abort(403)
        error = update_file(
                organization, \
                g.current_user, \
                repo, {path: ''}, \
                version, \
                '%s %s' % (code.REPOS_DELETE_FILE, path)
        )
        if not error:
            path = path.rsplit('/', 1)[0] if '/' in path else None
        return redirect(repo.meta.get_view(version=version, path=path))
Esempio n. 5
0
class Commit(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member,
            version):
        jagare = get_jagare(repo.id, repo.parent)
        error, commits = jagare.get_log(
                repo.get_real_path(), \
                size=1, start=version, \
        )
        if not commits:
            raise abort(404)
        commit = commits[0]
        render_commit(commit, organization, repo)
        commit['diffs'] = split_diff(commit['diff'])
        return self.render_template(
                    member=member, repo=repo, \
                    organization=organization, \
                    admin=admin, team=team, team_member=team_member, \
                    commit=commit, \
                )
Esempio n. 6
0
class Delete(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        delete_repo(organization, repo, team)
        return redirect(url_for('organization.view', git=organization.git))
Esempio n. 7
0
class Watch(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        watcher = get_repo_watcher(g.current_user.id, repo.id)
        if not watcher:
            create_watcher(g.current_user, repo, organization, team=team)
        return redirect(repo.meta.view)
Esempio n. 8
0
class RemoveCommiter(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name')
        user = get_user(name)
        if not user or user.id == repo.uid:
            return redirect(repo.meta.commiter)
        commiter = get_repo_commiter(user.id, repo.id)
        if user and commiter:
            delete_commiter(user, commiter, repo, organization, team)
        return redirect(repo.meta.commiter)
Esempio n. 9
0
class Commiters(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        return self.render_template(
                    member=member, repo=repo, organization=organization, \
                    commiters=self.get_commiters(repo), \
                    admin=admin, team=team, team_member=team_member, \
                )

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name')
        user = get_user(name)
        if not user:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        commiters = self.get_commiters(repo), \
                        error=code.ACCOUNT_NO_SUCH_USER, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        if user.id == repo.uid:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        commiters = self.get_commiters(repo), \
                        error=code.REPOS_COMMITER_EXISTS, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        is_member = get_organization_member(organization.id, user.id)
        if not is_member:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        commiters = self.get_commiters(repo), \
                        error=code.ORGANIZATION_MEMBER_NOT_EXISTS, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        create_commiter(user, repo, organization, team)
        return redirect(repo.meta.commiter)

    def get_commiters(self, repo):
        commiters = get_repo_commiters(repo.id)
        commiters = (get_user(commiter.uid) for commiter in commiters)
        return commiters
Esempio n. 10
0
class Transport(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        return self.render_template(
                    member=member, repo=repo, organization=organization, \
                    admin=admin, team=team, team_member=team_member, \
                )

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name')
        user = get_user(name)
        if not user:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error=code.ACCOUNT_NO_SUCH_USER, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        if user.id == repo.uid:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error=code.REPOS_CANT_TRANSPORT_SELF, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        is_member = get_organization_member(organization.id, user.id)
        if not is_member:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error=code.ORGANIZATION_MEMBER_NOT_EXISTS, \
                        admin=admin, team=team, team_member=team_member, \
                    )

        error = transport_repo(organization, user, repo, team)
        if error:
            return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error=error, \
                        admin=admin, team=team, team_member=team_member, \
                    )
        return redirect(repo.meta.transport)
Esempio n. 11
0
class Fork(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        return self.render_template(
                    organization=organization, \
                    member=member, \
                    repo=repo, \
                )

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name', '')
        summary = request.form.get('summary', '')
        teamname = '' if not team else team.name

        if not check_reponame(name):
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        repo=repo, \
                        error = code.REPOS_NAME_INVALID, \
                    )

        path = os.path.join(teamname, '%s.git' % name)
        fork_repo, error = create_repo(
                name, path, g.current_user, organization, \
                team=team, summary=summary, parent=repo, \
                default=repo.default
        )

        if error:
            return self.render_template(
                        organization=organization, \
                        member=member, \
                        repo=repo, \
                        error = error, \
                    )

        return redirect(get_url(organization, fork_repo))
Esempio n. 12
0
class Watchers(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        watchers = get_repo_watchers(repo.id)
        return self.render_template(
                    member=member, repo=repo, organization=organization, \
                    watchers=self.render_watchers(watchers), \
                    admin=admin, team=team, team_member=team_member, \
                )

    def render_watchers(self, watchers):
        for watcher in watchers:
            setattr(watcher, 'user', get_user(watcher.uid))
            yield watcher
Esempio n. 13
0
class Raw(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member,
            version, path):
        jagare = get_jagare(repo.id, repo.parent)
        repo_path = repo.get_real_path()
        error, res = jagare.cat_file(repo_path, path, version=version)
        if error:
            raise abort(error)
        resp = Response(stream_with_context(res))
        resp.headers['X-Accel-Buffering'] = 'no'
        resp.headers['Cache-Control'] = 'no-cache'
        resp.headers['Content-Type'] = res.headers.get(
            'content-type', 'application/octet-stream')
        return resp
Esempio n. 14
0
class Setting(MethodView):
    decorators = [
        repo_required(admin=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self, organization, member, repo, admin, team, team_member):
        jagare = get_jagare(repo.id, repo.parent)
        branches = jagare.get_branches_names(repo.get_real_path())
        return self.render_template(
                    branches_switch=branches, \
                    member=member, repo=repo, \
                    organization=organization, \
                    admin=admin, team=team, team_member=team_member, \
                )

    def post(self, organization, member, repo, admin, team, team_member):
        name = request.form.get('name')
        default = request.form.get('default')
        params = {}
        if name != repo.name:
            params['name'] = name
        if default != repo.default:
            params['default'] = default
        if params:
            params['team'] = team
            error = update_repo(organization, repo, params)
            if error:
                return self.render_template(
                        member=member, repo=repo, organization=organization, \
                        error = error, \
                        admin=admin, team=team, team_member=team_member, \
                )
        return redirect(get_url(organization, repo, 'repos.setting',
                                team=team))
Esempio n. 15
0
class Commits(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self,
            organization,
            member,
            repo,
            admin,
            team,
            team_member,
            version=None,
            path=None):
        page = request.args.get('p', 1)
        try:
            page = int(page)
        except ValueError:
            raise abort(403)
        version = version or repo.default

        jagare = get_jagare(repo.id, repo.parent)
        error, commits = jagare.get_log(
                repo.get_real_path(), page=page, \
                size=config.COMMITS_PER_PAGE, shortstat=1, \
                start=version, path=path, \
        )
        if not commits:
            raise abort(404)

        list_page = render_commits_page(repo, page, path)
        commits = self.render_commits(jagare,
                                      organization,
                                      repo,
                                      commits,
                                      list_page,
                                      path=path)
        return self.render_template(
                    member=member, repo=repo, \
                    organization=organization, \
                    branches=get_branches(repo, jagare), \
                    error=error, \
                    version=version, \
                    admin=admin, team=team, team_member=team_member, \
                    commits=commits, \
                    path=path, \
                    list_page=list_page, \
                )

    def render_commits(self, jagare, organization, repo, commits, list_page,
                       path):
        pre = None
        for commit in commits:
            render_commit(commit, organization, repo)
            commit['view'] = get_url(organization,
                                     repo,
                                     version=commit['sha'],
                                     path=path)
            if not pre:
                pre = commit
            else:
                commit['pre'] = pre
                pre = commit
            yield commit
Esempio n. 16
0
class View(MethodView):
    decorators = [
        repo_required(),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self,
            organization,
            member,
            repo,
            admin,
            team,
            team_member,
            version=None,
            path=None):
        version = version or repo.default
        file_path = path

        watcher = get_repo_watcher(g.current_user.id, repo.id)
        jagare = get_jagare(repo.id, repo.parent)
        tname = team.name if team else None
        if not check_obj_type(repo, path, version, 'tree'):
            raise abort(403)

        error, tree = jagare.ls_tree(repo.get_real_path(),
                                     path=path,
                                     version=version)
        readme = None
        commit = None
        if not error:
            tree, meta = tree['content'], tree['meta']
            readme, tree = self.render_tree(
                                jagare, \
                                repo, organization, \
                                tree, version, team, \
                            )

            path = render_path(
                        path, version, organization.git, \
                        tname, repo.name
                    )
            commit = self.get_commit_user(meta)
        return self.render_template(
                    member=member, repo=repo, \
                    organization=organization, \
                    watcher=watcher, file_path=file_path, \
                    branches=get_branches(repo, jagare), \
                    tree=tree, error=error, \
                    readme=readme, \
                    version=version, \
                    admin=admin, team=team, team_member=team_member, \
                    path=path, commit=commit, \
                )

    def get_commit_user(self, meta):
        user = Obj()
        commit = Obj()
        user.name = meta['committer']['name']
        user.email = meta['committer']['email']
        user.avatar = None
        commit.message = meta['message']
        commit.user = user
        commit.sha = meta['sha']
        commit.date = meta['committer']['date']
        alias = get_alias_by_email(user.email)
        if alias:
            user = get_user(alias.uid)
            commit.user.name = user.name
            commit.user.avatar = user.avatar(18)
        return commit

    def render_tree(self, jagare, repo, organization, tree, version, team):
        ret = []
        readme = None
        for d in tree:
            data = Obj()
            if d['type'] == 'tree':
                data.url = get_url(organization,
                                   repo,
                                   view='repos.view',
                                   team=team,
                                   version=version,
                                   path=d['path'])
            elif d['type'] == 'blob':
                data.url = get_url(organization,
                                   repo,
                                   view='repos.blob',
                                   team=team,
                                   version=version,
                                   path=d['path'])
                if d['name'].startswith('README.'):
                    readme, content_type, _ = format_content(jagare,
                                                             repo,
                                                             d['path'],
                                                             version=version)
                    if content_type != 'file':
                        readme = None
            elif d['type'] == 'submodule':
                data.url = get_submodule_url(d['submodule'], d['sha'])
                d['name'] = '%s@%s' % (d['name'], d['sha'][:10])
            data.name = d['name']
            data.sha = d['sha']
            data.type = d['type']
            data.ago = format_time(d['commit']['committer']['ts'])
            data.message = d['commit']['message'][:150]
            data.commit = d['commit']['sha']
            data.path = d['path']
            ret.append(data)
        return readme, ret
Esempio n. 17
0
class NewFile(MethodView):
    decorators = [
        repo_required(need_write=True),
        member_required(admin=False),
        login_required('account.login')
    ]

    def get(self,
            organization,
            member,
            repo,
            admin,
            team,
            team_member,
            version=None,
            path=None):
        if not check_obj_type(repo, path, version, 'tree'):
            raise abort(403)
        return self.add(organization, repo, team, version, path)

    def post(self,
             organization,
             member,
             repo,
             admin,
             team,
             team_member,
             version=None,
             path=None):
        if not check_obj_type(repo, path, version, 'tree'):
            raise abort(403)
        filename = request.form.get('filename')
        content = request.form.get('content')
        if not filename or not content:
            return self.add(
                    organization, repo, team, version, path, \
                    filename=filename, content=content, \
                    error_message=code.REPOS_EDIT_WITHOUT_INFO
            )
        new_path = os.path.join(path if path else '', filename)
        data = {new_path: content}
        error = update_file(
                organization, \
                g.current_user, \
                repo, data, \
                version, \
                '%s %s' % (code.REPOS_NEW_FILE, new_path)
        )
        if error:
            return self.add(
                    organization, repo, team, version, path, \
                    filename=filename, content=content, \
                    error_message=code.REPOS_EDIT_FAILED
            )

        return redirect(repo.meta.get_blob(version=version, path=new_path))

    def add(self,
            organization,
            repo,
            team,
            version=None,
            path=None,
            error_message=None,
            content='',
            filename=''):
        watcher = get_repo_watcher(g.current_user.id, repo.id)
        tname = team.name if team else None
        return self.render_template(
                    repo=repo, \
                    organization=organization, \
                    file_path=path, \
                    watcher=watcher, \
                    content=content, \
                    branches=get_branches(repo), \
                    version=version, \
                    filename=filename, \
                    path = render_path(
                                path, version, organization.git, \
                                tname, repo.name
                            ), \
                    error_message=error_message, \
                )