def browse(self, repository, *args, **kwargs): if not repository: return O.error(msg="No repo selected") args = list([a for a in args if a]) full_path = "/".join(args) name = '/' if args: args.insert(0, '') name = "/".join(args) if not name.endswith('/'): name = name + "/" parent, _, __ = name.rstrip("/").rpartition("/") if parent: parent = parent + "/" else: parent = None repo = Repository.visible(request).filter( Repository.name == repository).first() if not repo: return O.error(msg="Repo not found") if repo.linked: parent_repo = repo repo = repo.linked repository = repo.name root_folder = request.db.query(Folder).filter( Folder.full_name == name, Folder.repository == repo).one() else: root_folder = Folder.visible( request, repository, parent=parent).filter( Folder.full_name == name).one() def order(lst): return [r.version for r in sorted([item for item in lst], key=lambda x: x.created_at, reverse=True) if not r.draft][-20:] # last 20 versions def rev(lst): revs = [r.version for r in sorted([item for item in lst], key=lambda x: x.created_at, reverse=True) if not r.draft] if revs: return revs[0] else: return None rels = [('owner.username', 'owner'), ('history', 'version', rev)] show_versions = (bool(kwargs.get('show_versions')) and not kwargs.get('show_versions') in ['0', 'false', 'False']) if show_versions: rels.append(('history', 'versions', order)) if repo.type == 'cloudrunner': subfolders = Folder.visible( request, repository, parent=name).all() scripts = request.db.query(Script).join(Folder).join(Revision) scripts = scripts.filter( Script.folder == root_folder, Folder.full_name == name).all() folders = [f.serialize( skip=['repository_id', 'parent_id', 'owner_id'], rel=[('owner.username', 'owner')], editable=lambda f: repo.editable(request)) for f in subfolders] scripts = sorted([s.serialize( skip=['folder_id', 'owner_id'], rel=rels, editable=lambda s: repo.editable(request)) for s in scripts], key=lambda s: (s['mime_type'], s['name'])) return O.contents(folders=folders, scripts=scripts, editable=repo.editable(request), owner=root_folder.owner.username) else: # External repo plugin = PluginRepoBase.find(repo.type) if not plugin: return O.error(msg="Plugin for repo type %s not found!" % repo.type) plugin = plugin(parent_repo.credentials.auth_user, parent_repo.credentials.auth_pass, parent_repo.credentials.auth_args) subfolders, scripts = [], [] try: contents, last_modified, etag = plugin.browse( repository, name, last_modified=root_folder.etag) if not contents: return O.error(msg="Cannot browse %s repo" % repo.type) root_folder.created_at = last_modified root_folder.etag = etag subfolders = root_folder.subfolders scripts = list(request.db.query(Script).join(Folder).filter( Script.folder == root_folder, Folder.full_name == name).all()) to_add = copy(contents['folders']) for _folder in subfolders: if not filter(lambda f: f['name'] == _folder.name, contents['folders']): if not _folder.name == "/": request.db.delete(_folder) else: to_add = [f for f in to_add if _folder.name != f['name']] for new_f in to_add: new_folder = Folder( name=new_f['name'], owner=repo.owner, parent=root_folder, repository=repo, created_at=NULL, full_name=path.join(root_folder.full_name, new_f['name']) + "/") request.db.add(new_folder) to_add = copy(contents['scripts']) for _script in scripts: if not filter(lambda s: s['name'] == _script.name, contents['scripts']): request.db.delete(_script) else: to_add = [s for s in to_add if _script.name != s['name']] for new_s in to_add: mime = "text/plain" new_script = Script(name=new_s['name'], folder=root_folder, mime_type=mime, owner=repo.owner, created_at=NULL) scripts.append(new_script) try: cont, last_modified, rev, etag = plugin.contents( repo.name, path.join(full_path, new_script.name)) rev = Revision(created_at=last_modified, version=rev, script=new_script, content=cont) try: if is_script(cont): new_script.mime_type = 'text/script' else: new_script.mime_type = 'text/plain' except: pass new_script.created_at = last_modified new_script.etag = etag request.db.add(rev) except Exception, ex: LOG.exception(ex) request.db.add(new_script) request.db.add(root_folder) except NotAccessible: return O.error(msg="Cannot connect to %s API" % plugin.type)
folders = [f.serialize( skip=['repository_id', 'parent_id', 'owner_id'], rel=[('owner.username', 'owner', lambda *args: repo.type), ('created_at', 'created_at', created_at_eval)], editable=lambda s: False) for f in subfolders] rels[0] = ('owner.username', 'owner', lambda *args: repo.type) scripts = sorted([s.serialize(skip=['folder_id', 'owner_id'], rel=rels, editable=lambda s: False) for s in scripts], key=lambda s: (s['mime_type'], s['name'])) contents = dict(folders=folders, scripts=scripts) return O.contents(owner=request.user.username, editable=repo.editable(request), **contents) @expose('json') @wrap_command(Script) def revisions(self, repository, *args, **kwargs): path = "/".join(args) path.rstrip("/") if not path.startswith("/"): path = "/" + path path, _, script = path.rpartition('/') path = path + '/' scr = Script.visible(request, repository,