5 months agoImplement help -a. master
Andre Noll [Thu, 13 Sep 2018 19:26:31 +0000 (21:26 +0200)]
Implement help -a.

In most cases, the user does not want to see the four subcommands
which are auto-generated by gsu, so omit them from the default output
and provide -a to show them anyway.

This patch has been languishing in a development branch for several
years, so it's kind of well tested.

5 months agosubcommand: Properly escape example lines in maindoc.
Andre Noll [Mon, 12 Sep 2022 22:01:41 +0000 (00:01 +0200)]
subcommand: Properly escape example lines in maindoc.

These lines may well contain control characters such as the single

6 months agosubcommand: Fix -e of com_prefs().
Andre Noll [Thu, 22 Sep 2022 21:01:18 +0000 (23:01 +0200)]
subcommand: Fix -e of com_prefs().

The config variable may consist of more than one path, and we want
to pass each as a separate argument to the editor.

2 years agosubcommand: Declare local variable i of gsu_getopts() as integer.
Andre Noll [Mon, 27 Jan 2020 09:43:47 +0000 (10:43 +0100)]
subcommand: Declare local variable i of gsu_getopts() as integer.

We only use it as the loop index.

2 years agosubcommand: Declare two variables of gsu_getopts() as local.
Andre Noll [Mon, 27 Jan 2020 09:40:28 +0000 (10:40 +0100)]
subcommand: Declare two variables of gsu_getopts() as local.

Without the declaration, applications that also use these variables may
encounter problems.

2 years agosubcommand: Don't print error messages to stdout.
Andre Noll [Thu, 19 Jul 2018 19:04:09 +0000 (21:04 +0200)]
subcommand: Don't print error messages to stdout.

If an invalid command name was given, we print the list of available
commands, followed by an error message. The list of commands is
sent to stdout while the error message goes to stderr. This is a bit
unfortunate, so print both to stderr instead.

4 years agoAllow for more than one config file.
Andre Noll [Thu, 20 Dec 2018 20:43:25 +0000 (21:43 +0100)]
Allow for more than one config file.

This is easy to do, simple to implement, and backwards compatible
(assuming that nobody has names of config files which contain spaces).

4 years agoAdd home page link.
Andre Noll [Sat, 19 Jan 2019 19:34:21 +0000 (20:34 +0100)]
Add home page link.

People who like gsu might also like lopsub or one of my other projects.

4 years agologo: Don't fill the path.
Andre Noll [Sat, 19 Jan 2019 13:07:39 +0000 (14:07 +0100)]
logo: Don't fill the path.

This just looks ugly if the background is not white.

4 years agoSimplify arithmetic evaluation.
Andre Noll [Thu, 16 Aug 2018 12:39:59 +0000 (14:39 +0200)]
Simplify arithmetic evaluation.

Shell variables may be referenced by name without using the parameter
expansion syntax. In fact, this is to be preferred. Also no quotes
are neccessary.

This also fixes the hello world example.

Reported-by: Johannes Woerner <>
Tested-by: Johannes Woerner <>
4 years agoman: Make "roff" the default output mode.
Andre Noll [Thu, 30 Nov 2017 16:56:53 +0000 (17:56 +0100)]
man: Make "roff" the default output mode.

We've asked people for more than a year to set the output mode,
su this should not come as a surprise.

5 years agocom_prefs(): Add missing space character.
Andre Noll [Tue, 26 Dec 2017 21:41:54 +0000 (22:41 +0100)]
com_prefs(): Add missing space character.

Pure cosmetic issue, as this text is printed after the # character
which starts a comment.

5 years agoRedo the logo as svg.
Andre Noll [Wed, 4 Oct 2017 18:43:31 +0000 (20:43 +0200)]
Redo the logo as svg.

dia started to segfault on my home box, and the export mode of dia to
convert a .dia file to png format is broken. Let's replace the .dia
file with a similar looking .svg file instead. It was made with vi.

5 years agoFall back to filename completion if no completer is defined.
Andre Noll [Mon, 13 Nov 2017 01:13:46 +0000 (02:13 +0100)]
Fall back to filename completion if no completer is defined.

If a gsu application does not implement subcommand completers, it's
best to  complete on file names, if only to make completion work in
the common case of redirections. For example we like to complete the
last word of a partial command line of the form

app subcommand > /dev/nu

This did not work so far. With the patch applied, it does.

The application can always override the behaviour by implementing a
suitable completer.

