Пример #1
0
def update_gist(user, gist, data, summary, message=code.GIST_UPDATE_COMMIT):
    try:
        update_data = False
        if summary != gist.summary:
            gist.summary = summary
            update_data = True
        if data:
            jagare = get_jagare(gist.id, gist.parent)
            error, ret = jagare.update_file(gist.get_real_path(), data, user,
                                            message)
            if error:
                db.session.rollback()
                return None, error
            logger.info(ret)
            if ret:
                from actions.gists import after_update_gist
                gist.update = datetime.datetime.now()
                update_data = True
                after_update_gist(user, gist, asynchronous=True)
        if update_data:
            db.session.add(gist)
            db.session.commit()
            clear_gist_cache(gist)
        return gist, None
    except Exception, e:
        db.session.rollback()
        logger.exception(e)
        return None, code.UNHANDLE_EXCEPTION
Пример #2
0
 def edit(self,
          organization,
          repo,
          team,
          version=None,
          path=None,
          error_message=None):
     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, _ = format_content(jagare,
                                               repo,
                                               path,
                                               version=version,
                                               render=False)
     return self.render_template(
                 repo=repo, \
                 organization=organization, \
                 file_path=path, \
                 watcher=watcher, \
                 content=content, \
                 content_type=content_type, \
                 branches=get_branches(repo, jagare), \
                 version=version, \
                 path = render_path(
                             path, version, organization.git, \
                             tname, repo.name
                         ), \
                 error_message=error_message, \
             )
Пример #3
0
def update_repo(organization, repo, params):
    try:
        team = params.pop('team')
        name = params.get('name', None)
        default = params.get('default', None)
        old_path = None
        if default:
            jagare = get_jagare(repo.id, repo.parent)
            error, message = jagare.set_default_branch(repo.get_real_path(),
                                                       default)
            if error:
                return message
            repo.default = default
        if name:
            old_path = repo.path
            repo.name = name
            repo.path = '%s.git' % name if not team else '%s/%s.git' % (
                team.name, name)
        if params:
            db.session.add(repo)
            db.session.commit()
            clear_repo_cache(repo, organization, old_path=old_path)
        return None
    except sqlalchemy.exc.IntegrityError, e:
        db.session.rollback()
        if 'Duplicate entry' in e.message:
            return code.REPOS_PATH_EXISTS
        logger.exception(e)
        return code.UNHANDLE_EXCEPTION
Пример #4
0
    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
                    )
                )
Пример #5
0
 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, \
             )
Пример #6
0
def check_obj_type(repo, path, version, t):
    jagare = get_jagare(repo.id, repo.parent)
    error, r = jagare.cat_file(repo.get_real_path(),
                               path=path,
                               version=version,
                               only_type=1)
    if error or r.json()['data']['type'] != t:
        return False
    return True
Пример #7
0
 def get(self, organization, member, gist, path):
     jagare = get_jagare(gist.id, gist.parent)
     error, res = jagare.cat_file(gist.get_real_path(), path)
     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
Пример #8
0
 def get(self, organization, member, gist):
     jagare = get_jagare(gist.id, gist.parent)
     error, tree = jagare.ls_tree(gist.get_real_path())
     if not error:
         tree, meta = tree['content'], tree['meta']
         tree = render_tree(jagare, tree, gist, organization, False)
     return self.render_template(
                 organization=organization, \
                 member=member, \
                 error=error, \
                 tree=tree, \
                 gist=gist, \
             )
