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