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,