#!/bin/sh -eu usage() { abort "usage: tm update-tree [-m ] " } mode="default" while getopts m: opt; do case "$opt" in m) mode="$OPTARG" ;; ?) usage ;; esac done shift "$((OPTIND - 1))" . "$(dirname -- "$0")/lib.sh" [ $# -ne 3 ] && usage [ "z$mode" = "zdefault" ] \ && mode="$(tm resolve-path -f mode -- "$1" "$2" 2>/dev/null || echo 755)" tmp="$TMPDIR/update-tree" dirref="$(tm resolve-path "$1" "$(dirname -- "$2")" || true)" if [ -z "$dirref" ]; then dirref="$(tm update-tree "$1" "$(dirname -- "$2")" "$(echo tree | write)")" dirref="$(tm resolve-path "$dirref" "$(basename -- "$(dirname -- "$2")")")" fi path="$(basename -- "$2")" new="$(tm resolve-ref "$3")" || abort "error: invalid ref $3" tm cat "$dirref" | awk -v"new=$mode $new $path" -v"path=$path" ' BEGIN { found="0" } { if ($3 == path) { print new; found="1"; } else { print $0; } } END { if (found == "0") { print new; } } ' >"$tmp" [ "z$2" = "z/" ] || [ "z$2" = "z." ] && printf "%s\n" "$3" && exit exec tm update-tree "$1" "$(dirname -- "$2")" "$(write <"$tmp")"