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]
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)
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 = {}