5 years agosubcommand: Fix and document return value of gsu_complete_options().
Andre Noll [Mon, 17 Apr 2017 14:19:38 +0000 (16:19 +0200)]
subcommand: Fix and document return value of gsu_complete_options().

The value returned in $ret was undocumented so far. And it did not
make sense either: We used to return 0 if the current word does not
start with a hyphen, and the number of options in the given optstring
otherwise. Hence the value of zero is ambiguous.

Nobody needs the number of options anyway, so let's simply return 0
or 1, and document this.

5 years agosubcommand: Implement roff and html output for com_man().
Andre Noll [Mon, 17 Apr 2017 14:07:31 +0000 (16:07 +0200)]
subcommand: Implement roff and html output for com_man().

This implements the -m option of the internal man subcommand to specify
the output format for the manual page (text, roff, or html).  html is
generated by running the html postprocessor of groff. Another option,
-b, is introduced to let the user specify the browser for html output.

The commit introduces new public variable $gsu_package whose value is
shown at the bottom left of the man page.

The documentation is updated accordingly, and the example subcommand
of has been enhaced to illustrate how subcommand options
should be formatted to look nice in both html and roff output.

5 years agosubcommand: Declare $opt as local.
Andre Noll [Sat, 14 Oct 2017 20:59:55 +0000 (22:59 +0200)]
subcommand: Declare $opt as local.

Without the local keyword, gsu_cword_is_option_parameter() might
overwrite a variable of the caller.

5 years agoFix gsu_cword_is_option_parameter().
Andre Noll [Wed, 4 Oct 2017 15:27:01 +0000 (17:27 +0200)]
Fix gsu_cword_is_option_parameter().

The function did not recognize option combining. For example, the
current word was not recognized as an argument to -c if -c was given
as -abc. This patch should fix this issue.

5 years agoAdd some missing double quotes.
Andre Noll [Sat, 7 Oct 2017 13:02:43 +0000 (15:02 +0200)]
Add some missing double quotes.

All of these were found by shellcheck. Some are harmless, but let's
fix them anyway.

5 years agosubcommand: Fix some format string issues.
Andre Noll [Sat, 7 Oct 2017 12:59:46 +0000 (14:59 +0200)]
subcommand: Fix some format string issues.

One should never use variables in format strings. Found by shellcheck.

5 years agoRemove some unused local variables.
Andre Noll [Sat, 7 Oct 2017 12:58:04 +0000 (14:58 +0200)]
Remove some unused local variables.

Found by shellcheck.

5 years agosubcommand: Use pager for man output if possible.
Andre Noll [Sun, 5 Mar 2017 22:03:36 +0000 (23:03 +0100)]
subcommand: Use pager for man output if possible.

The manual can be much longer than one page, and it is easy to tell
whether stdout is associated with a terminal. The new _gsu_isatty()
takes care of that. It has been verified to work on FreeBSD, NetBSD
and Linux.

5 years agoconfig: Remove workaround for old bash versions.
Andre Noll [Wed, 8 Mar 2017 07:44:33 +0000 (08:44 +0100)]
config: Remove workaround for old bash versions.

This is no longer necessary as we now require bash-4.3 or newer.

5 years agorequire bash-4.3
Andre Noll [Wed, 8 Mar 2017 07:38:56 +0000 (08:38 +0100)]
require bash-4.3

bash-4.3, released in 2014, is the oldest version which supports the
nameref variables and options. Ubuntu-14.04 already ships bash-4.3
so it should be OK to depend on it.

5 years agoconfig: Declare local config variables earlier.
Andre Noll [Mon, 17 Apr 2017 13:27:54 +0000 (15:27 +0200)]
config: Declare local config variables earlier.

In gsu_check_options() we declare the six option variables (name,
option_type, ...)  local to avoid overwriting the content of
user-defined variables of the same name.

Of course this only works if the variables are declared local before
we assign to them. This is currently not the case because the

eval "${gsu_options[$i]}"

statement in the first loop sets these variables before they are
declared in the body of the second loop.

This bug is benign since gsu_check_options() is usually called before
any command handler is executed. Let's fix it anyway.

5 years agoconfig: Fix braino in comment.
Andre Noll [Mon, 17 Apr 2017 13:16:51 +0000 (15:16 +0200)]
config: Fix braino in comment.

This was wrong since forever.

5 years agosubcommand: Make help text variables private.
Andre Noll [Sun, 5 Mar 2017 22:03:36 +0000 (23:03 +0100)]
subcommand: Make help text variables private.

