aboutsummaryrefslogtreecommitdiff
path: root/sib-edit
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