blob: 9b5ff8f9fabcb237373584b205bbcadad933db09 (
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
chain_ish="${1:-HEAD}"
chain=$(sib rev-parse "$chain_ish")
[[ -z $chain ]] && die Invalid: $chain_ish
# List to rebase
rev_list=()
found=0
while IFS= read -r rev; do
[ "$rev" = "$chain" ] && found=1
(( found )) && rev_list+=("$rev")
done < <(sib rev-list HEAD)
(( found )) || die "$chain_ish not in HEAD chain"
WORKDIR=$(mktemp -d /tmp/sib.XXXXXX)
trap 'rm -rf $WORKDIR' EXIT
cd $WORKDIR
EB=content
TRACE=trace
NTRACE=ntrace
# FIXME: exit on awk just in case
sib ls-trace $chain \
| tee $TRACE \
| awk -F'\t' '$2=="content"{print $1; exit}' \
| tee oldblob \
| xargs -r sib git cat-file blob > $EB
[[ ${PIPESTATUS[0]} -eq 0 ]] || die wrong $chain from $chain_ish
[[ -s $TRACE ]] || die empty trace
editor=${EDITOR:-nano}
$editor $EB || die $editor returns $?
blob=$(sib git hash-object -w $EB) || die
[[ $(cat oldblob) == $blob ]] && exit 0 # no changes
[[ -z $blob ]] && die
awk -v blob=$blob -v OFS='\t' '
{
if ($2=="content") {
print blob, "content";
} else {
print $0;
}
}' $TRACE > $NTRACE || die Failed to replace content in trace format
mv -f -- $NTRACE $TRACE
# Edit target chain
parent=$(sib ls-chain ${rev_list[0]} | awk '$1=="parent"{print $2}') || die
trace=$(cat $TRACE | sib mktrace) || die
if [[ -z $parent ]]; then
parent=$(sib chain-trace $trace) || die
else
parent=$(sib chain-trace -p $parent $trace) || die
fi
# print edited chain's hash to stdout
echo $parent
# Rebase else onto target
for (( i = 1; i < ${#rev_list[@]}; i++ )); do
[[ -z $parent ]] && die cannot find parent on index $i
trace=$(sib ls-chain ${rev_list[i]} | awk '$1=="trace"{print $2}') || die
parent=$(sib chain-trace -p $parent $trace) || die
done
sib update-ref -m "edit $chain_ish" HEAD $parent
|