summaryrefslogtreecommitdiff
path: root/sib-show
blob: 6cdae360a3d95f8573ffd72e5b065a9f1123b948 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env bash
# Copyright 2026 Hee-Suk Kim <[email protected]>
# SPDX-License-Identifier: GPL-3.0-only

set -euo pipefail

. lib.bash

usage() {
    cat <<EOF
usage: ${NAME} [-ch] [-k <key>] [-n <lines>] [<chain-ish>]
  -n <lines>  Truncate content to <lines>
  -k <key>    Only show <key>'s value on <chain-ish>
  -c          Same as \`-k content'
  -h          Show this help
EOF
}

n_lines= key=
while getopts rhn:k:c o; do
    case $o in
        h) usage; exit 0 ;;
        n) n_lines="$OPTARG" ;;
        k) key="$OPTARG" ;;
        c) key=content   ;;
        *) usage; exit 1 ;;
    esac
done
shift $((OPTIND - 1))

truncate_content() {
    [[ -n $n_lines ]] && head -n "$n_lines" || cat
}

target="${1:-HEAD}"

# On sib-log
if [[ -n "${SIB_SHOW_RESOLVED:-}" ]]; then
    chain="$target"
else
    chain=$(sib rev-parse $target)
fi

if [[ ! -z $key ]]; then
    sib ls-trace $chain \
        | awk -F'\t' -v k=$key '$2 == k { print $1 }' \
        | xargs sib git cat-file blob
    exit 0
fi

# Normal output
echo "chain $chain"

CONTENT=content

lst="$(sib ls-trace $chain)"
[[ -z $lst ]] && { echo --- Empty trace --- >&2; echo; exit 0; }

# Traverse all key except $CONTENT
echo "$lst" \
    | awk -F'\t' -v k="$CONTENT" '$2 != k { print }' \
    | while IFS=$'\t' read -r value key; do

    # Should not die here
    [[ -z $value ]] && die "mallformed ls-tree format $lst"

    value=$(sib git cat-file blob $value)
    echo "$key: $value"
done

echo
content=$(echo "$lst" | awk -F'\t' -v k="$CONTENT" '$2 == k { print $1 }')
[[ -z $content ]] && { echo No $CONTENT field on $chain >&2; exit 0; }
sib git cat-file blob $content | truncate_content
echo