Пример #9
0
 def post(self, organization, member, gist):
     summary = request.form.get('summary')
     filenames = request.form.getlist('filename')
     codes = request.form.getlist('code')
     data = {}
     if len(filenames) != len(codes):
         raise abort(400)
     for filename, content in zip(filenames, codes):
         if not filename and not content:
             continue
         if not filename or not content:
             return self.render_template(
                         organization=organization, \
                         member=member, \
                         error=code.GIST_WITHOUT_FILENAME if not filename else code.GIST_WITHOUT_CONTENT, \
                         tree=self.gen_tree(filenames, codes), \
                         gist=gist,
                     )
         if data.get(filename):
             return self.render_template(
                         organization=organization, \
                         member=member, \
                         error=code.GIST_FILENAME_EXISTS, \
                         tree=self.gen_tree(filenames, codes), \
                         gist=gist,
                     )
         data[filename] = content
     jagare = get_jagare(gist.id, gist.parent)
     error, tree = jagare.ls_tree(gist.get_real_path())
     if error:
         return self.render_template(
                     organization=organization, \
                     member=member, \
                     error=code.REPOS_LS_TREE_FAILED, \
                     tree=self.gen_tree(filenames, codes), \
                     gist=gist,
                 )
     data = self.diff(tree, data)
     _, error = update_gist(g.current_user, gist, data, summary)
     if error:
         return self.render_template(
                     organization=organization, \
                     member=member, \
                     error=code.GIST_UPDATE_FAILED, \
                     tree=self.gen_tree(filenames, codes), \
                     gist=gist,
                 )
     return redirect(gist.meta.view)
Пример #10
0
    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, \
                )
Пример #11
0
 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, \
             )
Пример #12
0
    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, \
                )
Пример #13
0
 def get(self, organization, member, gist, version='master'):
     jagare = get_jagare(gist.id, gist.parent)
     error, tree = jagare.ls_tree(gist.get_real_path(), version=version)
     if not error:
         tree, meta = tree['content'], tree['meta']
         tree = render_tree(jagare,
                            tree,
                            gist,
                            organization,
                            version=version)
     watcher = get_gist_watcher(g.current_user.id, gist.id)
     return self.render_template(
                 organization=organization, \
                 member=member, \
                 error=error, \
                 tree=tree, \
                 gist=gist, \
                 watcher=watcher, \
             )
Пример #14
0
 def get(self, organization, member, gist):
     page = request.args.get('p', 1)
     try:
         page = int(page)
     except ValueError:
         raise abort(403)
     jagare = get_jagare(gist.id, gist.parent)
     error, revisions = jagare.get_log(gist.get_real_path(), page=page, size=config.REVISIONS_PER_PAGE)
     if not revisions:
         raise abort(404)
     list_page = render_revisions_page(gist, page)
     revisions = self.render_revisions(organization, gist, revisions, list_page)
     return self.render_template(
                 organization=organization, \
                 member=member, \
                 error=error, \
                 revisions=revisions, \
                 gist=gist, \
                 list_page=list_page, \
             )
Пример #15
0
def update_file(organization, user, repo, data, version, message):
    jagare = get_jagare(repo.id, repo.parent)
    error, ret = jagare.update_file(
            repo.get_real_path(), \
            data, user, \
            message=message, \
            branch=version, \
            parent=version, \
    )
    if error:
        logger.info(ret)
        return error
    from actions.repos import after_push_repo
    repo.update = datetime.datetime.now()
    db.session.add(repo)
    db.session.commit()
    clear_repo_cache(repo, organization)
    after_push_repo(user,
                    repo,
                    start='refs/heads/%s' % version,
                    asynchronous=True)
Пример #16
0
def after_push_repo(user, repo, start='refs/heads/master', asynchronous=False):
    refs_keys = REFS_KEYS.format(rid=repo.id)
    head_key = HEAD_COMMIT_KEY.format(rid=repo.id, start=start)
    last_key = LAST_COMMIT_KEY.format(rid=repo.id, start=start)

    head = rdb.get(head_key)
    last = rdb.get(last_key)

    # Get new commits from last commit
    jagare = get_jagare(repo.id, repo.parent)
    err, logs = jagare.get_log(repo.get_real_path(), start, head, shortstat=1) or \
                jagare.get_log(repo.get_real_path(), start, last, shortstat=1) or \
                jagare.get_log(repo.get_real_path(), start, None, shortstat=1)
    if err:
        logger.exception(err)
        return
    if not logs:
        return

    commit_time = time.mktime(repo.update.timetuple())
    data = {
        'type':'push', \
        'repo_id': repo.id, \
        'committer_id': user.id, \
        'commits_num': len(logs), \
        'commit_time': commit_time, \
        'branch': start, \
    }
    data['data'] = logs[:PUSH_COMMITS_LIMIT]
    rdb.set(head_key, logs[0]['sha'])
    rdb.set(last_key, logs[-1]['sha'])
    rdb.sadd(refs_keys, head_key)
    rdb.sadd(refs_keys, last_key)
    data = msgpack.dumps(data)
    for activities in get_activities(repo=repo):
        if not asynchronous:
            activities.add(data, commit_time)
            continue
        t = threading.Thread(target=activities.add, args=(data, commit_time))
        t.start()
