Beispiel #1
0
def rev_list(repository, to_ref, from_ref=None, path=None, skip=0,
             max_count=0, author=None, query=None, first_parent=None):

    if repository.is_empty:
        return []

    commits_index_list = []
    commits_dict = {}
    # TODO: use _resolve_version
    to_commit = repository.revparse_single(to_ref)

    walk_order = GIT_SORT_TOPOLOGICAL if first_parent else GIT_SORT_TIME
    if to_commit.type == GIT_OBJ_TAG:
        to_commit = repository[to_commit.target]
    next_commit = None
    walker = repository.walk(to_commit.oid, walk_order)
    if from_ref:
        try:
            from_commit = repository.revparse_single(from_ref)
            if from_commit.type == GIT_OBJ_TAG:
                from_commit = repository[from_commit.target]
            walker.hide(from_commit.oid)
        except (KeyError, ValueError):
            from_commit = None

    if max_count:
        length = max_count + skip if skip else max_count
    else:
        length = 0
    for c in walker:
        if all([_check_author(c, author),
                _check_file_change(c, path),
                _check_message(c, query)]):
            index = c.hex
            if first_parent:
                if next_commit and next_commit.hex != c.hex:
                    continue
                if len(c.parents) == 0:
                    next_commit = None
                elif len(c.parents) >= 1:
                    next_commit = c.parents[0]
                else:
                    continue
            if index not in commits_index_list:
                commits_index_list.append(index)
            commits_dict[index] = c
        if length and len(commits_index_list) >= length:
            break
    if skip:
        commits_index_list = commits_index_list[skip:]
    return [format_commit(i, commits_dict[i], repository)
            for i in commits_index_list]
Beispiel #2
0
    def show(self, ref):
        try:
            obj = self.repository.revparse_single(ref)
        except KeyError:
            return {}
        obj_type = obj.type

        if obj_type == GIT_OBJ_COMMIT:
            return format_commit(ref, obj, self.repository)
        elif obj_type == GIT_OBJ_TAG:
            return format_tag(ref, obj, self.repository)
        elif obj_type == GIT_OBJ_TREE:
            return format_tree(ref, obj, self.repository)
        elif obj_type == GIT_OBJ_BLOB:
            return format_blob(ref, obj, self.repository)
Beispiel #3
0
def _format_with_last_commit(repository, ret_tree, to_commit):
    walker = repository.walk(to_commit.oid, GIT_SORT_TOPOLOGICAL)
    paths = [k for k, v in ret_tree.iteritems()]
    ret = {}

    for commit in walker:
        spawns = [gevent.spawn(_calc_is_changed, commit, path, ret) for path in paths]
        gevent.joinall(spawns)
        if not ret:
            continue
        fc = format_commit(commit.hex, commit, None)
        for path, r in ret.iteritems():
            ret_tree[path]['commit'] = fc
            paths.remove(path)
        if not paths:
            break
        ret = {}