It is unnecessary to export these as they are never needed in the
environment of subsequently executed commands. In fact, these variables
should be considered private to gsu. The name should thus start with
an underscore.

5 years agosubcommand: Move up gsu_getopts().
Andre Noll [Sun, 5 Mar 2017 21:39:20 +0000 (22:39 +0100)]
subcommand: Move up gsu_getopts().

It will soon be needed by com_man() which is above gsu_getopts()
at the moment, so move it up. Again, no changes.

5 years agosubcommand: Move gsu_check_arg_count().
Andre Noll [Sun, 5 Mar 2017 21:36:25 +0000 (22:36 +0100)]
subcommand: Move gsu_check_arg_count().

It is called from gsu_getopts() which is defined further up in the
file. This does not really matter in bash, but it is still confusing,
so let's move gsu_check_arg_count() up.

Pure code movement, no changes.

5 years agosubcommand: Do not duplicate options to com_prefs().
Andre Noll [Sun, 5 Mar 2017 21:57:10 +0000 (22:57 +0100)]
subcommand: Do not duplicate options to com_prefs().

5 years agosubcommand: Get rid of global $gsu_cmds.
Andre Noll [Sun, 5 Mar 2017 21:17:25 +0000 (22:17 +0100)]
subcommand: Get rid of global $gsu_cmds.

It is only used in _gsu_print_available_commands() so we may
make it local to this function.

5 years agosubcommand: Simplify gsu().
Andre Noll [Sun, 5 Mar 2017 21:13:53 +0000 (22:13 +0100)]
subcommand: Simplify gsu().

There is no need to special-case the four autocommands in the main
entry function gsu(). Dropping the undercore in the name of the
four command handlers allows to treat them in the same way as the
subcommands which are provided by the application.

5 years agosubcommand: Fix identation of code in com_man().
Andre Noll [Sun, 5 Mar 2017 21:50:29 +0000 (22:50 +0100)]
subcommand: Fix identation of code in com_man().

Some lines were indented with spaces rather than tabs. No semantic

5 years agosubcommand: Kill stray "cmt".
Andre Noll [Sun, 5 Mar 2017 21:58:26 +0000 (22:58 +0100)]
subcommand: Kill stray "cmt".

A leftover from old days where cmt (the cluster management tool) was
the only gsu application.

5 years agosubcommand: Use POSIX compatible command regex.
Andre Noll [Sun, 5 Mar 2017 18:55:13 +0000 (19:55 +0100)]
subcommand: Use POSIX compatible command regex.

The POSIX way to ask for one or more matches of the preceeding atom
is {1,} while the plus character is a non-portable shortcut.

Note that since the closing brace of the regex bound is inside
parameter expansion, we need to escape it with a backslash while the
opening brace must not be escaped.

5 years agoConvert README to markdown format.
Andre Noll [Mon, 6 Mar 2017 15:25:30 +0000 (16:25 +0100)]
Convert README to markdown format.

It used to be in grutatext format, and was converted to html with the
grutatxt perl script. The grutatxt project is dead, so let's switch
to markdown.

6 years agoREADME: Add documentation of $gsu_options.
Andre Noll [Tue, 7 Mar 2017 07:40:39 +0000 (08:40 +0100)]
README: Add documentation of $gsu_options.

For some reason this public variable was mentioned in the list of
public variables, but the list item lacked the description.

6 years agogsu_make_tempfile(): Avoid reading an unbound variable. next
Andre Noll [Thu, 28 Jul 2016 11:56:05 +0000 (13:56 +0200)]
gsu_make_tempfile(): Avoid reading an unbound variable.

If a gsu script

(a) enables the -u option to treat unset variables as
    an error for parameter expansion,
(b) does not set TMPDIR,
(c) calls gsu_make_tempfile(),

gsu_make_tempfile() fails with an "TMPDIR: unbound variable" error.

The code already contains a fallback for this case, so we can use
the :- construct to avoid the error and fall back to /tmp if TMPDIR
is unset or NULL.

7 years agoAdd gsu_make_tempfile() and fix bug in gui module.
Andre Noll [Wed, 20 Jan 2016 09:54:35 +0000 (10:54 +0100)]
Add gsu_make_tempfile() and fix bug in gui module.

While mkstemp(3) is required by POSIX.1-2001, mktemp(1) is not in POSIX
and the various Unixes ship different and incompatible implementations
of this command line utility.

This commit adds the new public gsu_make_tempfile() helper to the
common part of gsu and changes the gui module to use it.

