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
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 ) )
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
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))
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, \ )
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))
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)
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)
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
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)
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))
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
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
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))
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
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
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, \ )