def delete_branch(self, path, name): try: repo = Jagare(path) repo.delete_branch(name) return True except Exception as e: raise ServiceUnavailable(repr(e))
class Repo(object): provided_features = [] def __init__(self, path): self.type = "repo" self.path = path self.repo = Jagare(self.path) def provide(self, name): '''检查是否提供某功能,即是否提供某接口''' return name in self.provided_features @property def is_empty(self): return self.repo.empty @property def default_branch(self): branch = None head = self.repo.head if head: branch = head.name.rpartition('/')[-1] return branch def update_default_branch(self, name): branches = self.repo.branches if name not in branches: return None self.repo.update_head(name) def clone(self, path, bare=None, branch=None, mirror=None, env=None): self.repo.clone(path, bare=bare, branch=branch, mirror=mirror, env=env) def archive(self, name): content = self.repo.archive(name) outbuffer = StringIO() zipfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=outbuffer) zipfile.writelines(content) zipfile.close() out = outbuffer.getvalue() return out def get_submodule(self, ref, path): path = path.strip() gitmodules = self.repo.show("%s:%s" % (ref, '.gitmodules')) if not gitmodules: return None submodules_lines = gitmodules["data"].split('\n') modules_str = '\n'.join([line.strip() for line in submodules_lines]) config = ConfigParser.RawConfigParser() config.readfp(StringIO(modules_str)) for section in config.sections(): if config.has_option(section, 'path') and config.get( section, 'path') == path: url = config.get(section, 'url') return Submodule(url, path) return None def get_file(self, ref, path): blob = self.repo.show("%s:%s" % (ref, path)) if not blob: return None if blob['type'] != 'blob': return None # TODO: validate blob return Blob(self, blob) def get_file_by_lines(self, ref, path): blob = self.get_file(ref, path) # TODO: blob.size < xxx if not blob or blob.binary: return None if not blob.data: return [] src = blob.data return src.splitlines() def get_file_n_lines(self, ref, path): lines = self.get_file_by_lines(ref, path) if lines: return len(lines) return 0 def get_commits(self, *w, **kw): commits = self.repo.rev_list(*w, **kw) # TODO: validate commits return [Commit(self, commit) for commit in commits] def get_raw_diff(self, ref, from_ref=None, **kw): ''' get Jagare formated diff dict ''' return self.repo.diff(ref, from_ref=from_ref, **kw) def get_diff(self, ref=None, from_ref=None, linecomments=[], raw_diff=None, **kw): ''' get ngit wrapped diff object ''' _raw_diff = None if raw_diff: _raw_diff = raw_diff elif ref: _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) if _raw_diff: return Diff(self, _raw_diff, linecomments) else: return None def get_diff_length(self, ref, from_ref=None, **kw): _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) return len(_raw_diff['patches']) if _raw_diff else 0 def get_last_commit(self, ref, path=None): if not path: return self.get_commit(ref) commit = self.repo.rev_list(ref, path=path, max_count=1) if not commit: return None commit = commit[0] commit = Commit(self, commit) return commit def get_commit(self, ref): sha = self.repo.resolve_commit(ref) if not sha: return None commit = self.repo.show(sha) if not commit: return None # TODO: validate commit return Commit(self, commit) def delete_branch(self, name): self.repo.delete_branch(name) def get_path_by_ref(self, ref): ''' get blob or tree ''' path = self.repo.show(ref) if not path: return None if path['type'] == 'tree': path = Tree(self, path['entries']) elif path['type'] == 'blob': path = Blob(self, path) else: path = None return path def get_path(self, ref, path): _item = self.repo.show("%s:%s" % (ref, path)) if not _item: return None if _item['type'] == 'tree': item = Tree(self, _item['entries']) elif _item['type'] == 'blob': item = Blob(self, _item) else: item = None return item
class Repo(object): provided_features = [] def __init__(self, path): self.type = "repo" self.path = path self.repo = Jagare(self.path) def provide(self, name): '''检查是否提供某功能,即是否提供某接口''' return name in self.provided_features @property def is_empty(self): return self.repo.empty @property def default_branch(self): branch = None head = self.repo.head if head: branch = head.name.rpartition('/')[-1] return branch def update_default_branch(self, name): branches = self.repo.branches if name not in branches: return None self.repo.update_head(name) def clone(self, path, bare=None, branch=None, mirror=None, env=None): self.repo.clone(path, bare=bare, branch=branch, mirror=mirror, env=env) def archive(self, name): content = self.repo.archive(name) outbuffer = StringIO() zipfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=outbuffer) zipfile.writelines(content) zipfile.close() out = outbuffer.getvalue() return out def get_submodule(self, ref, path): path = path.strip() gitmodules = self.repo.show("%s:%s" % (ref, '.gitmodules')) if not gitmodules: return None submodules_lines = gitmodules["data"].split('\n') modules_str = '\n'.join([line.strip() for line in submodules_lines]) config = ConfigParser.RawConfigParser() config.readfp(StringIO(modules_str)) for section in config.sections(): if config.has_option(section, 'path') and config.get(section, 'path')==path: url = config.get(section, 'url') return Submodule(url, path) return None def get_file(self, ref, path): blob = self.repo.show("%s:%s" % (ref, path)) if not blob: return None if blob['type'] != 'blob': return None # TODO: validate blob return Blob(self, blob) def get_file_by_lines(self, ref, path): blob = self.get_file(ref, path) # TODO: blob.size < xxx if not blob or blob.binary: return None if not blob.data: return [] src = blob.data return src.splitlines() def get_file_n_lines(self, ref, path): lines = self.get_file_by_lines(ref, path) if lines: return len(lines) return 0 def get_commits(self, *w, **kw): commits = self.repo.rev_list(*w, **kw) # TODO: validate commits return [Commit(self, commit) for commit in commits] def get_raw_diff(self, ref, from_ref=None, **kw): ''' get Jagare formated diff dict ''' return self.repo.diff(ref, from_ref=from_ref, **kw) def get_diff(self, ref=None, from_ref=None, linecomments=[], raw_diff=None, **kw): ''' get ngit wrapped diff object ''' _raw_diff = None if raw_diff: _raw_diff = raw_diff elif ref: _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) if _raw_diff: return Diff(self, _raw_diff, linecomments) else: return None def get_diff_length(self, ref, from_ref=None, **kw): _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) return len(_raw_diff['patches']) if _raw_diff else 0 def get_last_commit(self, ref, path=None): if not path: return self.get_commit(ref) commit = self.repo.rev_list(ref, path=path, max_count=1) if not commit: return None commit = commit[0] commit = Commit(self, commit) return commit def get_commit(self, ref): sha = self.repo.resolve_commit(ref) if not sha: return None commit = self.repo.show(sha) if not commit: return None # TODO: validate commit return Commit(self, commit) def delete_branch(self, name): self.repo.delete_branch(name) def get_path_by_ref(self, ref): ''' get blob or tree ''' path = self.repo.show(ref) if not path: return None if path['type'] == 'tree': path = Tree(self, path['entries']) elif path['type'] == 'blob': path = Blob(self, path) else: path = None return path def get_path(self, ref, path): _item = self.repo.show("%s:%s" % (ref, path)) if not _item: return None if _item['type'] == 'tree': item = Tree(self, _item['entries']) elif _item['type'] == 'blob': item = Blob(self, _item) else: item = None return item
class Repo(object): provided_features = [] def __init__(self, path): self.type = "repo" self.path = path self.repo = Jagare(self.path) def provide(self, name): '''检查是否提供某功能,即是否提供某接口''' return name in self.provided_features @property def empty(self): return self.is_empty @property def is_empty(self): return self.repo.empty @property def default_branch(self): branch = '' head = self.repo.head if head: branch = head.name[REFS_HEADS_PREFIX_LENGTH:] return branch def update_default_branch(self, name): branches = self.repo.branches if name not in branches: return None self.repo.update_head(name) def clone(self, path, bare=None, branch=None, mirror=None, env=None, shared=None): self.repo.clone(path, bare=bare, branch=branch, mirror=mirror, env=env) # shared=shared) why? def archive(self, name, ref='master', ext='tar.gz'): content = self.repo.archive(name, ref=ref) if ext == 'tar': return content outbuffer = StringIO() zipfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=outbuffer) zipfile.write(content) zipfile.close() out = outbuffer.getvalue() return out def get_submodule(self, ref, path): path = path.strip() gitmodules = self.repo.show("%s:%s" % (ref, '.gitmodules')) if not gitmodules: return None submodules_lines = gitmodules["data"].split('\n') modules_str = '\n'.join([line.strip() for line in submodules_lines]) config = ConfigParser.RawConfigParser() config.readfp(StringIO(modules_str)) for section in config.sections(): if config.has_option(section, 'path') and config.get( section, 'path') == path: url = config.get(section, 'url') return Submodule(url, path) return None def get_file(self, ref, path): blob = self.repo.show("%s:%s" % (ref, path)) if not blob: return None if blob['type'] != 'blob': return None # TODO: validate blob return Blob(self, blob) def get_file_by_lines(self, ref, path): blob = self.get_file(ref, path) # TODO: blob.size < xxx if not blob or blob.binary: return None if not blob.data: return [] src = blob.data return src.splitlines() def get_file_n_lines(self, ref, path): lines = self.get_file_by_lines(ref, path) if lines: return len(lines) return 0 def get_commits(self, to_ref, from_ref=None, path=None, skip=0, max_count=0, author=None, query=None, first_parent=None, since=0, no_merges=None): commits = self.repo.rev_list(to_ref=to_ref, from_ref=from_ref, path=path, skip=skip, max_count=max_count, author=author, query=query, first_parent=first_parent, since=since, no_merges=no_merges) return [Commit(self, commit) for commit in commits] def get_raw_diff(self, ref, from_ref=None, paths=None, **kw): ''' get Jagare formated diff dict ''' try: diff = self.repo.diff(ref, from_ref=from_ref, paths=paths, **kw) except KeyError: return None return diff def get_diff(self, ref=None, from_ref=None, linecomments=[], raw_diff=None, paths=None, **kw): ''' get ngit wrapped diff object ''' _raw_diff = None if raw_diff: _raw_diff = raw_diff elif ref: _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, paths=paths, **kw) if _raw_diff: return Diff(self, _raw_diff, linecomments) else: return None def get_diff_length(self, ref, from_ref=None, **kw): _raw_diff = self.get_raw_diff(ref, from_ref=from_ref, **kw) return len(_raw_diff['patches']) if _raw_diff else 0 def get_last_commit(self, ref, path=None, no_merges=False): if not path: return self.get_commit(ref) commit = self.repo.rev_list(ref, path=path, max_count=1, no_merges=no_merges) if not commit: return None commit = commit[0] commit = Commit(self, commit) return commit def get_previours_commit(self, ref, path): """previours commit that touch the specified path""" commits = self.repo.rev_list(ref, path=path, max_count=2, no_merges=True) for commit in commits: if commit['sha'] != self.repo.sha(ref): return Commit(self, commit) return None def get_commit(self, ref): sha = self.repo.resolve_commit(ref) if not sha: return None commit = self.repo.show(sha) if not commit: return None # TODO: validate commit return Commit(self, commit) def delete_branch(self, name): self.repo.delete_branch(name) def get_path_by_ref(self, ref): ''' get blob or tree ''' path = self.repo.show(ref) if not path: return None if path['type'] == 'tree': path = Tree(self, path['entries']) elif path['type'] == 'blob': path = Blob(self, path) else: path = None return path def get_path(self, ref, path): _item = self.repo.show("%s:%s" % (ref, path)) if not _item: return None if _item['type'] == 'tree': item = Tree(self, _item['entries']) elif _item['type'] == 'blob': item = Blob(self, _item) else: item = None return item def get_last_update_timestamp(self): commit = self.get_last_commit('HEAD') if not commit: return 0 return int(commit.author_timestamp)