The mktemp invocation in the gui module was buggy because it ran
mktemp with a relative template (no slash). Hence the temporary file
was created in the current working directory. Of course this fails
if $CWD is not writable. The new public function gets this right.

8 years agocommon: Allow undefined $gsu_errors.
Andre Noll [Tue, 3 Mar 2015 17:28:19 +0000 (18:28 +0100)]
common: Allow undefined $gsu_errors.

If this variable is undefined, and the nounset option is turned on
(set -u), gsu aborts early when setting up the gsu_error_txt array.

Fix this by using ${gsu_errors:-} instead of plain $gsu_errors to
allow for scripts without error codes.

Reported by Congmao Wang.

8 years agosubcommand: Avoid referencing possibly undefined $ret.
Andre Noll [Tue, 3 Mar 2015 17:21:06 +0000 (18:21 +0100)]
subcommand: Avoid referencing possibly undefined $ret.

If a subcommand does not set $ret (like the minimal "hello" example
does), and sets the nounset bash option (set -u), gsu aborts at
the attempt to reference $ret. Fix this flaw by setting $ret to
$GSU_SUCCESS prior to calling the subcommand.

Reported by Congmao Wang.

8 years ago_gsu_print_available_commands(): Don't abort if set -e is set.
Andre Noll [Tue, 3 Mar 2015 17:15:52 +0000 (18:15 +0100)]
_gsu_print_available_commands(): Don't abort if set -e is set.

It was pointed out by Congmao Wang that the example hello.bash script
prints only the first subcommand and exits if it is called with an
invalid subcommand and set -e is set. This is due to the "let count++"
statement which returns 1 in the first iteration of the loop since
count is zero.

This patch changes the statement to "let ++count" which returns zero
in all cases.

8 years agocommon: Fix gsu_is_a_number().
Andre Noll [Sat, 14 Feb 2015 20:17:53 +0000 (21:17 +0100)]
common: Fix gsu_is_a_number().

We must use [ ... ] in gsu_is_a_number() because arithmetic expansion
with ((...))  undergoes parameter and variable expansion. For example

gsu_is_a_number "$x"

will pass "foo" to gsu_is_a_number() where the expression  (("$1"))
tries to expand the (non-existing) variable foo, aborting the script
if set -u was given.

This bug was introduced a few month ago in commit 44860e92 (Use modern
style arithmetic evaluation everwhere).

8 years agoREADME: Move table of contents to the top of the document. maint
Andre Noll [Mon, 10 Nov 2014 10:13:46 +0000 (11:13 +0100)]
README: Move table of contents to the top of the document.

Without the "=====" markers it is printed at the bottom, which is not
very useful.

8 years agoREADME: Fix gitweb link.
Andre Noll [Mon, 10 Nov 2014 10:07:06 +0000 (11:07 +0100)]
README: Fix gitweb link.

The gitweb page is hosted by The ilm.eb.local
instance was used only for testing and no longer exists.

8 years agoAdd GSU logo.
Andre Noll [Thu, 9 Oct 2014 22:47:43 +0000 (22:47 +0000)]
Add GSU logo.

It's nice to have a logo for the GSU library. Here's a simple one
made with dia.

8 years agoAdd license.
Andre Noll [Sat, 27 Sep 2014 23:16:51 +0000 (23:16 +0000)]
Add license.

I've put 2006 as the copyright year since this was the date of the
first usable version of gsu. Hope that's OK.

8 years agoAdd README.
Andre Noll [Sat, 30 Aug 2014 12:46:37 +0000 (14:46 +0200)]

Up to now the API of gsu was completely undocumented. This commit
tries to improve on this. It adds a README file which explains the
public functions and variables of the three gsu modules (subcommand,
config and gui). Most features are illustrated by examples.

The README file is formatted in the grutatxt markup language, so it
can easily be converted to a nice html document.

Many thanks to George Wang who read an early draft of this document
and contributed many improvements.

8 years agosubcommand: Add documentation of gsu_complete_options().
Andre Noll [Thu, 4 Sep 2014 22:36:11 +0000 (00:36 +0200)]
subcommand: Add documentation of gsu_complete_options().

It's a public function that should be documented.

8 years agosubcommand: Fix two typos.
Andre Noll [Sat, 6 Sep 2014 00:08:36 +0000 (02:08 +0200)]
subcommand: Fix two typos.

8 years agogui: Use trap to make sure temporary files are removed.
Andre Noll [Sat, 13 Sep 2014 14:16:34 +0000 (16:16 +0200)]
gui: Use trap to make sure temporary files are removed.

