Files
artloglaby/doit.sh
philippe lhardy 3c4b44e837 add missing script coming from unlinked artlog toolbox project
not mandatory but consistent to have all code

Signed-off-by: philippe lhardy <philippe.lhardy@astrolabe.coop>
2025-11-02 08:41:53 +01:00

394 lines
8.4 KiB
Bash
Executable File

#!/bin/bash
# entry point for project building / editing / running
# this specific_run is intended to be overriden by specific_doit.sh script if any.
function specific_run()
{
echo "[ERROR] '$1' command is not supported in a generic manner" >&2
}
# within a list of files $1 $2 ... find the first that exists and set variable found_best to it.
find_best()
{
while [[ $# > 0 ]]
do
if [[ -f $1 ]]
then
found_best=$1
return
fi
shift
done
}
# $1 variable $2 value
save_parameter()
{
echo "$1=\"$2\"" >> .params
}
info()
{
if [[ -z $NOJAVA ]]
then
echo "DEV_ENV=$DEV_ENV"
echo "JDK_PATH=$JDK_PATH"
echo "ECLIPSE_PATH=$ECLIPSE_PATH"
echo "PATH=$PATH"
java -version
else
echo "NOJAVA is set to $NOJAVA"
fi
}
setup()
{
if [[ -z $NOJAVA ]]
then
if [[ ! -d java ]]
then
echo "[INFO] Missing java directory." >&2
fi
fi
}
do_code()
{
if [[ -z $NOJAVA ]]
then
background=$1
local jd=()
local id=()
local menu=()
index=0
# find all java source file within current directory and populate jd array with. even if java is a link ( -H option ).
for java_dir in $(find -H java -name '*.java' -exec dirname {} \; | sort -u)
do
index=$((index+1))
id+=($index)
jd+=("$java_dir")
menu+=($index "$java_dir")
done
echo "found ${#jd[@]} java source directories"
if [[ ${#jd[@]} -gt 1 ]]
then
echo "${jd[@]}"
# menu <text> <height> <width> <listheight> <tag[1]> <name[1]> ... <tag[n]> <name[n]>
index_dir=$($DIALOG --menu "Select dir" 20 100 10 ${menu[@]} 3>&1 1>&2 2>&3)
if [[ ! $? ]]
then
echo "[ERROR] $DIALOG --menu did fail when requesting choice over java directories" >&2
exit 1
fi
fi
java_dir=${jd[$((index_dir-1))]}
if [[ ! -d $java_dir ]]
then
echo "$java_dir is not a directory" >&2
return
fi
echo "chose dir $java_dir"
find $java_dir -maxdepth 1 -name '*.java' |
{
local s=()
while read codeline
do
javafile=$(basename "$codeline")
javaclass=${javafile/.java/}
echo "$javafile $javaclass"
s+=("$javaclass" "$codeline")
done
javaclass=$($DIALOG --menu "Edit it" 20 100 10 ${s[@]} 3>&1 1>&2 2>&3)
if [[ -n $javaclass ]]
then
if [[ $background == codebg ]]
then
${EDITOR} $java_dir/$javaclass.java &
else
${EDITOR} $java_dir/$javaclass.java
fi
fi
}
else
echo "NOJAVA set"
fi
}
edit_properties()
{
local property_file=$1
if [[ -f $property_file ]]
then
modified=0
s=()
properties=()
values=()
{
while read codeline
do
if [[ $codeline =~ (^[a-zA-Z_]*)=(.*) ]]
then
property=${BASH_REMATCH[1]}
value=${BASH_REMATCH[2]}
s+=("$property" "$value")
properties+=("$property")
values+=("$value")
fi
done
s+=(exit "Exit")
} < $property_file
while true
do
property=$($DIALOG --menu "Edit '$property_file'" 20 100 10 ${s[@]} 3>&1 1>&2 2>&3)
if [[ $? = 0 ]]
then
if [[ -n $property ]]
then
if [[ $property == exit ]]
then
return 1
elif [[ $property == save ]]
then
for (( i=0; i<${prop_len}; i++ ));
do
echo "${properties[$i]}=${values[$i]}"
done >$property_file
return 0
fi
prop_len="${#properties[@]}"
for (( i=0; i<${prop_len}; i++ ));
do
if [[ ${properties[$i]} == $property ]]
then
init_value=${values[$i]}
fi
done
value=$($DIALOG --inputbox "Enter $property value" 10 80 "$init_value" 3>&1 1>&2 2>&3)
if [[ $? = 0 ]]
then
prop_len="${#properties[@]}"
s=()
if [[ "$value" != "$init_value" ]]
then
modified=$(( modified + 1 ))
fi
for (( i=0; i<${prop_len}; i++ ));
do
if [[ ${properties[$i]} == $property ]]
then
values[$i]=$value
fi
s+=("${properties[$i]}" "${values[$i]}")
echo "${properties[$i]}=${values[$i]}"
done
s+=(exit "Exit")
if [[ $modified != 0 ]]
then
s+=(save "Save")
fi
fi
fi
else
return 2
fi
done
else
echo "[ERROR] property_file '$propertyfile' not found" >&2
fi
}
specific_menus=()
if [[ -f ./specificdoit.sh ]]
then
source ./specificdoit.sh
fi
if [[ -f .params ]]
then
source .params
if [[ -n $DIALOG ]]
then
if [[ ! -x $DIALOG ]]
then
echo "[ERROR] DIALOG=$DIALOG dialog tool not executable" >&2
exit 1
fi
fi
fi
LOG_OUTFILE=.log
if [[ -z $DIALOG ]]
then
echo "[INFO] detecting dialog program"
possible_console_gui="whiptail dialog"
for DIALOG in $possible_console_gui
do
DIALOG=$(which $DIALOG)
if [[ -x $DIALOG ]]
then
$DIALOG --menu "Ultra Light IDE" 20 80 2 "select me to validate $DIALOG " justfortest
rc=$?
if [[ $rc != 0 ]]
then
echo "[ERROR] $DIALOG return code $rc : can't use it" >&2
else
break
fi
fi
done
if [[ -z $DIALOG ]]
then
echo "[ERROR] no console gui support (no dialog tool found within $possible_console_gui) => no menus " >&2
echo "[INFO] this can happen under emacs within shell or eshell, please use term then"
exit 1
fi
save_parameter DIALOG "$DIALOG"
fi
possible_editor="emacs vi nano"
for EDITOR in $possible_editor
do
EDITOR=$(which $EDITOR)
if [[ -x $EDITOR ]]
then
break
fi
done
if [[ -z $EDITOR ]]
then
echo "[ERROR] no editor found (within $possible_editor) => no editing " >&2
fi
setup
action=initial
# count successives failures.
failed_commands_count=0
while [[ $action != quit ]]
do
# should detect that dialog failed
if [[ -z $NOJAVA ]]
then
# should be cleaned up from specific laby project targets.
action=$($DIALOG --menu "Ultra Light IDE" 20 80 12 readme "Read me" clean "Clean All" ant "Ant build" run "Run it" ${specific_menus[@]} test "Test it" code "Code" codebg "Code in background" deb "Debian package" properties "Edit Properties" create "Create a new class" info "Info" logs "Logs" quit "Quit" 3>&1 1>&2 2>&3)
else
action=$($DIALOG --menu "Ultra Light IDE" 20 80 12 readme "Read me" clean "Clean All" run "Run it" test "Test it" ${specific_menus[@]} code "Code" codebg "Code in background" deb "Debian package" properties "Edit Properties" info "Info" logs "Logs" quit "Quit" 3>&1 1>&2 2>&3)
fi
rc=$?
if [[ $rc == 0 ]]
then
failed_commands_count=0
else
failed_commands_count=$(( failed_commands_count + 1 ))
fi
if (( $failed_commands_count > 10 ))
then
echo "[ERROR] more than 10 successive failures ( $failed_commands_count > 10 )" >&2
echo "[INFO] Check if your environment supports $DIALOG"
action=quit
fi
if [[ $action == run ]]
then
if [[ -z $NOJAVA ]]
then
echo "run it"
{
source ./project_params
javalibs=$(make -f ${JAVA_MAKEFILE} getjavalibs|awk '{ printf "%s:",$1 }')
mainlib=$(make -f ${JAVA_MAKEFILE} getname)
javarun="java -cp $mainlib:$javalibs $project_mainclass"
echo $javarun
$javarun
}
else
make
fi
elif [[ $action == ant ]]
then
make -f ${JAVA_MAKEFILE} clean
make -f ${JAVA_MAKEFILE}
ant compile >>.log 2>&1
elif [[ $action == clean ]]
then
if [[ -z $NOJAVA ]]
then
make -f ${JAVA_MAKEFILE} clean
pushd java
make clean
popd
else
make clean
fi
elif [[ $action == test ]]
then
if [[ -z $NOJAVA ]]
then
echo "test it"
pushd java
make display
popd
else
make test
fi
elif [[ $action == deb ]]
then
make -f ${JAVA_MAKEFILE} deb
elif [[ $action =~ code ]]
then
do_code $action
elif [[ $action == readme ]]
then
found_best=
find_best README README.md
if [[ -n $found_best ]]
then
$DIALOG --textbox $found_best 40 80 --scrolltext
else
echo "no README or README.md found" >&2
fi
elif [[ $action == properties ]]
then
edit_properties project_params
elif [[ $action == create ]]
then
newclass=$($DIALOG --inputbox "Enter new class name" 10 80 "NewClass" 3>&1 1>&2 2>&3)
if [[ $? = 0 ]]
then
if [[ -n $newclass ]]
then
MAIN_CLASS=Main PACKAGE=$(./debianize.sh getproject_mainpackage) make -f 4create.makefile work/$newclass
fi
fi
elif [[ $action == info ]]
then
infos=$(mktemp)
info >$infos
$DIALOG --textbox $infos 40 80 --scrolltext
rm $infos
elif [[ $action == logs ]]
then
if [[ -f .log ]]
then
$DIALOG --textbox .log 40 80 --scrolltext
fi
elif [[ $action == quit ]]
then
echo "[INFO] quit requested"
else
specific_run $action
fi
done