From c3d3f0c1ac1ef45916b3ff7d32b39f9531f94e51 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Fri, 12 Jul 2013 11:00:02 -0400 Subject: Write pro-archman and command handling. --- diff --git a/Makefile.in b/Makefile.in index 21bada2..a52dd9e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -38,9 +38,9 @@ sh = @sh@ pkglibcmddir = $(pkglibdir)/cmd -#include $(srcdir)/src/local.mk -#include $(srcdir)/lib/local.mk -#include $(srcdir)/lib/cmd/local.mk +include $(srcdir)/src/local.mk +include $(srcdir)/lib/local.mk +include $(srcdir)/lib/cmd/local.mk #include $(srcdir)/man/local.mk #include $(srcdir)/locale/local.mk #include $(srcdir)/tests/local.mk @@ -82,7 +82,8 @@ script = \ s&@@PKGLIBCMDDIR@@&$(pkglibcmddir)&;\ s&@@DATADIR@@&$(datadir)&;\ s&@@LOCALEDIR@@&$(localedir)&;\ - s&@@SH@@&$(sh)&; + s&@@SH@@&$(sh)&;\ + s&@@PKGLIBCMD@@&$(pkglibcmd)&; .SUFFIXES: .SUFFIXES: .sh .sm .1in .1 .ms diff --git a/lib/cmd.sh b/lib/cmd.sh new file mode 100644 index 0000000..cff225b --- /dev/null +++ b/lib/cmd.sh @@ -0,0 +1,95 @@ +# pro-archman +# lib/cmd.sh +# Command-related functions +# +# Copyright (C) 2013 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +[ "x${_CMD_SM+set}" = 'xset' ] && return 0 +_CMD_SM=1 + +cmds= + +load_cmds() +{ + local cmd + + for cmd in ${PKGLIBCMD}; do + cmd="${cmd##*/}" + cmd="${cmd%.sm}" + cmds="${cmds}${cmd}${LF}" + use "cmd/${cmd}" + done +} + +cmd_summary() +{ + if [ "x${loading_cmd}" = 'x' ]; then + return 125 + fi + + eval "cmd_${loading_cmd}_summary='${1}'" +} + +cmd_usage() +{ + if [ "x${loading_cmd}" = 'x' ]; then + return 125 + fi + + eval "cmd_${loading_cmd}_usage='${1}'" +} + +print_cmd_summaries() +{ + local padding cmd summary + + padding="$(printf '%24s' '')" + for cmd in ${PKGLIBCMD}; do + cmd="${cmd##*/}" + cmd="${cmd%.sm}" + if [ ${#cmd} -gt 20 ]; then + printf ' %s\n%24s' "${cmd}" '' + else + printf ' %-20s ' "${cmd}" + fi + summary="$(eval printf \'%s\' \"\$\{cmd_"${cmd}"_summary\}\")" + printf '%s\n' "${summary}" | fold -s -w 56 | \ + sed "2,\$s/^/${padding}/;" + done +} + +is_cmd() +{ + local cmd + + cmd="${1}" + + [ "x$(printf '%s' "${cmds}" | grep "^${cmd}$")" = "x${cmd}" ] +} + +run_cmd() +{ + local cmd + + cmd="${1}" + shift + + if is_cmd "${cmd}"; then + "cmd_${cmd}_main" "${@}" + else + printf 'Command "%s" not found\n' "${cmd}" + fi +} diff --git a/lib/cmd/help.sh b/lib/cmd/help.sh new file mode 100644 index 0000000..129cb14 --- /dev/null +++ b/lib/cmd/help.sh @@ -0,0 +1,33 @@ +# pro-archman +# lib/cmd/help.sh +# "help" command +# +# Copyright (C) 2013 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +cmd_summary 'print this help message' +cmd_usage '[]' + +cmd_help_main() +{ + if [ ${#} -eq 1 ]; then + if is_cmd "${1}"; then + return 0 + fi + fi + + printf 'Usage: %s \n\nWhere is one of:\n' "${0}" + print_cmd_summaries +} diff --git a/lib/cmd/include.sh b/lib/cmd/include.sh new file mode 100644 index 0000000..eeb6ef5 --- /dev/null +++ b/lib/cmd/include.sh @@ -0,0 +1,26 @@ +# pro-archman +# lib/cmd/include.sh +# "include" command +# +# Copyright (C) 2013 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +cmd_summary 'include packages described in changes files' +cmd_usage ' ...' + +cmd_include_main() +{ + printf 'Not implemented\n' +} diff --git a/lib/cmd/local.mk b/lib/cmd/local.mk new file mode 100644 index 0000000..6892594 --- /dev/null +++ b/lib/cmd/local.mk @@ -0,0 +1,6 @@ +# pro-archman +# lib/cmd/local.mk + +pkglibcmd_srcs = \ + lib/cmd/help.sh \ + lib/cmd/include.sh diff --git a/lib/local.mk b/lib/local.mk new file mode 100644 index 0000000..e135474 --- /dev/null +++ b/lib/local.mk @@ -0,0 +1,5 @@ +# pro-archman +# lib/local.mk + +pkglib_srcs = \ + lib/cmd.sh diff --git a/src/local.mk b/src/local.mk new file mode 100644 index 0000000..c42c66e --- /dev/null +++ b/src/local.mk @@ -0,0 +1,5 @@ +# pro-archman +# src/local.mk + +bin_srcs = \ + src/pro-archman.sh diff --git a/src/pro-archman.sh b/src/pro-archman.sh new file mode 100644 index 0000000..a3824cf --- /dev/null +++ b/src/pro-archman.sh @@ -0,0 +1,85 @@ +#!@@SH@@ +# +# pro-archman +# src/archive-manager.sh +# Main program file +# +# Copyright (C) 2013 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set -u + +# Constant global variables +PKGLIBDIR='@@PKGLIBDIR@@' +PKGLIBCMDDIR='@@PKGLIBCMDDIR@@' +PKGLIBCMD='@@PKGLIBCMD@@' +LF=' +' + +# Global variables +loading_cmd= + +# use() must be defined inline so it can be used to load other modules. +use() +{ + local module default_dir lib_subdir dir + + module="${1}" + + if [ "x${module%/*}" = "x${module}" ]; then + default_dir="${PKGLIBDIR}" + lib_subdir='' + else + case "${module%/*}" in + 'cmd') + loading_cmd="$(printf '%s' "${module##*/}" | \ + tr '[A-Z]' '[a-z]' | \ + tr -C '[a-z0-9_]' '_')" + default_dir="${PKGLIBCMDDIR}" + lib_subdir='cmd' + ;; + esac + fi + + if [ "${ARCHMAN_LIBDIR+set}" = 'set' ]; then + dir="${ARCHMAN_LIBDIR:-.}/${lib_subdir}" + else + dir="${default_dir}" + fi + + if [ -f "${dir}/${module##*/}.sm" ]; then + . "${dir}/${module##*/}.sm" + else + printf 'Failed to load module "%s": %s\n' \ + "${module}" 'no such file or directory' >&2 + exit 2 + fi +} + +use cmd + +main() +{ + load_cmds + + if [ ${#} -lt 1 ]; then + cmd_help_main >&2 + exit 1 + fi + + run_cmd "${@}" +} + +main "${@}" -- cgit v0.9.1