X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=t%2Fsubtree-hash;h=1ca9e869c84a0dab1e5ce1ee647cb391170b9947;hb=a74f980a79911b14bc5572921f6c9ff94990fc2e;hp=45e727c8bf2f51e5835737a5d186e2fdf5e9da21;hpb=e728ed013e15f76b96c10e0228c195fed184696d;p=bup.git diff --git a/t/subtree-hash b/t/subtree-hash index 45e727c..1ca9e86 100755 --- a/t/subtree-hash +++ b/t/subtree-hash @@ -1,31 +1,56 @@ -#!/usr/bin/env bash - -set -eo pipefail - -# Usage: subtree-hash ROOT_HASH [SUBDIR ...] - -subtree_hash() -{ - root_hash="$1" - if test "$#" -eq 1; then - echo $root_hash - else - subdir="$2" - subtree_info="$(git ls-tree "$root_hash" | grep -E " $subdir\$")" || true - if test "$(echo "$subtree_info" | wc -l)" -ne 1; then - echo "Found more than one matching line in subtree $root_hash" 1>&2 - return 1 - fi - - subtree_hash="$(echo "$subtree_info" | cut -d' ' -f 3 | cut -d$'\t' -f 1)" || true - if test -z "$subtree_hash"; then - echo "Unable to find subtree hash in git output: $subtree_info" 1>&2 - return 1 - fi - - shift 2 - subtree_hash "$subtree_hash" "$@" - fi -} - -subtree_hash "$@" +#!/bin/sh +"""": # -*-python-*- +bup_python="$(dirname "$0")/../cmd/bup-python" || exit $? +exec "$bup_python" "$0" ${1+"$@"} +""" +# end of bup preamble + +from __future__ import absolute_import, print_function +import sys + +from bup.compat import argv_bytes +from bup.helpers import handle_ctrl_c, readpipe +from bup.io import byte_stream +from bup import options + + +optspec = """ +subtree-hash ROOT_HASH [PATH_ITEM...] +-- +""" + +handle_ctrl_c() + +o = options.Options(optspec) +(opt, flags, extra) = o.parse(sys.argv[1:]) + +if len(extra) < 1: + o.fatal('must specify a root hash') + +tree_hash = argv_bytes(extra[0]) +path = [argv_bytes(x) for x in extra[1:]] + +while path: + target_name = path[0] + subtree_items = readpipe([b'git', b'ls-tree', b'-z', tree_hash]) + target_hash = None + for entry in subtree_items.split(b'\0'): + if not entry: + break + info, name = entry.split(b'\t', 1) + if name == target_name: + _, _, target_hash = info.split(b' ') + break + if not target_hash: + print("Can't find %r in %s" % (target_name, tree_hash.decode('ascii')), + file=sys.stderr) + break + tree_hash = target_hash + path = path[1:] + +if path: + sys.exit(1) + +sys.stdout.flush() +out = byte_stream(sys.stdout) +out.write(tree_hash + b'\n')