pthbs-banginstall (2685B)
1 #!/command/zsh 2 setopt no_unset extended_glob 3 4 if [[ -n ${pthbs_xtrace-} ]]; then 5 set -x 6 fi 7 8 typeset -g vd # versions dir, eg: /home/ccx/versions 9 typeset -g pvd # package versions dir, eg: 10 # /home/ccx/versions/pthbs-banginstall.d76..99a 11 typeset -g pdd # package destdir, eg: 12 # /home/ccx/git/pthbs/work/builddir.4253/destdir/home/ccx/versions/pthbs-banginstall.d76...99a 13 14 typeset -g hl_fatal hl_reset 15 if (( ${terminfo[colors]:-0} >= 8 )); then 16 hl_fatal='%F{red}%B'; hl_fatal=${(%)hl_fatal} 17 hl_reset='%b%f'; hl_reset=${(%)hl_reset} 18 fi 19 20 # helper that prints out stack, error message and exits 21 die_ret() { 22 set +x 23 local ret n 24 ret=$1 25 shift 26 print -r - >&2 "${hl_fatal}Fatal$hl_reset error occurend in:" 27 for n in {${#funcfiletrace}..1}; do 28 printf >&2 '%d> %s (%s)\n' $n "$funcfiletrace[$n]" "$functrace[$n]" 29 done 30 printf >&2 '%s\n' "${hl_fatal}*$hl_reset $^@" 31 exit $ret 32 } 33 34 die100() { # 100: wrong usage 35 set +x 36 die_ret 100 "$@" 37 } 38 die111() { # 111: system call failed 39 set +x 40 die_ret 111 "$@" 41 } 42 43 main() { 44 pdd="$@[-1]" # package destdir 45 [[ -d $pdd ]] || die111 "Not a valid destdir: ${(qqq)pdd}" 46 (( $+pthbs_destdir )) || die100 "Variable pthbs_destdir is not defined" 47 pdd=${${pdd%%/}//\/\//\/} 48 [[ $pdd == $pthbs_destdir/* ]] || die100 "Package destdir ${(qqq)pdd} not in pthbs_destdir ${(qqq)pthbs_destdir}" 49 pvd=${pdd##$pthbs_destdir} # package versioned dir 50 [[ $pdd == $pthbs_destdir$pvd ]] || die_ret 3 "Internal error" 51 vd=${pvd:h} 52 local cmd 53 for cmd in "$@[1,-2]"; do 54 write_command $cmd 55 done 56 } 57 58 write_command() { 59 (( $# == 1 )) || exit 2 60 local script_file shebang interpreter rest 61 script_file=$1 62 [[ -x $script_file ]] || die111 "${(qqq)script_file} is not an executable script" 63 read -r <$script_file shebang rest 64 [[ $shebang == '#!/'* ]] || die111 "${(qqq)script_file} does not start with '#!/'" 65 if ! (($+commands[${shebang:t}])); then 66 die111 "Could not find executable for ${(qqq)shebang:t} in ${(qqq)script_file}" 67 fi 68 interpreter=${commands[${shebang:t}]:P} 69 [[ $interpreter == ${pvd:h}/* ]] || \ 70 die111 "The executable for ${(qqq)${shebang:t}} is at ${(qqq)commands[${shebang:t}]:P} which is outside ${(qqq)vd}" 71 mkdir -p $pdd/command $pdd/deps/command || exit $? 72 ln -sf $interpreter $pdd/deps/command/${shebang:t} || exit $? 73 [[ -e $pdd/command/${script_file:t} ]] && \ 74 die111 "Target file already exists: $pdd/command/${script_file:t}" 75 cp -a $script_file $pdd/command/${script_file:t} || exit $? 76 new_sb='#!'$pvd/deps/command/${shebang:t} awk ' 77 NR==1 { sub("^[^ \t]+", ENVIRON["new_sb"]) } 78 1 79 ' >$pdd/command/${script_file:t} <$script_file 80 } 81 82 main "$@"