#!/usr/bin/env bash # Copyright 2026 Hee-Suk Kim # 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