Пример #17
0
def delete_gist(user, gist, organization):
    try:
        keys = []
        db.session.delete(gist)
        organization.gists = Organization.gists - 1
        db.session.add(organization)
        user_gist = get_user_gist(organization.id, user.id)
        user_gist.count = UserGists.count - 1
        db.session.add(user_gist)
        watchers = get_gist_watchers(gist.id)
        keys.append('gists:watchers:{gid}'.format(gid=gist.id))
        for watcher in watchers:
            db.session.delete(watcher)
            keys.append('gists:watcher:{uid}:{gid}'.format(uid=watcher.uid,
                                                           gid=gist.id))
            keys.append('user:watch:gists:{uid}:{oid}'.format(
                uid=watcher.uid, oid=organization.id))
        jagare = get_jagare(gist.id, gist.parent)
        ret, error = jagare.delete(gist.get_real_path())
        if not ret:
            db.session.rollback()
            return error
        if gist.parent > 0:
            parent_gist = get_gist(gist.parent)
            parent_gist.forks = Gists.forks - 1
            db.session.add(parent_gist)
        db.session.commit()
        clear_gist_cache(gist, organization)
        if gist.parent > 0:
            clear_gist_cache(parent_gist)
        clear_explore_cache(gist, user, organization)
        from actions.gists import after_delete_gist
        after_delete_gist(gist, asynchronous=True)
        backend.delete_many(*keys)
        return None
    except Exception, e:
        db.session.rollback()
        logger.exception(e)
        return code.UNHANDLE_EXCEPTION
Пример #18
0
def after_update_gist(user, gist, asynchronous=False, method='update'):
    head_key = HEAD_COMMIT_KEY.format(gid=gist.id)
    last_key = LAST_COMMIT_KEY.format(gid=gist.id)

    head = rdb.get(head_key)
    last = rdb.get(last_key)

    # Get new commits from last commit
    jagare = get_jagare(gist.id, gist.parent)
    err, logs = jagare.get_log(gist.get_real_path(), head, shortstat=1) or \
                jagare.get_log(gist.get_real_path(), last, shortstat=1) or \
                jagare.get_log(gist.get_real_path(), None, shortstat=1)
    if err:
        logger.exception(err)
        return
    if not logs:
        return

    commit_time = time.mktime(gist.update.timetuple())
    data = {
        'type':'gist', \
        'method': method, \
        'gist_id': gist.id, \
        'committer_id': user.id, \
        'commits_num': len(logs), \
        'commit_time': commit_time, \
    }
    rdb.set(head_key, logs[0]['sha'])
    rdb.set(last_key, logs[-1]['sha'])
    data['data'] = logs
    data = msgpack.dumps(data)
    for activities in get_activities(gist=gist):
        if not asynchronous:
            activities.add(data, commit_time)
            continue
        t = threading.Thread(target=activities.add, args=(data, commit_time))
        t.start()
