def all_refs(split=False, git=git): """Return a tuple of (local branches, remote branches, tags).""" local_branches = [] remote_branches = [] tags = [] triple = lambda x, y: (x, len(x) + 1, y) query = (triple('refs/tags', tags), triple('refs/heads', local_branches), triple('refs/remotes', remote_branches)) cmdout = core.decode(git.for_each_ref(format='%(refname)')) for ref in cmdout.splitlines(): for prefix, prefix_len, dst in query: if ref.startswith(prefix) and not ref.endswith('/HEAD'): dst.append(ref[prefix_len:]) continue if split: return local_branches, remote_branches, tags else: return local_branches + remote_branches + tags
def for_each_ref_basename(refs, git=git): """Return refs starting with 'refs'.""" git_output = git.for_each_ref(refs, format='%(refname)') output = core.decode(git_output).splitlines() non_heads = filter(lambda x: not x.endswith('/HEAD'), output) return map(lambda x: x[len(refs) + 1:], non_heads)