Without this, killing the application might leave a temporary file.

8 years agogui: Introduce _set_dialog_ret().
Andre Noll [Sat, 6 Sep 2014 17:41:16 +0000 (19:41 +0200)]
gui: Introduce _set_dialog_ret().

The improved exit code handling for dialog(1) also makes sense for
the other invocations of dialog. This patch abtracts out the logic
into the new internal _set_dialog_ret() function.

8 years agogui: Add documentation of public functions.
Andre Noll [Sat, 6 Sep 2014 00:34:59 +0000 (02:34 +0200)]
gui: Add documentation of public functions.

The functions gsu_inputbox(), gsu_textbox() and gsu_msgbox() were not
documented at all. This commit adds summary, usage and a description
for each.

8 years agogui: Conform to $ret and $result conventions.
Andre Noll [Mon, 1 Sep 2014 22:23:41 +0000 (00:23 +0200)]
gui: Conform to $ret and $result conventions.

Unlike the rest of gsu, the functions of the gui module did not follow
the rule that functions should always set $ret to indicate error or
success, and $result to either the result of the function (if any)
or to an error context string. This commit makes all functions of
the gui module conform to this rule.

This patch also improves the error handling of _gsu_menu(). This
function should distinguish between three cases, according to the
exit code of dialog(1): OK (user selected the OK button), Cancel
(user pressed the escape key or selected the Cancel button), and error
(dialog(1) failed to execute or returned unsuccessfully).

The old code does not distinguish between the last two cases. Hence one
could not exit the application by pressing CTRL+C from a menu. This
patch changes _gsu_menu() to look more carefully at the exit code of
dialog(1) to tell apart the "error" case and the "cancel" case.

8 years agogui: Make $first a local variable of _get_subtree().
Andre Noll [Mon, 1 Sep 2014 22:20:21 +0000 (00:20 +0200)]
gui: Make $first a local variable of _get_subtree().

Apparently this was missed when the function was introduced. The
variable is only referenced in _get_subtree().

8 years agogui: Make _gsu_node_name_pattern private.
Andre Noll [Mon, 1 Sep 2014 21:58:29 +0000 (23:58 +0200)]
gui: Make _gsu_node_name_pattern private.

Conform to the convention that the name of a private variables should
start with an underscore character. Also there is no need to export
the variable.

8 years agogui: Make gsu_menu() private.
Andre Noll [Mon, 1 Sep 2014 21:54:09 +0000 (23:54 +0200)]
gui: Make gsu_menu() private.

Its single caller is _browse(), which is a private function as
well. This patch prepends an underscore to the function name to
indicate that the function is not supposed to be called by application

8 years agogui: Remove unused widgets.
Andre Noll [Mon, 1 Sep 2014 21:53:19 +0000 (23:53 +0200)]
gui: Remove unused widgets.

No application uses these public functions, so remove them for now.
They can be re-added on demand but for now they are just dead code.

8 years agoMerge branch 't/kill_pointless_subshell'
Andre Noll [Sat, 27 Sep 2014 23:00:45 +0000 (23:00 +0000)]
Merge branch 't/kill_pointless_subshell'

Cooking for almost a month.

* t/kill_pointless_subshell:
  subcommand: Overhaul _gsu_print_available_commands().

8 years agoMerge branch 't/default_gsu_dir'
Andre Noll [Sat, 27 Sep 2014 22:59:43 +0000 (22:59 +0000)]
Merge branch 't/default_gsu_dir'

Cooking for almost a month.

* t/default_gsu_dir:
  Unify gsu_dir handling.

8 years agoMerge branch 't/arithmetic_eval'
Andre Noll [Sat, 27 Sep 2014 22:58:16 +0000 (22:58 +0000)]
Merge branch 't/arithmetic_eval'

Cooking for almost a month.

* t/arithmetic_eval:
  Use modern style arithmetic evaluation everwhere.

8 years agoMerge branch 't/kill_gsu_self'
Andre Noll [Sat, 20 Sep 2014 08:09:24 +0000 (10:09 +0200)]
Merge branch 't/kill_gsu_self'

Cooking for three weeks.

* t/kill_gsu_self:
  Remove $_gsu_self.


8 years agoUse modern style arithmetic evaluation everwhere.
Andre Noll [Thu, 4 Sep 2014 07:01:48 +0000 (09:01 +0200)]
Use modern style arithmetic evaluation everwhere.

This is an equivalent transformation, and the new code is easier to
read and less error-prone.

