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
|