mrrl

Minimal Reliable Reproducible Linux
git clone https://ccx.te2000.cz/git/mrrl
Log | Files | Refs | Submodules | README

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 "$@"