mirror of
https://github.com/vishapoberon/vix.git
synced 2026-04-05 20:32:24 +00:00
init
This commit is contained in:
commit
6f90eab38f
1 changed files with 309 additions and 0 deletions
309
vix
Executable file
309
vix
Executable file
|
|
@ -0,0 +1,309 @@
|
|||
#!/bin/sh
|
||||
|
||||
|
||||
# set global variables
|
||||
PROGNAME=${0##*/}
|
||||
VERSION="0.1.0"
|
||||
PROGPATH=$(readlink -f "$0")
|
||||
|
||||
COLOUR_SET_R="\033[0;31m"
|
||||
COLOUR_SET_G="\033[0;32m"
|
||||
COLOUR_SET_Y="\033[0;33m"
|
||||
COLOUR_SET_B="\033[0;34m"
|
||||
COLOUR_SET_M="\033[0;35m"
|
||||
COLOUR_SET_C="\033[0;36m"
|
||||
COLOUR_SET_W="\033[0;37m"
|
||||
COLOUR_END="\033[0m"
|
||||
|
||||
|
||||
help_usage(){
|
||||
cat <<EOT
|
||||
Usage: vix ...
|
||||
help
|
||||
version
|
||||
new PATH [--module MODULE] [--app APP]
|
||||
build
|
||||
test
|
||||
run
|
||||
clean
|
||||
EOT
|
||||
exit 0
|
||||
}
|
||||
|
||||
help_version(){
|
||||
printf "%s: v%s\n" "${PROGNAME}" "${VERSION}"
|
||||
}
|
||||
|
||||
help_tbd(){
|
||||
printf "This feature is not implemented yet...\n"
|
||||
}
|
||||
|
||||
perror(){
|
||||
printf "${COLOUR_SET_R}[-] ${COLOUR_END} %s\n" "${@}" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
pinfo(){
|
||||
printf "${COLOUR_SET_B}[+] ${COLOUR_END} %s\n" "${@}" >&2
|
||||
}
|
||||
|
||||
paction(){
|
||||
printf "${COLOUR_SET_G}[\*] ${COLOUR_END} %s\n" "${@}" >&2
|
||||
}
|
||||
|
||||
|
||||
confirm_create_path(){
|
||||
printf "The directory \"${PATH_ARG}\" already exists."
|
||||
printf " Are you sure you want to continue?"
|
||||
read -p " [yN] " yesno
|
||||
echo "${yesno}"
|
||||
exit 0
|
||||
}
|
||||
|
||||
check_path(){
|
||||
#paction "check_path"
|
||||
stat "$PATH_ARG" >/dev/null 2>&1 && confirm_create_path
|
||||
}
|
||||
|
||||
create_path(){
|
||||
paction "Creating ${PATHBASE}"
|
||||
mkdir -p "${PATH_ARG}"
|
||||
}
|
||||
|
||||
create_readme(){
|
||||
paction "Creating ${PATHBASE}/README.md"
|
||||
cat <<EOF > ${PATH_ARG}/README.md
|
||||
# ${APP}
|
||||
|
||||
**TODO: Add description**
|
||||
|
||||
## Building
|
||||
|
||||
\`\`\`
|
||||
vix build
|
||||
\`\`\`
|
||||
|
||||
## Testing
|
||||
|
||||
\`\`\`
|
||||
vix test
|
||||
\`\`\`
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
create_gitattributes(){
|
||||
paction "Creating ${PATHBASE}/.gitattributes"
|
||||
cat <<EOF > ${PATH_ARG}/.gitattributes
|
||||
# Set the language to Oberon
|
||||
*.Mod linguist-language=Oberon
|
||||
*.mod linguist-language=Oberon
|
||||
EOF
|
||||
}
|
||||
|
||||
create_gitignore(){
|
||||
paction "Creating ${PATHBASE}/.gitignore"
|
||||
cat <<EOF > ${PATH_ARG}/.gitignore
|
||||
build
|
||||
release
|
||||
EOF
|
||||
}
|
||||
|
||||
create_vipakfile(){
|
||||
paction "Creating ${PATHBASE}/vipakfile"
|
||||
cat <<EOF > ${PATH_ARG}/vipakfile
|
||||
NAME = ${APP}
|
||||
VERSION = 0.1.0
|
||||
|
||||
AUTHOR =
|
||||
LICENSE =
|
||||
|
||||
DEPS =
|
||||
|
||||
BUILD = voc %projdir%/src/${MODULE}.Mod -s
|
||||
|
||||
TEST = voc %projdir%/test/${MODULE}Test.Mod -m ; ./${MODULE}Test
|
||||
EOF
|
||||
}
|
||||
|
||||
create_src(){
|
||||
paction "Creating ${PATHBASE}/src"
|
||||
mkdir -p "${PATH_ARG}/src"
|
||||
}
|
||||
|
||||
create_src_prog(){
|
||||
paction "Creating ${PATHBASE}/src/${MODULE}.Mod"
|
||||
cat <<EOF > ${PATH_ARG}/src/${MODULE}.Mod
|
||||
MODULE ${MODULE};
|
||||
|
||||
IMPORT Out;
|
||||
|
||||
PROCEDURE Hello*(s: ARRAY OF CHAR);
|
||||
BEGIN
|
||||
Out.String("Hello ");
|
||||
Out.String(s);
|
||||
Out.Ln;
|
||||
END Hello;
|
||||
|
||||
END ${MODULE}.
|
||||
EOF
|
||||
}
|
||||
|
||||
create_test(){
|
||||
paction "Creating ${PATHBASE}/test"
|
||||
mkdir -p "${PATH_ARG}/test"
|
||||
}
|
||||
|
||||
create_test_progtest(){
|
||||
paction "Creating ${PATHBASE}/test/${MODULE}Test.Mod"
|
||||
cat <<EOF > ${PATH_ARG}/test/${MODULE}Test.Mod
|
||||
MODULE ${MODULE}Test;
|
||||
|
||||
IMPORT ${MODULE};
|
||||
|
||||
BEGIN
|
||||
${MODULE}.Hello("world")
|
||||
END ${MODULE}Test.
|
||||
EOF
|
||||
}
|
||||
|
||||
success_msg(){
|
||||
pinfo 'All good!'
|
||||
}
|
||||
|
||||
|
||||
new_proj() {
|
||||
shift # remove 'new'
|
||||
|
||||
if [ $# -lt 1 ]; then
|
||||
perror "missing PATH argument for '${PROGNAME} new'"
|
||||
fi
|
||||
|
||||
PATH_ARG="$1"
|
||||
PATHBASE="$(basename ${PATH_ARG})"
|
||||
shift
|
||||
|
||||
MODULE=""
|
||||
APP=""
|
||||
|
||||
# Parse optional flags
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--module)
|
||||
shift
|
||||
MODULE="$1"
|
||||
;;
|
||||
--app)
|
||||
shift
|
||||
APP="$1"
|
||||
;;
|
||||
*)
|
||||
perror "unknown option '${1}'"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# --module is required if PATH is '.'
|
||||
if [ -z "$MODULE" ]; then
|
||||
if [ "$PATH_ARG" = "." ]; then
|
||||
perror "--module is required when PATH is '.'"
|
||||
fi
|
||||
|
||||
# Derive PascalCase module name from path
|
||||
MODULE=$(printf "%s" "$PATHBASE" | awk -F'[_-]' '{
|
||||
for (i = 1; i <= NF; i++)
|
||||
{
|
||||
$i = toupper(substr($i,1,1)) substr($i,2)
|
||||
}
|
||||
print $0
|
||||
}' OFS='')
|
||||
fi
|
||||
|
||||
# Validate MODULE as Oberon identifier
|
||||
if ! printf "%s" "$MODULE" | grep -Eq '^[A-Za-z][A-Za-z0-9]*$'; then
|
||||
perror "Invalid module name: '${MODULE}'" \
|
||||
"Must match: letter {letter | digit}" \
|
||||
"(no underscores, dashes, or leading digits)"
|
||||
fi
|
||||
|
||||
# Default APP to basename of path
|
||||
if [ -z "$APP" ]; then
|
||||
APP="${PATHBASE}"
|
||||
fi
|
||||
|
||||
# Output debug values
|
||||
pinfo "PATH : $PATH_ARG"
|
||||
pinfo "MODULE : $MODULE"
|
||||
pinfo "APP : $APP"
|
||||
|
||||
check_path
|
||||
create_path
|
||||
create_readme
|
||||
create_gitattributes
|
||||
create_gitignore
|
||||
create_vipakfile
|
||||
create_src
|
||||
create_src_prog
|
||||
create_test
|
||||
create_test_progtest
|
||||
success_msg
|
||||
}
|
||||
|
||||
|
||||
_run_steps() {
|
||||
key="$1"; dir="$2"
|
||||
|
||||
[ -f vipakfile ] || perror "vipakfile not found in current directory"
|
||||
|
||||
# pull everything after the first '='
|
||||
line=$(grep -E "^${key}[[:space:]]*=" vipakfile \
|
||||
| cut -d= -f2-)
|
||||
|
||||
# trim leading whitespace and replace %projdir% → ../
|
||||
line=$(printf "%s" "$line" \
|
||||
| sed -e 's/^[[:space:]]*//' -e 's|%projdir%|..|g')
|
||||
|
||||
paction "Running ${key} commands in '${dir}/'"
|
||||
|
||||
mkdir -p "$dir"
|
||||
cd "$dir" || perror "cannot enter directory '$dir'"
|
||||
|
||||
# split on ';' and run each chunk
|
||||
oldIFS=$IFS; IFS=';'
|
||||
for cmd in $line; do
|
||||
# trim whitespace
|
||||
cmd=$(printf "%s" "$cmd" \
|
||||
| sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
|
||||
[ -z "$cmd" ] && continue
|
||||
|
||||
paction "Executing: $cmd"
|
||||
eval "$cmd" || perror "${key} command failed: $cmd"
|
||||
done
|
||||
IFS=$oldIFS
|
||||
|
||||
pinfo "${key} complete"
|
||||
}
|
||||
|
||||
build_proj() {
|
||||
_run_steps BUILD build
|
||||
}
|
||||
|
||||
test_proj() {
|
||||
_run_steps TEST build
|
||||
}
|
||||
|
||||
vix_main(){
|
||||
[ $# -eq 0 ] && help_usage
|
||||
|
||||
case "$1" in
|
||||
help) help_usage ;;
|
||||
version) help_version ;;
|
||||
new) new_proj "$@" ;;
|
||||
build) build_proj ;;
|
||||
test) test_proj ;;
|
||||
*) help_usage ;;
|
||||
esac
|
||||
}
|
||||
|
||||
vix_main "$@"
|
||||
Loading…
Add table
Add a link
Reference in a new issue