def cmd_rev_parse(args): if args.type: fmt = args.type.encode() repo = repo_find() print(object_find(repo, args.name, args.type, follow=True))
def cmd_tag(args): repo = repo_find() if args.name: tag_create(args.name, args.object, type="object" if args.create_tag_object else "ref") else: refs = ref_list(repo) show_ref(repo, refs["tags"], with_hash=False)
def cmd_ls_tree(args): repo = repo_find() obj = object_read(repo, object_find(repo, args.object, fmt=b'tree')) for item in obj.items: print("{0} {1} {2}\t{3}".format( "0" * (6 - len(item.mode)) + item.mode.decode("ascii"), # Git's ls-tree displays the type # of the object pointed to. We can do that too :) object_read(repo, item.sha).fmt.decode("ascii"), item.sha, item.path.decode("ascii")))
def ref_list(repo, path=None): if not path: path = repo_find(repo, "refs") ret = collections.OrderedDict() for f in sorted(os.listdir(path)): can = os.path.join(path, f) if os.path.isdir(can): ret[f] = ref_list(repo, can) else: ret[f] = ref_resolve(repo, can) return ret
def cmd_checkout(args): repo = repo_find() obj = object_read(repo, object_find(repo, args.commit)) if obj.fmt == b'commit': obj = object_read(repo, obj.kvlm[b'tree'].decode('ascii')) if os.path.exists(args.path): if not os.path.isdir(args.path): raise Exception(f"Not a directory {args.path}!") if os.listdir(args.path): raise Exception(f"Not empty {args.path}!") else: os.makedirs(args.path) tree_checkout(repo, obj, os.path.realpath(args.path).encode())
def cmd_log(args): repo = repo_find() print("digraph wyaglog{") log_graphviz(repo, object_find(repo, args.commit), set()) print("}")
def cmd_cat_file(args): repo = repo_find() cat_file(repo, args.object, fmt=args.type.encode())
def cmd_show_ref(args): repo = repo_find() refs = ref_list(repo) show_ref(repo, refs, prefix="refs")