8 years agoFix _gsu_banner_msg().
Andre Noll [Sun, 31 Aug 2014 17:06:40 +0000 (19:06 +0200)]
Fix _gsu_banner_msg().

This function did not print the banner at all. It also had only a
single caller. This patch removes the function and changes the single
caller to print the banner text.

8 years agoUnify gsu_dir handling.
Andre Noll [Sun, 31 Aug 2014 19:01:02 +0000 (21:01 +0200)]
Unify gsu_dir handling.

The three locations which include the common part of gsu need to know
the gsu installation directory. Currently we rely on the application
to set $gsu_dir. This is unnecessary since gsu can tell where it is
installed by examining ${BASH_SOURCE[0]}.

Also the fallback to $HOME/.gsu is not required. This commit unifies
all three locations and also calls _gsu_setup as early as possible:
when the gsu module is sourced.

8 years agoRemove $_gsu_self.
Andre Noll [Sun, 31 Aug 2014 16:54:09 +0000 (18:54 +0200)]
Remove $_gsu_self.

It has the same meaning as $gsu_name, so let's use $gsu_name
everywhere. Also avoid to call basename(1), as ${0##*/} does the same
and is cheaper.

8 years agosubcommand: Overhaul _gsu_print_available_commands().
Andre Noll [Sat, 30 Aug 2014 16:47:50 +0000 (18:47 +0200)]
subcommand: Overhaul _gsu_print_available_commands().

This function is rather confused. It uses gsu_short_msg() to print
the header to stderr while the list of subcommands is printed to
stdout. This is "fixed" by executing all commands in a subshell and
redirecting stderr to stdout.

It's easier to just print everything to stdout. This patch also
renames the loop variable i to cmd, declares $count as a local
integer variable and switches to single quoted string constants.

8 years agoMove all files to the top level directory.
Andre Noll [Sat, 30 Aug 2014 12:34:27 +0000 (14:34 +0200)]
Move all files to the top level directory.

With gsu being a separate repository, there is no point in burying
the gsu files below misc/gsu.

8 years agogsu: Document gsu().
Andre Noll [Fri, 29 Aug 2014 18:13:13 +0000 (20:13 +0200)]
gsu: Document gsu().

To get started, gsu application writers need to know how the gsu()
function works. So let's provide a small introduction here and a
minimal example.

8 years agogsu: Improve documentation of _gsu_get_command_regex().
Andre Noll [Tue, 26 Aug 2014 21:18:58 +0000 (23:18 +0200)]
gsu: Improve documentation of _gsu_get_command_regex().

Although this function is private, it is central to the subcommand
part of gsu and should thus be properly documented. The new text is
more precise about the meaning of the regular expression that is used
to identify subcommands.

8 years agogsu: Don't fail if HOME is unset.
Andre Noll [Tue, 26 Aug 2014 19:52:07 +0000 (21:52 +0200)]
gsu: Don't fail if HOME is unset.

As pointed out by Joffrey Fitz, gsu-based scripts do not work when
run as a user without home directory. This happens for example if
the script is executed through a web application as the www-data user.

This patch replaces all references to HOME by ${HOME:-}, i.e. we just
default to the empty string but don't fail immediately.

8 years agogsu: Mark get_geometry() as a private function.
Andre Noll [Tue, 26 Aug 2014 21:35:51 +0000 (23:35 +0200)]
gsu: Mark get_geometry() as a private function.

The function is not called from any scripts that currently use gsu.
This commit marks it private by prepending an underscore to its name.

8 years agogsu: Improve documentation of gsu_getopts().
Andre Noll [Mon, 25 Aug 2014 20:24:07 +0000 (22:24 +0200)]
gsu: Improve documentation of gsu_getopts().

The sentence which explains how $o_X is set for both types of options
was rather confusing. The new text should be better.

While we're at it,
* mention that getopts is a bash builtin
* switch to "modern" ((expr)) arithmetic evaluation in example
* use '' to quote constants in example

8 years agogsu: Improve help text of complete subcommand.
Andre Noll [Sun, 24 Aug 2014 14:57:08 +0000 (16:57 +0200)]
gsu: Improve help text of complete subcommand.

The current help text talks about two forms to run this command,
but only one is mentioned. This commit tries to clarify that the
function behaves differently when called without argument.

8 years agogsu: Fix quoting of config default options.
Andre Noll [Wed, 6 Aug 2014 14:44:43 +0000 (16:44 +0200)]
gsu: Fix quoting of config default options.

This makes newlines in the default of a gsu config option work.

8 years agogsu: Add missing declaration of a local variable.
Andre Noll [Wed, 30 Jul 2014 10:37:53 +0000 (12:37 +0200)]
gsu: Add missing declaration of a local variable.

"opt" is used but not declared local.

8 years agogsu: User banner text also for gsu gui.
Andre Noll [Fri, 16 May 2014 13:35:32 +0000 (15:35 +0200)]
gsu: User banner text also for gsu gui.

Currently the $gsu_banner_txt variable is used only for subcommand
utilities but not for dialog-based tools. There is no real reason for
this restriction, so this commit starts to use the variable also for
the various GUIs.

8 years agogsu/gui: Fix regex for tree walk.
Andre Noll [Wed, 16 Apr 2014 18:22:38 +0000 (18:22 +0000)]
gsu/gui: Fix regex for tree walk.

If one directory name is a suffix of another, the regex
for grep found both, which is bad.

8 years agogsu_gui: Add check for dialog executable.
Andre Noll [Fri, 13 Dec 2013 09:57:42 +0000 (10:57 +0100)]
gsu_gui: Add check for dialog executable.

Currently, programs which use gsu_gui exit silently with no indication about
what went wrong if dialog is not installed. This patch makes it print an error
message in this case.

8 years agoAdd gsu_gui.
Andre Noll [Fri, 23 Sep 2011 12:04:23 +0000 (14:04 +0200)]
Add gsu_gui.

The dialog-based shell library for earth-shaking graphical user
interfaces that don't suck.

Its main entry function gsu_gui() allows to pass a tree to control
the menus.

8 years agogsu: simplify banner message.
Andre Noll [Fri, 27 Jul 2012 08:59:08 +0000 (10:59 +0200)]
gsu: simplify banner message.

This was unnecessarily complex and caused an error if set -u
was used.

8 years agogsu: Avoid referencing an unset variable.
Andre Noll [Fri, 27 Jul 2012 08:58:12 +0000 (10:58 +0200)]
gsu: Avoid referencing an unset variable.

This causes an error if scripts use set -u.

8 years agogsu subcommand: Add gsu_get_unnamed_arg_num().
Andre Noll [Tue, 29 Nov 2011 22:28:51 +0000 (23:28 +0100)]
gsu subcommand: Add gsu_get_unnamed_arg_num().

This will be handy for many gsu applications.

8 years agogsu subcommand: Fix off-by-one bug in gsu_cword_is_option_parameter().
Andre Noll [Tue, 29 Nov 2011 22:26:48 +0000 (23:26 +0100)]
gsu subcommand: Fix off-by-one bug in gsu_cword_is_option_parameter().

We define $n as the number of characters in the getopt string *minus one*,
so we must loop from 0 to $n, inclusively.

This patch also adds documentation of this public function.

8 years agoFix gsu com_complete().
Andre Noll [Tue, 29 Nov 2011 13:02:48 +0000 (14:02 +0100)]
Fix gsu com_complete().

It should work also if set -u was given. Currently this fails if
_com_complete() is called with no arguments.

Moreover, the first argument, if it is provided, should be a number
but we missed to check this.

8 years agogsu subcommand: Use gsu_getopts.
Andre Noll [Sun, 9 Oct 2011 16:52:03 +0000 (18:52 +0200)]
gsu subcommand: Use gsu_getopts.

This makes the prefs command error out on invalid options
and avoids the expansion of the possibly unset parameter $1.

8 years agogsu_getopts: Rename local variable opt to _gsu_getopts_opt.
Andre Noll [Wed, 12 Oct 2011 08:26:38 +0000 (10:26 +0200)]
gsu_getopts: Rename local variable opt to _gsu_getopts_opt.

As pointed out by Sebastian Stark, calling the loop variable "opt"
in code which is supposed to be eval'd by the application may conflict
with another local variable of the same name defined in the function
which calls gsu_getopt().

This could lead to rather obscure bugs which are hard to detect.
The callers don't use this loop variable directly, so we are free
to call it whatever we want. Therefore this patch renames $opt to
something which is much less likely to cause a conflict.

8 years agogsu: Avoid parameter expansion on unset variables.
Andre Noll [Sun, 9 Oct 2011 11:18:29 +0000 (13:18 +0200)]
gsu: Avoid parameter expansion on unset variables.

This patch allows to run scripts which use gsu with bash's -u option
enabled. This is mostly useful to spot bugs due to typos in variable

8 years agogsu: Overhaul of the rexexp matching for help commands.
Andre Noll [Thu, 29 Sep 2011 13:12:33 +0000 (15:12 +0200)]
gsu: Overhaul of the rexexp matching for help commands.

The old sed scripts were unreadable and broken on non-gnu systems
since they made use of some gnuisms of grep and sed like \+ in regular
expressions to match at least one character or sed's T command which
jumps to a label if no substitution has been made since the most
recent reading of an input line.

This patch switches to extended regular expressions and replaces all
broken sed scripts by portable ones, which are known to work at least
on FreeBSD and MacOS. The new scripts are commented verbosely so that
any subsequent changes do not require a full rewrite, hopefully.

8 years agogsu: Initial completion support.
Andre Noll [Fri, 23 Sep 2011 15:21:58 +0000 (17:21 +0200)]
gsu: Initial completion support.

This adds the framework for command completion of scripts which make
use of the gsu subcommand library. The idea is to implement as much
as possible as generic helpers within gsu in order to minimize code
duplication in the scripts which source the gsu library.

The new "complete" subcommand is automatically included in each
application, just like the help, man and prefs commands we already
have. This subommand is meant to be used as the completer which calls
the custom subcommand completers included in the application.

Two new public helper functions, gsu_complete_options() and
gsu_cword_is_option_parameter() are introduced in this commit.

The former function takes a usual getopt string and completes according
to all options in this string. The latter is useful for completers
which need to determine whether the current word is the parameter to
some option in order to find out how to complete the current word.

For example, the -s option of cmt's vmem command takes a mandatory
parameter which is a number. So the completer for this command must
complete differently depending on whether the previous word is "-s".

8 years agogsu: Don't export functions.
Andre Noll [Wed, 28 Sep 2011 14:47:46 +0000 (16:47 +0200)]
gsu: Don't export functions.

This is no longer necessary now that all gsu scripts include the gsu
shell library directly.

8 years agoSplit gsu.
Andre Noll [Fri, 23 Sep 2011 12:03:38 +0000 (14:03 +0200)]
Split gsu.

This patch splits the gsu file into two files for config parsing and
subcommand handling respectively.  Each part may be used independently
of the other.

Moreover, all scripts which use gsu now include the needed parts
directly rather than relying on the shell to have already sourced
the needed gsu files. This shortens bash startup time and makes gsu
easier to use for people whose login shell is not bash.

8 years agoAllow hyphens in command names.
Andre Noll [Tue, 2 Aug 2011 13:12:48 +0000 (15:12 +0200)]
Allow hyphens in command names.

There is no reason to forbid subcommands with hyphens, and sometimes
it is just natural have such a command. For instance if the subcommand
wraps an existing command with a hyphen like "apt-get".

So change the regular expression for subcommands accordingly.

8 years agogsu: Avoid duplication of command regex.
Andre Noll [Tue, 2 Aug 2011 13:09:21 +0000 (15:09 +0200)]
gsu: Avoid duplication of command regex.

The regular expression for fining the subcommands was duplicated
four times in gsu. Needless to say that this resulted in more than
one variant of the expression...

Avoid this duplication by introducing the global gsu_command_regex
variable. While at it, use a more clever sed command in
_gsu_available_commands() which allows to kill a grep command.

8 years agogsu: Set copyright year to 2011.
Andre Noll [Tue, 2 Aug 2011 12:42:22 +0000 (14:42 +0200)]
gsu: Set copyright year to 2011.

8 years agogsu: Fix handling of config options with newlines.
Andre Noll [Sun, 27 Mar 2011 09:49:35 +0000 (11:49 +0200)]
gsu: Fix handling of config options with newlines.

Without this, newlines are transformed into spaces.

8 years agogsu: Don't use the =~ operator.
Andre Noll [Thu, 25 Nov 2010 16:36:23 +0000 (17:36 +0100)]
gsu: Don't use the =~ operator.

I need it at least on one machine that still has only bash-2.

8 years agogsu_getopts: Abort on programming errors and add documentation.
Andre Noll [Sun, 24 Oct 2010 09:59:46 +0000 (11:59 +0200)]
gsu_getopts: Abort on programming errors and add documentation.

8 years agogsu: Introduce gsu_getopts().
Andre Noll [Sun, 24 Oct 2010 09:28:23 +0000 (11:28 +0200)]
gsu: Introduce gsu_getopts().

No users yet.

8 years agogsu: Remove check on bash version.
Andre Noll [Fri, 15 Oct 2010 16:20:18 +0000 (18:20 +0200)]
gsu: Remove check on bash version.

It hurts more than the possible incompatibilities.