On Fri, Mar 8, 2019 at 2:09 AM Christoph Biedl
<debian.a...@manchmal.in-ulm.de> wrote:
>
> Control: 922624 -patch
> Control: 922642 +patch
>
> Beware, this should go to #922642 not #922624. Changelog (below) still
> needs to be adjusted.
>
>     Christoph
>
> Dmitry Bogatov wrote...
>
> control: tags -1 +patch
>
> Hello! Here is debdiff with implementation of proposal -- `execlineb' is
> moved to /usr/bin and it includes /usr/lib/execline/bin into PATH. Every
> binary in /usr/bin needs a manual, so I conjured one with `help2man',
> but it definitely need polishing.
>
> Thank you for packaging and maintaining `execline'.
>
> diff -Nru execline-2.5.0.1/debian/changelog execline-2.5.0.1/debian/changelog
> --- execline-2.5.0.1/debian/changelog   2019-02-08 14:36:23.000000000 +0000
> +++ execline-2.5.0.1/debian/changelog   2019-03-06 17:53:53.000000000 +0000
> @@ -1,3 +1,11 @@
> +execline (2.5.0.1-4) UNRELEASED; urgency=medium
> +
> +  * Add `/usr/lib/execline/bin' into PATH for scripts, invoked by 
> `execlineb'.
> +    (Closes: #922624)
> +  * Move execlineb into `/usr/bin'.
> +
> + -- Dmitry Bogatov <kact...@debian.org>  Wed, 06 Mar 2019 17:53:53 +0000
> +
>  execline (2.5.0.1-3) unstable; urgency=medium
>
>    * Add dep8 autopkgtest script
> diff -Nru execline-2.5.0.1/debian/execlineb.1 
> execline-2.5.0.1/debian/execlineb.1
> --- execline-2.5.0.1/debian/execlineb.1 1970-01-01 00:00:00.000000000 +0000
> +++ execline-2.5.0.1/debian/execlineb.1 2019-03-06 17:53:53.000000000 +0000
> @@ -0,0 +1,401 @@
> +.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.8.
> +.TH EXECLINEB "1" "March 2019" "Debian" "User Commands"
> +.SH NAME
> +execlineb \- manual page for execlineb execline
> +.SH DESCRIPTION
> +execline
> +Software
> +skarnet.org
> +.PP
> +The execlineb program
> +.PP
> +execlineb reads and executes a script.
> +.PP
> +Interface
> +.IP
> +execlineb [ \fB\-q\fR | \fB\-w\fR | \fB\-W\fR ] [ \fB\-p\fR | \fB\-P\fR | 
> \fB\-S\fR nmin | \fB\-s\fR nmin ] \fB\-c\fR script [ args... ]
> +.PP
> +or
> +.IP
> +execlineb [ \fB\-q\fR | \fB\-w\fR | \fB\-W\fR ] [ \fB\-p\fR | \fB\-P\fR | 
> \fB\-S\fR nmin | \fB\-s\fR nmin ] scriptfile [ args... ]
> +.PP
> +or in an executable file:
> +.PP
> +#!/command/execlineb [ \fB\-qwWpPSnmin\fR ]
> +script
> +.PP
> +Parsing phase.
> +.IP
> +* execlineb reads and parses the script it is given. It exits 100 on a
> +.IP
> +syntax error and 111 on a temporary error. It makes an argv, i.e. a
> +system command line, with the parsed script. If the argv is empty,
> +execlineb exits 0.
> +.PP
> +Environment management phase.
> +.IP
> +* Pushing the current stack frame. If none of the \fB\-p\fR, \fB\-P\fR, 
> \fB\-S\fR or \fB\-s\fR
> +.IP
> +options is set: execlineb pushes the current positional parameters,
> +i.e. environment variables that start with #, 0, 1, ..., 9. To get the
> +previous values back, use emptyenv \fB\-P\fR.
> +.IP
> +* Setting the new stack frame. If none of the \fB\-P\fR, \fB\-S\fR or 
> \fB\-s\fR options is
> +.IP
> +set:
> +.IP
> ++ execlineb sets the # environment variable to the number n of args
> +.IP
> +it is given.
> +.IP
> ++ It sets the 0 environment variable to the name of the script \- or
> +.IP
> +to the execlineb invocation name if the \fB\-c\fR option is used.
> +.IP
> ++ It sets the 1, 2, ... n environment variables to the different
> +.IP
> +args.
> +.PP
> +Execution phase.
> +.IP
> +* execlineb executes into the argv it has built from the script. There
> +.IP
> +is only one command line for the whole script: the execlineb binary is
> +a launcher, whose sole purpose is to execute into that command line.
> +It does not stay in memory like a traditional interpreter would.
> +.PP
> +Options
> +.IP
> +* \fB\-c\fR script : execute script, do not look for a file.
> +.PP
> +See below for the other options.
> +.PP
> +Syntax of scripts
> +.PP
> +An execlineb script is a string that must not contain the null character.
> +execlineb parses it and divides it into words. The parser recognizes the
> +following components:
> +.IP
> +* whitespace is defined as spaces, tabs, newlines and carriage returns.
> +.IP
> +Words are always separated by whitespace.
> +.IP
> +* A quoted string begins with a doublequote (") and ends with another
> +.IP
> +doublequote. Quoted doublequotes must be prefixed by a backslash (\e).
> +Quoted strings always evaluate to exactly one word. For instance, ""
> +evaluates to the empty word.
> +.IP
> +* The \ea, \eb, \et, \en, \ev, \ef, and \er sequences are recognized in 
> quoted
> +.IP
> +strings, and are converted to the ASCII numbers 7, 8, 9, 10, 11, 12
> +and 13 respectively.
> +.IP
> +* Inside a quoted string, backslashed newlines disappear completely.
> +* \e0xab sequences are recognized in quoted strings and evaluate to ASCII
> +.IP
> +hexadecimal number ab.
> +.IP
> +* \e0abc sequences are recognized in quoted strings and evaluate to ASCII
> +.IP
> +octal number abc.
> +.IP
> +* \eabc sequences are recognized in quoted strings and evaluate to ASCII
> +.IP
> +decimal number abc. a must not be zero.
> +.IP
> +* A comment starts with a # and ends with the line. Comments are not
> +.IP
> +recognized inside quoted strings.
> +.IP
> +* Anything else is an unquoted string, that can evaluate to zero or more
> +.IP
> +words.
> +.IP
> +* Any character can be escaped in unquoted strings by prepending it with
> +.IP
> +a backslash. It works the same way in quoted strings, except for the
> +special sequences described above.
> +.PP
> +You can see an example of distinct execlineb components here.
> +.PP
> +In addition to that simple lexing, execlineb performs the following
> +higher\-level parsing:
> +.IP
> +* A word consisting of a single opening brace ({) increments an internal
> +.IP
> +level counter, blevel, and disappears from the argv. Quoted open
> +braces do not have that behaviour.
> +.IP
> +* A word consisting of a single closing brace (}) decrements blevel, and
> +.IP
> +is replaced with the empty word. Quoted closing braces do not have
> +that behaviour.
> +.IP
> +* If execlineb finds that braces are unmatched (i.e. blevel goes below 0
> +.IP
> +during the parsing, or is not 0 at the end of the script), it exits
> +100 with an error message.
> +.IP
> +* execlineb automatically quotes blocks. Which means that everytime it
> +.IP
> +finds a word, it prepends it with blevel spaces.
> +.PP
> +For proper execution, the sequence of words must follow the execline
> +grammar.
> +.PP
> +Options for block syntax checking
> +.PP
> +External execline commands that read blocks, like foreground, use the
> +EXECLINE_STRICT environment variable: if it is set to 1, they will print a
> +warning message on stderr if they find their blocks not to be properly
> +quoted. If it is set to 2, they will also die. If it is set to 0, or
> +unset, they won't complain at all.
> +.PP
> +Normally the EXECLINE_STRICT environment variable is inherited from the
> +caller. You can force it unset, set to 1, or set to 2 by giving
> +respectively the \fB\-q\fR, \fB\-w\fR or \fB\-W\fR option to execlineb.
> +.PP
> +Options for environment management
> +.PP
> +Normally, execline scripts are reentrant: environment variables
> +potentially overwritten by execlineb, such as # or 0, are pushed. This is
> +the standard, safe behaviour. Nevertheless, it is rather costly, and may
> +be unneeded for small scripts: for those cases, execline comes with two
> +options that bypass the environment management. Be warned that the purpose
> +of these options is optimization, and you should not use them if you're
> +not familiar with the way execlineb uses the environment to store
> +positional parameters. Alternatively, there's also an integrated
> +substitution mechanism that doesn't make use of the environment at all.
> +.IP
> +* The \fB\-p\fR option will bypass the push phase: the current frame of
> +.IP
> +positional parameters will be overwritten. The script will not be
> +reentrant.
> +.IP
> +* The \fB\-P\fR option will bypass positional parameter handling completely:
> +.IP
> +the environment will not be pushed, and positional parameters will be
> +ignored. execlineb \fB\-P\fR \fB\-c\fR "script" is equivalent to, but more 
> efficient
> +than, execlineb \fB\-c\fR "emptyenv \fB\-P\fR script". You should use the 
> \fB\-P\fR option
> +only in standalone scripts that take no arguments, such as s6's or
> +runit's run scripts.
> +.IP
> +* The \fB\-S\fR nmin option will substitute the positional parameters \- up 
> to
> +.IP
> +at least nmin \- but will not push nor set environment variables.
> +execlineb \fB\-S3\fR \fB\-c\fR "script" is equivalent to, but more efficient 
> than,
> +execlineb \fB\-c\fR "elgetpositionals \fB\-P3\fR emptyenv \fB\-P\fR script". 
> See the
> +details.
> +.IP
> +* The \fB\-s\fR nmin option behaves just like the \fB\-S\fR option, except 
> that it
> +.IP
> +defines $@ as the rest of the command line after nmin arguments have
> +been removed.
> +.PP
> +Current limitations
> +.PP
> +execlineb builds and executes a unique argv with the script: hence scripts
> +are subject to OS\-dependent limitations such as the kernel buffer size for
> +argv and envp \- at least 64 kB on most systems. This means that execlineb
> +cannot execute arbitrarily large scripts. Be careful with deeply nested
> +scripts too: without the \fB\-p\fR/\-P/\-S/\-s option, each execlineb 
> invocation
> +uses up some space in the environment.
> +.PP
> +Software
> +skarnet.org
> +.PP
> +The execlineb program
> +.PP
> +execlineb reads and executes a script.
> +.PP
> +Interface
> +.IP
> +execlineb [ \fB\-q\fR | \fB\-w\fR | \fB\-W\fR ] [ \fB\-p\fR | \fB\-P\fR | 
> \fB\-S\fR nmin | \fB\-s\fR nmin ] \fB\-c\fR script [ args... ]
> +.PP
> +or
> +.IP
> +execlineb [ \fB\-q\fR | \fB\-w\fR | \fB\-W\fR ] [ \fB\-p\fR | \fB\-P\fR | 
> \fB\-S\fR nmin | \fB\-s\fR nmin ] scriptfile [ args... ]
> +.PP
> +or in an executable file:
> +.PP
> +#!/command/execlineb [ \fB\-qwWpPSnmin\fR ]
> +script
> +.PP
> +Parsing phase.
> +.IP
> +* execlineb reads and parses the script it is given. It exits 100 on a
> +.IP
> +syntax error and 111 on a temporary error. It makes an argv, i.e. a
> +system command line, with the parsed script. If the argv is empty,
> +execlineb exits 0.
> +.PP
> +Environment management phase.
> +.IP
> +* Pushing the current stack frame. If none of the \fB\-p\fR, \fB\-P\fR, 
> \fB\-S\fR or \fB\-s\fR
> +.IP
> +options is set: execlineb pushes the current positional parameters,
> +i.e. environment variables that start with #, 0, 1, ..., 9. To get the
> +previous values back, use emptyenv \fB\-P\fR.
> +.IP
> +* Setting the new stack frame. If none of the \fB\-P\fR, \fB\-S\fR or 
> \fB\-s\fR options is
> +.IP
> +set:
> +.IP
> ++ execlineb sets the # environment variable to the number n of args
> +.IP
> +it is given.
> +.IP
> ++ It sets the 0 environment variable to the name of the script \- or
> +.IP
> +to the execlineb invocation name if the \fB\-c\fR option is used.
> +.IP
> ++ It sets the 1, 2, ... n environment variables to the different
> +.IP
> +args.
> +.PP
> +Execution phase.
> +.IP
> +* execlineb executes into the argv it has built from the script. There
> +.IP
> +is only one command line for the whole script: the execlineb binary is
> +a launcher, whose sole purpose is to execute into that command line.
> +It does not stay in memory like a traditional interpreter would.
> +.PP
> +Options
> +.IP
> +* \fB\-c\fR script : execute script, do not look for a file.
> +.PP
> +See below for the other options.
> +.PP
> +Syntax of scripts
> +.PP
> +An execlineb script is a string that must not contain the null character.
> +execlineb parses it and divides it into words. The parser recognizes the
> +following components:
> +.IP
> +* whitespace is defined as spaces, tabs, newlines and carriage returns.
> +.IP
> +Words are always separated by whitespace.
> +.IP
> +* A quoted string begins with a doublequote (") and ends with another
> +.IP
> +doublequote. Quoted doublequotes must be prefixed by a backslash (\e).
> +Quoted strings always evaluate to exactly one word. For instance, ""
> +evaluates to the empty word.
> +.IP
> +* The \ea, \eb, \et, \en, \ev, \ef, and \er sequences are recognized in 
> quoted
> +.IP
> +strings, and are converted to the ASCII numbers 7, 8, 9, 10, 11, 12
> +and 13 respectively.
> +.IP
> +* Inside a quoted string, backslashed newlines disappear completely.
> +* \e0xab sequences are recognized in quoted strings and evaluate to ASCII
> +.IP
> +hexadecimal number ab.
> +.IP
> +* \e0abc sequences are recognized in quoted strings and evaluate to ASCII
> +.IP
> +octal number abc.
> +.IP
> +* \eabc sequences are recognized in quoted strings and evaluate to ASCII
> +.IP
> +decimal number abc. a must not be zero.
> +.IP
> +* A comment starts with a # and ends with the line. Comments are not
> +.IP
> +recognized inside quoted strings.
> +.IP
> +* Anything else is an unquoted string, that can evaluate to zero or more
> +.IP
> +words.
> +.IP
> +* Any character can be escaped in unquoted strings by prepending it with
> +.IP
> +a backslash. It works the same way in quoted strings, except for the
> +special sequences described above.
> +.PP
> +You can see an example of distinct execlineb components here.
> +.PP
> +In addition to that simple lexing, execlineb performs the following
> +higher\-level parsing:
> +.IP
> +* A word consisting of a single opening brace ({) increments an internal
> +.IP
> +level counter, blevel, and disappears from the argv. Quoted open
> +braces do not have that behaviour.
> +.IP
> +* A word consisting of a single closing brace (}) decrements blevel, and
> +.IP
> +is replaced with the empty word. Quoted closing braces do not have
> +that behaviour.
> +.IP
> +* If execlineb finds that braces are unmatched (i.e. blevel goes below 0
> +.IP
> +during the parsing, or is not 0 at the end of the script), it exits
> +100 with an error message.
> +.IP
> +* execlineb automatically quotes blocks. Which means that everytime it
> +.IP
> +finds a word, it prepends it with blevel spaces.
> +.PP
> +For proper execution, the sequence of words must follow the execline
> +grammar.
> +.PP
> +Options for block syntax checking
> +.PP
> +External execline commands that read blocks, like foreground, use the
> +EXECLINE_STRICT environment variable: if it is set to 1, they will print a
> +warning message on stderr if they find their blocks not to be properly
> +quoted. If it is set to 2, they will also die. If it is set to 0, or
> +unset, they won't complain at all.
> +.PP
> +Normally the EXECLINE_STRICT environment variable is inherited from the
> +caller. You can force it unset, set to 1, or set to 2 by giving
> +respectively the \fB\-q\fR, \fB\-w\fR or \fB\-W\fR option to execlineb.
> +.PP
> +Options for environment management
> +.PP
> +Normally, execline scripts are reentrant: environment variables
> +potentially overwritten by execlineb, such as # or 0, are pushed. This is
> +the standard, safe behaviour. Nevertheless, it is rather costly, and may
> +be unneeded for small scripts: for those cases, execline comes with two
> +options that bypass the environment management. Be warned that the purpose
> +of these options is optimization, and you should not use them if you're
> +not familiar with the way execlineb uses the environment to store
> +positional parameters. Alternatively, there's also an integrated
> +substitution mechanism that doesn't make use of the environment at all.
> +.IP
> +* The \fB\-p\fR option will bypass the push phase: the current frame of
> +.IP
> +positional parameters will be overwritten. The script will not be
> +reentrant.
> +.IP
> +* The \fB\-P\fR option will bypass positional parameter handling completely:
> +.IP
> +the environment will not be pushed, and positional parameters will be
> +ignored. execlineb \fB\-P\fR \fB\-c\fR "script" is equivalent to, but more 
> efficient
> +than, execlineb \fB\-c\fR "emptyenv \fB\-P\fR script". You should use the 
> \fB\-P\fR option
> +only in standalone scripts that take no arguments, such as s6's or
> +runit's run scripts.
> +.IP
> +* The \fB\-S\fR nmin option will substitute the positional parameters \- up 
> to
> +.IP
> +at least nmin \- but will not push nor set environment variables.
> +execlineb \fB\-S3\fR \fB\-c\fR "script" is equivalent to, but more efficient 
> than,
> +execlineb \fB\-c\fR "elgetpositionals \fB\-P3\fR emptyenv \fB\-P\fR script". 
> See the
> +details.
> +.IP
> +* The \fB\-s\fR nmin option behaves just like the \fB\-S\fR option, except 
> that it
> +.IP
> +defines $@ as the rest of the command line after nmin arguments have
> +been removed.
> +.PP
> +Current limitations
> +.PP
> +execlineb builds and executes a unique argv with the script: hence scripts
> +are subject to OS\-dependent limitations such as the kernel buffer size for
> +argv and envp \- at least 64 kB on most systems. This means that execlineb
> +cannot execute arbitrarily large scripts. Be careful with deeply nested
> +scripts too: without the \fB\-p\fR/\-P/\-S/\-s option, each execlineb 
> invocation
> +uses up some space in the environment.
> diff -Nru execline-2.5.0.1/debian/execline.manpages 
> execline-2.5.0.1/debian/execline.manpages
> --- execline-2.5.0.1/debian/execline.manpages   1970-01-01 00:00:00.000000000 
> +0000
> +++ execline-2.5.0.1/debian/execline.manpages   2019-03-06 17:53:53.000000000 
> +0000
> @@ -0,0 +1 @@
> +debian/execlineb.1
> diff -Nru execline-2.5.0.1/debian/patches/move-execlineb-to-usr.patch 
> execline-2.5.0.1/debian/patches/move-execlineb-to-usr.patch
> --- execline-2.5.0.1/debian/patches/move-execlineb-to-usr.patch 1970-01-01 
> 00:00:00.000000000 +0000
> +++ execline-2.5.0.1/debian/patches/move-execlineb-to-usr.patch 2019-03-06 
> 17:53:53.000000000 +0000
> @@ -0,0 +1,48 @@
> +--- a/src/execline/execlineb.c
> ++++ b/src/execline/execlineb.c
> +@@ -12,6 +12,7 @@
> + #include <skalibs/djbunix.h>
> + #include <skalibs/skamisc.h>
> + #include <execline/execline.h>
> ++#include <stdlib.h>
> + #include "exlsn.h"
> +
> + #define USAGE "execlineb [ -p | -P | -S nmin | -s nmin ] [ -q | -w | -W ] [ 
> -c commandline ] script args"
> +@@ -64,6 +65,27 @@ static int myexlp (stralloc *sa, char co
> +   return -1 ;
> + }
> +
> ++/* Add /usr/lib/execline/bin into PATH. See #922642. */
> ++static int adjust_path(const char *const *envp, stralloc *modif)
> ++{
> ++  size_t oldlen = modif->len;
> ++  const char *old = env_get2(envp, "PATH");
> ++  stralloc new = STRALLOC_ZERO;
> ++
> ++  if (!old) return 1 ;
> ++
> ++  if (!stralloc_cats(&new, "/usr/lib/execline/bin:")
> ++   || !stralloc_cats(&new, old)
> ++   || !env_addmodif(modif, "PATH", new.s)
> ++   || setenv("PATH", new.s, 1) == -1)
> ++  {
> ++    stralloc_free(&new);
> ++    modif->len = oldlen;
> ++    return 0;
> ++  }
> ++  return 1;
> ++}
> ++
> + int main (int argc, char const *const *argv, char const *const *envp)
> + {
> +   stralloc sa = STRALLOC_ZERO ;
> +@@ -133,6 +155,9 @@ int main (int argc, char const *const *a
> +       goto errenv ;
> +   }
> +
> ++  if (!adjust_path(envp, &modif))
> ++    goto errenv ;
> ++
> +   if (flagpushenv == 3 || flagpushenv == 4)
> +   {
> +     if (flagstrict && ((unsigned int)argc < nmin))
> diff -Nru execline-2.5.0.1/debian/patches/series 
> execline-2.5.0.1/debian/patches/series
> --- execline-2.5.0.1/debian/patches/series      2019-02-08 14:36:23.000000000 
> +0000
> +++ execline-2.5.0.1/debian/patches/series      2019-03-06 17:53:53.000000000 
> +0000
> @@ -1,2 +1,3 @@
>  0001-fix-library-symlink-referencing.patch
>  0002-move-lskarnet-from-a-makefile-dependency-to-EXTRA_LI.patch
> +move-execlineb-to-usr.patch
> diff -Nru execline-2.5.0.1/debian/rules execline-2.5.0.1/debian/rules
> --- execline-2.5.0.1/debian/rules       2019-02-08 14:36:23.000000000 +0000
> +++ execline-2.5.0.1/debian/rules       2019-03-06 17:53:53.000000000 +0000
> @@ -19,6 +19,11 @@
>
>  override_dh_auto_configure-indep:
>  override_dh_auto_build-indep:
> -override_dh_auto_install-indep:
> +override_dh_auto_install:
>         mkdir -p debian/tmp/usr/share/doc/execline
>         cp -aT doc debian/tmp/usr/share/doc/execline
> +       dh_auto_install
> +       mkdir -p debian/execline/usr/bin
> +       mv debian/tmp/usr/lib/execline/bin/execlineb \
> +         debian/execline/usr/bin
> +
> --
>         Note, that I send and fetch email in batch, once every 24 hours.
>                  If matter is urgent, try https://t.me/kaction
>                                                                              
> --


Thanks for the patch, it looks good to me. But I think I would apply
it after buster.

-- 
Shengjing Zhu

Reply via email to