diff options
author | P. J. McDermott <pjm@nac.net> | 2013-07-12 11:00:02 (EDT) |
---|---|---|
committer | P. J. McDermott <pjm@nac.net> | 2013-07-12 11:00:02 (EDT) |
commit | c3d3f0c1ac1ef45916b3ff7d32b39f9531f94e51 (patch) | |
tree | adf2f8f7a23acbccd7b9e7e3dec3bce9bf8c05ca | |
parent | d434079c95fbd491dd96d4a54bbfe3787716c3e0 (diff) |
Write pro-archman and command handling.
-rw-r--r-- | Makefile.in | 9 | ||||
-rw-r--r-- | lib/cmd.sh | 95 | ||||
-rw-r--r-- | lib/cmd/help.sh | 33 | ||||
-rw-r--r-- | lib/cmd/include.sh | 26 | ||||
-rw-r--r-- | lib/cmd/local.mk | 6 | ||||
-rw-r--r-- | lib/local.mk | 5 | ||||
-rw-r--r-- | src/local.mk | 5 | ||||
-rw-r--r-- | src/pro-archman.sh | 85 |
8 files changed, 260 insertions, 4 deletions
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 <http://www.gnu.org/licenses/>. + +[ "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 <http://www.gnu.org/licenses/>. + +cmd_summary 'print this help message' +cmd_usage '[<command>]' + +cmd_help_main() +{ + if [ ${#} -eq 1 ]; then + if is_cmd "${1}"; then + return 0 + fi + fi + + printf 'Usage: %s <command>\n\nWhere <command> 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 <http://www.gnu.org/licenses/>. + +cmd_summary 'include packages described in changes files' +cmd_usage '<changes> ...' + +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 <http://www.gnu.org/licenses/>. + +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 "${@}" |