Пример #19
0
def create_gist(organization,
                user,
                summary,
                data={},
                parent=None,
                private=None,
                watchers=0,
                message=code.GIST_CREATE_COMMIT):
    try:
        gist = Gists(summary,
                     organization.id,
                     user.id,
                     parent=parent,
                     private=private,
                     watchers=watchers)
        db.session.add(gist)
        organization.gists = Organization.gists + 1
        db.session.add(organization)
        user_gist = get_user_gist(organization.id, user.id)
        if not user_gist:
            user_gist = UserGists(organization.id, user.id, 1)
        else:
            user_gist.count = UserGists.count + 1
        db.session.add(user_gist)
        db.session.flush()
        gist.path = os.path.join('gist', '%s.git' % (private or gist.id))
        watcher = GistWatchers(user.id, gist.id, organization.id)
        db.session.add(watcher)
        jagare = get_jagare(gist.id, parent.id if parent else 0)

        if not parent:
            # Deal with new gist
            if not data:
                db.session.rollback()
                return None, code.GIST_WITHOUT_CONTENT
            ret, error = jagare.init(gist.get_real_path())
            if not ret:
                db.session.rollback()
                return None, error
            error, ret = jagare.update_file(gist.get_real_path(), data, user,
                                            message)
            if error:
                db.session.rollback()
                return None, error
        else:
            ret, error = jagare.clone(gist.get_real_path(),
                                      parent.get_real_path())
            if error:
                db.session.rollback()
                return None, error
            parent.forks = Gists.forks + 1
            db.session.add(parent)
        db.session.commit()
        clear_gist_cache(gist, organization)
        if parent:
            clear_gist_cache(parent)
        clear_user_gist_cache(user, organization)
        clear_explore_cache(gist, user, organization)
        clear_watcher_cache(user, gist, organization)
        from actions.gists import after_update_gist
        after_update_gist(user, gist, asynchronous=True, method='create')
        return gist, None
    except sqlalchemy.exc.IntegrityError, e:
        db.session.rollback()
        if 'Duplicate entry' in e.message:
            return None, code.REPOS_PATH_EXISTS
        logger.exception(e)
        return None, code.UNHANDLE_EXCEPTION
Пример #20
0
def get_branches(repo, jagare=None):
    if not jagare:
        jagare = get_jagare(repo.id, repo.parent)
    return jagare.get_branches_names(repo.get_real_path())
Пример #21
0
def create_repo(name,
                path,
                user,
                organization,
                team=None,
                summary='',
                parent=None,
                default='master'):
    try:
        tid = team.id if team else 0
        oid = organization.id
        uid = user.id
        repo = Repos(name,
                     path,
                     oid,
                     uid,
                     tid,
                     summary,
                     parent,
                     commiters=1,
                     watchers=1,
                     default=default)
        db.session.add(repo)
        organization.repos = Organization.repos + 1
        db.session.add(organization)
        if team:
            team.repos = Team.repos + 1
            db.session.add(team)
        db.session.flush()
        if not check_repos_limit(organization):
            db.session.rollback()
            return None, code.ORGANIZATION_REPOS_LIMIT
        commiter = Commiters(user.id, repo.id)
        db.session.add(commiter)
        watcher = Watchers(user.id, repo.id, organization.id)
        db.session.add(watcher)
        jagare = get_jagare(repo.id, parent)
        if not parent:
            ret, error = jagare.init(repo.get_real_path())
            if not ret:
                db.session.rollback()
                return None, error
        else:
            ret, error = jagare.clone(repo.get_real_path(),
                                      parent.get_real_path())
            if error:
                db.session.rollback()
                return None, error
            parent.forks = Repos.forks + 1
            db.session.add(parent)
        db.session.commit()
        clear_repo_cache(repo, organization, team)
        if parent:
            clear_repo_cache(parent, organization, need=False)
        clear_explore_cache(organization, repo.uid, team)
        clear_commiter_cache(user, repo)
        clear_watcher_cache(user, repo, organization, team)
        return repo, None
    except sqlalchemy.exc.IntegrityError, e:
        db.session.rollback()
        if 'Duplicate entry' in e.message:
            return None, code.REPOS_PATH_EXISTS
        logger.exception(e)
        return None, code.UNHANDLE_EXCEPTION
Пример #22
0
 def count_revisions(gid):
     jagare = get_jagare(gist.id, gist.parent)
     error, ret = jagare.get_log(gist.get_real_path(), total=1)
     count = 0 if error else ret['total']
     return count
Пример #23
0
 def count_commits(gid, path):
     jagare = get_jagare(repo.id, repo.parent)
     error, ret = jagare.get_log(repo.get_real_path(), total=1, path=path)
     count = 0 if error else ret['total']
     return count