* Export arrays for 'sh' code blocks when using bash @ 2014-03-27 10:26 Pascal Fleury 2014-03-27 17:43 ` Eric Schulte 0 siblings, 1 reply; 26+ messages in thread From: Pascal Fleury @ 2014-03-27 10:26 UTC (permalink / raw) To: emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 2084 bytes --] Hello, I'dl like to propose a patch for inclusion into org-mode (ob-shell.el in particular). *TL;DR:* use arrays and associative arrays when exporting variables to bash in 'sh' code blocks. *Details:* When variables are defined in a 'sh' code block, they are exported as strings. when the variable itself is an array or a table, then we simply get a shell variable that contains the list of all values in a non-structured form. E.g. #+NAME: my_list | one | | two | | three | #+NAME: experiment | name | first_attempt | | date | [2014-03-27 Thu] | | user | fleury | #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var table=config echo ${scalar} # -> prints 'some value' echo ${array} # -> prints 'one two three' echo ${table} # -> prints 'first attempt [2014-03-27 Thu] fleury' #+END_SRC This will print simple strings. Also, there is no easy way to access the date of the experiment, for example. Now bash has things like arrays and associative arrays, but the current ob-shell.el does not use these. Probably because their syntax is bash-specific, and ob-shell.el is shell-agnostic. My patch (attached) changes this in the case you have (setq org-babel-sh-command "bash") in your emacs config somewhere. If any other value is used, it continues to export them as we do today (I don't know enough about other shells). In that case, it will export the list as an array, the table as an associative array, and the scalar as it does already. So the 'sh' code block could then use #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var table=config echo ${scalar} echo ${array[1]} # -> prints "two" echo ${table[user]} # -> prints "fleury" #+END_SRC In the case we have a bigger table, then the first row is used as key, the others are represented as a string with all the values (as it is for array currently). bash does not have multi-dimensional arrays, so it needs to be a string. This makes writing shell snippets much easier in my experience, and there I'd like to propose this fix for the org-mode community at large. --paf [-- Attachment #1.2: Type: text/html, Size: 3882 bytes --] [-- Attachment #2: orgmode-bash.patch --] [-- Type: text/x-patch, Size: 2036 bytes --] diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el index 3ede701..0a691e2 100644 --- a/lisp/ob-shell.el +++ b/lisp/ob-shell.el @@ -106,6 +106,30 @@ This function is called by `org-babel-execute-src-block'." ;; helper functions +(defun org-babel-variable-assignments:bash_array (varname values &optional sep hline) + "Returns a list of statements declaring the values as a bash array." + (format "declare -a %s=( \"%s\" )" + varname + (mapconcat 'identity + (mapcar + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) + values) + "\" \""))) + +(defun org-babel-variable-assignments:bash_associative (varname values &optional sep hline) + "Returns a list of statements declaring the values as bash associative array." + (format "declare -A %s\n%s" + varname + (mapconcat 'identity + (mapcar + (lambda (items) + (format "%s[\"%s\"]=%s" + varname + (org-babel-sh-var-to-sh (car items) sep hline) + (org-babel-sh-var-to-sh (cdr items) sep hline))) + values) + "\n"))) + (defun org-babel-variable-assignments:sh (params) "Return list of shell statements assigning the block's variables." (let ((sep (cdr (assoc :separator params))) @@ -114,9 +138,17 @@ This function is called by `org-babel-execute-src-block'." "hline")))) (mapcar (lambda (pair) - (format "%s=%s" - (car pair) - (org-babel-sh-var-to-sh (cdr pair) sep hline))) + (if (and (string= org-babel-sh-command "bash") (listp (cdr pair))) + (if (listp (car (cdr pair))) + (org-babel-variable-assignments:bash_associative + (car pair) (cdr pair) sep hline) + (org-babel-variable-assignments:bash_array + (car pair) (cdr pair) sep) hline) + (format "%s=%s" + (car pair) + (org-babel-sh-var-to-sh (cdr pair) sep hline)) + ) + ) (mapcar #'cdr (org-babel-get-header params :var))))) (defun org-babel-sh-var-to-sh (var &optional sep hline) ^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-03-27 10:26 Export arrays for 'sh' code blocks when using bash Pascal Fleury @ 2014-03-27 17:43 ` Eric Schulte 2014-03-27 22:52 ` Pascal Fleury 0 siblings, 1 reply; 26+ messages in thread From: Eric Schulte @ 2014-03-27 17:43 UTC (permalink / raw) To: Pascal Fleury; +Cc: emacs-orgmode Hi Pascal, This looks like a good patch. If I could make three changes/requests. 1. This patch should also work for "begin_src bash" code blocks. After a very quick glance it doesn't appear to. 2. Could you include one or two tests ensuring that this patch does what it intends with bash code blocks, and does not affect code blocks executed with bin/sh? 3. Large contributions like this require some FSF paperwork. Please see the following page for information on requirements to contribute. http://orgmode.org/worg/org-contribute.html Thanks, and I look forward to seeing this merged into Org-mode! Eric Pascal Fleury <fleury@google.com> writes: > Hello, > > I'dl like to propose a patch for inclusion into org-mode (ob-shell.el in > particular). > > *TL;DR:* use arrays and associative arrays when exporting variables to bash > in 'sh' code blocks. > > *Details:* > When variables are defined in a 'sh' code block, they are exported as > strings. when the variable itself is an array or a table, then we simply > get a shell variable that contains the list of all values in a > non-structured form. E.g. > > #+NAME: my_list > | one | > | two | > | three | > > #+NAME: experiment > | name | first_attempt | > | date | [2014-03-27 Thu] | > | user | fleury | > > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var table=config > echo ${scalar} # -> prints 'some value' > echo ${array} # -> prints 'one two three' > echo ${table} # -> prints 'first attempt [2014-03-27 Thu] fleury' > #+END_SRC > > This will print simple strings. Also, there is no easy way to access the > date of the experiment, for example. Now bash has things like arrays and > associative arrays, but the current ob-shell.el does not use these. > Probably because their syntax is bash-specific, and ob-shell.el is > shell-agnostic. > > My patch (attached) changes this in the case you have > (setq org-babel-sh-command "bash") > in your emacs config somewhere. If any other value is used, it continues to > export them as we do today (I don't know enough about other shells). > > In that case, it will export the list as an array, the table as an > associative array, and the scalar as it does already. So the 'sh' code > block could then use > > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var table=config > echo ${scalar} > echo ${array[1]} # -> prints "two" > echo ${table[user]} # -> prints "fleury" > #+END_SRC > > In the case we have a bigger table, then the first row is used as key, the > others are represented as a string with all the values (as it is for array > currently). bash does not have multi-dimensional arrays, so it needs to be > a string. > > This makes writing shell snippets much easier in my experience, and there > I'd like to propose this fix for the org-mode community at large. > > --paf > > diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el > index 3ede701..0a691e2 100644 > --- a/lisp/ob-shell.el > +++ b/lisp/ob-shell.el > @@ -106,6 +106,30 @@ This function is called by `org-babel-execute-src-block'." > > ;; helper functions > > +(defun org-babel-variable-assignments:bash_array (varname values &optional sep hline) > + "Returns a list of statements declaring the values as a bash array." > + (format "declare -a %s=( \"%s\" )" > + varname > + (mapconcat 'identity > + (mapcar > + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) > + values) > + "\" \""))) > + > +(defun org-babel-variable-assignments:bash_associative (varname values &optional sep hline) > + "Returns a list of statements declaring the values as bash associative array." > + (format "declare -A %s\n%s" > + varname > + (mapconcat 'identity > + (mapcar > + (lambda (items) > + (format "%s[\"%s\"]=%s" > + varname > + (org-babel-sh-var-to-sh (car items) sep hline) > + (org-babel-sh-var-to-sh (cdr items) sep hline))) > + values) > + "\n"))) > + > (defun org-babel-variable-assignments:sh (params) > "Return list of shell statements assigning the block's variables." > (let ((sep (cdr (assoc :separator params))) > @@ -114,9 +138,17 @@ This function is called by `org-babel-execute-src-block'." > "hline")))) > (mapcar > (lambda (pair) > - (format "%s=%s" > - (car pair) > - (org-babel-sh-var-to-sh (cdr pair) sep hline))) > + (if (and (string= org-babel-sh-command "bash") (listp (cdr pair))) > + (if (listp (car (cdr pair))) > + (org-babel-variable-assignments:bash_associative > + (car pair) (cdr pair) sep hline) > + (org-babel-variable-assignments:bash_array > + (car pair) (cdr pair) sep) hline) > + (format "%s=%s" > + (car pair) > + (org-babel-sh-var-to-sh (cdr pair) sep hline)) > + ) > + ) > (mapcar #'cdr (org-babel-get-header params :var))))) > > (defun org-babel-sh-var-to-sh (var &optional sep hline) -- Eric Schulte https://cs.unm.edu/~eschulte PGP: 0x614CA05D ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-03-27 17:43 ` Eric Schulte @ 2014-03-27 22:52 ` Pascal Fleury 2014-03-29 19:37 ` Eric Schulte 0 siblings, 1 reply; 26+ messages in thread From: Pascal Fleury @ 2014-03-27 22:52 UTC (permalink / raw) To: Eric Schulte; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 5964 bytes --] Hi Eric, see comments inline. On Thu, Mar 27, 2014 at 6:43 PM, Eric Schulte <schulte.eric@gmail.com>wrote: > Hi Pascal, > > This looks like a good patch. If I could make three changes/requests. > > Thanks, I am happy to see it makes sense. > 1. This patch should also work for "begin_src bash" code blocks. After > a very quick glance it doesn't appear to. > > I have actually tried this with the latest org-mode release (8.2.5h) and it did plainly not accept 'begin_src bash'. Maybe that's new with the ob-shell.el (I noticed it has been renamed :-) > 2. Could you include one or two tests ensuring that this patch does what > it intends with bash code blocks, and does not affect code blocks > executed with bin/sh? > Will do, seeing it has some traction. > > 3. Large contributions like this require some FSF paperwork. Please see > the following page for information on requirements to contribute. > > I checked internally, and apparently, Google has already such a signed document. It would run on the same document, as I am a google employee. > http://orgmode.org/worg/org-contribute.html > > Thanks, and I look forward to seeing this merged into Org-mode! > Eric > > Pascal Fleury <fleury@google.com> writes: > > > Hello, > > > > I'dl like to propose a patch for inclusion into org-mode (ob-shell.el in > > particular). > > > > *TL;DR:* use arrays and associative arrays when exporting variables to > bash > > in 'sh' code blocks. > > > > *Details:* > > When variables are defined in a 'sh' code block, they are exported as > > strings. when the variable itself is an array or a table, then we simply > > get a shell variable that contains the list of all values in a > > non-structured form. E.g. > > > > #+NAME: my_list > > | one | > > | two | > > | three | > > > > #+NAME: experiment > > | name | first_attempt | > > | date | [2014-03-27 Thu] | > > | user | fleury | > > > > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var > table=config > > echo ${scalar} # -> prints 'some value' > > echo ${array} # -> prints 'one two three' > > echo ${table} # -> prints 'first attempt [2014-03-27 Thu] fleury' > > #+END_SRC > > > > This will print simple strings. Also, there is no easy way to access the > > date of the experiment, for example. Now bash has things like arrays and > > associative arrays, but the current ob-shell.el does not use these. > > Probably because their syntax is bash-specific, and ob-shell.el is > > shell-agnostic. > > > > My patch (attached) changes this in the case you have > > (setq org-babel-sh-command "bash") > > in your emacs config somewhere. If any other value is used, it continues > to > > export them as we do today (I don't know enough about other shells). > > > > In that case, it will export the list as an array, the table as an > > associative array, and the scalar as it does already. So the 'sh' code > > block could then use > > > > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var > table=config > > echo ${scalar} > > echo ${array[1]} # -> prints "two" > > echo ${table[user]} # -> prints "fleury" > > #+END_SRC > > > > In the case we have a bigger table, then the first row is used as key, > the > > others are represented as a string with all the values (as it is for > array > > currently). bash does not have multi-dimensional arrays, so it needs to > be > > a string. > > > > This makes writing shell snippets much easier in my experience, and there > > I'd like to propose this fix for the org-mode community at large. > > > > --paf > > > > diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el > > index 3ede701..0a691e2 100644 > > --- a/lisp/ob-shell.el > > +++ b/lisp/ob-shell.el > > @@ -106,6 +106,30 @@ This function is called by > `org-babel-execute-src-block'." > > > > ;; helper functions > > > > +(defun org-babel-variable-assignments:bash_array (varname values > &optional sep hline) > > + "Returns a list of statements declaring the values as a bash array." > > + (format "declare -a %s=( \"%s\" )" > > + varname > > + (mapconcat 'identity > > + (mapcar > > + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) > > + values) > > + "\" \""))) > > + > > +(defun org-babel-variable-assignments:bash_associative (varname values > &optional sep hline) > > + "Returns a list of statements declaring the values as bash > associative array." > > + (format "declare -A %s\n%s" > > + varname > > + (mapconcat 'identity > > + (mapcar > > + (lambda (items) > > + (format "%s[\"%s\"]=%s" > > + varname > > + (org-babel-sh-var-to-sh (car items) sep hline) > > + (org-babel-sh-var-to-sh (cdr items) sep hline))) > > + values) > > + "\n"))) > > + > > (defun org-babel-variable-assignments:sh (params) > > "Return list of shell statements assigning the block's variables." > > (let ((sep (cdr (assoc :separator params))) > > @@ -114,9 +138,17 @@ This function is called by > `org-babel-execute-src-block'." > > "hline")))) > > (mapcar > > (lambda (pair) > > - (format "%s=%s" > > - (car pair) > > - (org-babel-sh-var-to-sh (cdr pair) sep hline))) > > + (if (and (string= org-babel-sh-command "bash") (listp (cdr > pair))) > > + (if (listp (car (cdr pair))) > > + (org-babel-variable-assignments:bash_associative > > + (car pair) (cdr pair) sep hline) > > + (org-babel-variable-assignments:bash_array > > + (car pair) (cdr pair) sep) hline) > > + (format "%s=%s" > > + (car pair) > > + (org-babel-sh-var-to-sh (cdr pair) sep hline)) > > + ) > > + ) > > (mapcar #'cdr (org-babel-get-header params :var))))) > > > > (defun org-babel-sh-var-to-sh (var &optional sep hline) > > -- > Eric Schulte > https://cs.unm.edu/~eschulte > PGP: 0x614CA05D > -- --paf [-- Attachment #2: Type: text/html, Size: 8464 bytes --] ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-03-27 22:52 ` Pascal Fleury @ 2014-03-29 19:37 ` Eric Schulte 2014-04-06 23:25 ` Pascal Fleury 0 siblings, 1 reply; 26+ messages in thread From: Eric Schulte @ 2014-03-29 19:37 UTC (permalink / raw) To: Pascal Fleury; +Cc: emacs-orgmode, Eric Schulte Thanks for making these changes. Once they're in and Bastien figures out how the google-wide copyright attribution works we should be good to go. Thanks! Pascal Fleury <fleury@google.com> writes: > Hi Eric, see comments inline. > > > On Thu, Mar 27, 2014 at 6:43 PM, Eric Schulte <schulte.eric@gmail.com>wrote: > >> Hi Pascal, >> >> This looks like a good patch. If I could make three changes/requests. >> >> > Thanks, I am happy to see it makes sense. > > >> 1. This patch should also work for "begin_src bash" code blocks. After >> a very quick glance it doesn't appear to. >> >> I have actually tried this with the latest org-mode release (8.2.5h) and > it did plainly not accept 'begin_src bash'. Maybe that's new with the > ob-shell.el (I noticed it has been renamed :-) > > >> 2. Could you include one or two tests ensuring that this patch does what >> it intends with bash code blocks, and does not affect code blocks >> executed with bin/sh? >> > > Will do, seeing it has some traction. > > >> >> 3. Large contributions like this require some FSF paperwork. Please see >> the following page for information on requirements to contribute. >> >> > I checked internally, and apparently, Google has already such a signed > document. It would run on the same document, as I am a google employee. > > >> http://orgmode.org/worg/org-contribute.html >> >> Thanks, and I look forward to seeing this merged into Org-mode! >> Eric >> >> Pascal Fleury <fleury@google.com> writes: >> >> > Hello, >> > >> > I'dl like to propose a patch for inclusion into org-mode (ob-shell.el in >> > particular). >> > >> > *TL;DR:* use arrays and associative arrays when exporting variables to >> bash >> > in 'sh' code blocks. >> > >> > *Details:* >> > When variables are defined in a 'sh' code block, they are exported as >> > strings. when the variable itself is an array or a table, then we simply >> > get a shell variable that contains the list of all values in a >> > non-structured form. E.g. >> > >> > #+NAME: my_list >> > | one | >> > | two | >> > | three | >> > >> > #+NAME: experiment >> > | name | first_attempt | >> > | date | [2014-03-27 Thu] | >> > | user | fleury | >> > >> > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var >> table=config >> > echo ${scalar} # -> prints 'some value' >> > echo ${array} # -> prints 'one two three' >> > echo ${table} # -> prints 'first attempt [2014-03-27 Thu] fleury' >> > #+END_SRC >> > >> > This will print simple strings. Also, there is no easy way to access the >> > date of the experiment, for example. Now bash has things like arrays and >> > associative arrays, but the current ob-shell.el does not use these. >> > Probably because their syntax is bash-specific, and ob-shell.el is >> > shell-agnostic. >> > >> > My patch (attached) changes this in the case you have >> > (setq org-babel-sh-command "bash") >> > in your emacs config somewhere. If any other value is used, it continues >> to >> > export them as we do today (I don't know enough about other shells). >> > >> > In that case, it will export the list as an array, the table as an >> > associative array, and the scalar as it does already. So the 'sh' code >> > block could then use >> > >> > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var >> table=config >> > echo ${scalar} >> > echo ${array[1]} # -> prints "two" >> > echo ${table[user]} # -> prints "fleury" >> > #+END_SRC >> > >> > In the case we have a bigger table, then the first row is used as key, >> the >> > others are represented as a string with all the values (as it is for >> array >> > currently). bash does not have multi-dimensional arrays, so it needs to >> be >> > a string. >> > >> > This makes writing shell snippets much easier in my experience, and there >> > I'd like to propose this fix for the org-mode community at large. >> > >> > --paf >> > >> > diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el >> > index 3ede701..0a691e2 100644 >> > --- a/lisp/ob-shell.el >> > +++ b/lisp/ob-shell.el >> > @@ -106,6 +106,30 @@ This function is called by >> `org-babel-execute-src-block'." >> > >> > ;; helper functions >> > >> > +(defun org-babel-variable-assignments:bash_array (varname values >> &optional sep hline) >> > + "Returns a list of statements declaring the values as a bash array." >> > + (format "declare -a %s=( \"%s\" )" >> > + varname >> > + (mapconcat 'identity >> > + (mapcar >> > + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) >> > + values) >> > + "\" \""))) >> > + >> > +(defun org-babel-variable-assignments:bash_associative (varname values >> &optional sep hline) >> > + "Returns a list of statements declaring the values as bash >> associative array." >> > + (format "declare -A %s\n%s" >> > + varname >> > + (mapconcat 'identity >> > + (mapcar >> > + (lambda (items) >> > + (format "%s[\"%s\"]=%s" >> > + varname >> > + (org-babel-sh-var-to-sh (car items) sep hline) >> > + (org-babel-sh-var-to-sh (cdr items) sep hline))) >> > + values) >> > + "\n"))) >> > + >> > (defun org-babel-variable-assignments:sh (params) >> > "Return list of shell statements assigning the block's variables." >> > (let ((sep (cdr (assoc :separator params))) >> > @@ -114,9 +138,17 @@ This function is called by >> `org-babel-execute-src-block'." >> > "hline")))) >> > (mapcar >> > (lambda (pair) >> > - (format "%s=%s" >> > - (car pair) >> > - (org-babel-sh-var-to-sh (cdr pair) sep hline))) >> > + (if (and (string= org-babel-sh-command "bash") (listp (cdr >> pair))) >> > + (if (listp (car (cdr pair))) >> > + (org-babel-variable-assignments:bash_associative >> > + (car pair) (cdr pair) sep hline) >> > + (org-babel-variable-assignments:bash_array >> > + (car pair) (cdr pair) sep) hline) >> > + (format "%s=%s" >> > + (car pair) >> > + (org-babel-sh-var-to-sh (cdr pair) sep hline)) >> > + ) >> > + ) >> > (mapcar #'cdr (org-babel-get-header params :var))))) >> > >> > (defun org-babel-sh-var-to-sh (var &optional sep hline) >> >> -- >> Eric Schulte >> https://cs.unm.edu/~eschulte >> PGP: 0x614CA05D >> -- Eric Schulte https://cs.unm.edu/~eschulte PGP: 0x614CA05D ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-03-29 19:37 ` Eric Schulte @ 2014-04-06 23:25 ` Pascal Fleury 2014-04-11 2:38 ` Eric Schulte 0 siblings, 1 reply; 26+ messages in thread From: Pascal Fleury @ 2014-04-06 23:25 UTC (permalink / raw) To: Eric Schulte; +Cc: Pascal Fleury, emacs-orgmode [-- Attachment #1.1: Type: text/plain, Size: 7302 bytes --] Hi Eric, Please find attached a new patch that contains the same changes of the ob-shell.el exporter as before, but also contains unit tests for checking that it works. Let me know if you need some changes in there, and how the google-wide copyright issues comes along. My information came from Chris DiBona (our master of open-source licenses), is this helps to find the relevant documents. Thanks, Pascal On Sat, Mar 29, 2014 at 8:37 PM, Eric Schulte <schulte.eric@gmail.com>wrote: > Thanks for making these changes. Once they're in and Bastien figures > out how the google-wide copyright attribution works we should be good to > go. > > Thanks! > > Pascal Fleury <fleury@google.com> writes: > > > Hi Eric, see comments inline. > > > > > > On Thu, Mar 27, 2014 at 6:43 PM, Eric Schulte <schulte.eric@gmail.com > >wrote: > > > >> Hi Pascal, > >> > >> This looks like a good patch. If I could make three changes/requests. > >> > >> > > Thanks, I am happy to see it makes sense. > > > > > >> 1. This patch should also work for "begin_src bash" code blocks. After > >> a very quick glance it doesn't appear to. > >> > >> I have actually tried this with the latest org-mode release (8.2.5h) and > > it did plainly not accept 'begin_src bash'. Maybe that's new with the > > ob-shell.el (I noticed it has been renamed :-) > > > > > >> 2. Could you include one or two tests ensuring that this patch does what > >> it intends with bash code blocks, and does not affect code blocks > >> executed with bin/sh? > >> > > > > Will do, seeing it has some traction. > > > > > >> > >> 3. Large contributions like this require some FSF paperwork. Please see > >> the following page for information on requirements to contribute. > >> > >> > > I checked internally, and apparently, Google has already such a signed > > document. It would run on the same document, as I am a google employee. > > > > > >> http://orgmode.org/worg/org-contribute.html > >> > >> Thanks, and I look forward to seeing this merged into Org-mode! > >> Eric > >> > >> Pascal Fleury <fleury@google.com> writes: > >> > >> > Hello, > >> > > >> > I'dl like to propose a patch for inclusion into org-mode (ob-shell.el > in > >> > particular). > >> > > >> > *TL;DR:* use arrays and associative arrays when exporting variables to > >> bash > >> > in 'sh' code blocks. > >> > > >> > *Details:* > >> > When variables are defined in a 'sh' code block, they are exported as > >> > strings. when the variable itself is an array or a table, then we > simply > >> > get a shell variable that contains the list of all values in a > >> > non-structured form. E.g. > >> > > >> > #+NAME: my_list > >> > | one | > >> > | two | > >> > | three | > >> > > >> > #+NAME: experiment > >> > | name | first_attempt | > >> > | date | [2014-03-27 Thu] | > >> > | user | fleury | > >> > > >> > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var > >> table=config > >> > echo ${scalar} # -> prints 'some value' > >> > echo ${array} # -> prints 'one two three' > >> > echo ${table} # -> prints 'first attempt [2014-03-27 Thu] fleury' > >> > #+END_SRC > >> > > >> > This will print simple strings. Also, there is no easy way to access > the > >> > date of the experiment, for example. Now bash has things like arrays > and > >> > associative arrays, but the current ob-shell.el does not use these. > >> > Probably because their syntax is bash-specific, and ob-shell.el is > >> > shell-agnostic. > >> > > >> > My patch (attached) changes this in the case you have > >> > (setq org-babel-sh-command "bash") > >> > in your emacs config somewhere. If any other value is used, it > continues > >> to > >> > export them as we do today (I don't know enough about other shells). > >> > > >> > In that case, it will export the list as an array, the table as an > >> > associative array, and the scalar as it does already. So the 'sh' code > >> > block could then use > >> > > >> > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var > >> table=config > >> > echo ${scalar} > >> > echo ${array[1]} # -> prints "two" > >> > echo ${table[user]} # -> prints "fleury" > >> > #+END_SRC > >> > > >> > In the case we have a bigger table, then the first row is used as key, > >> the > >> > others are represented as a string with all the values (as it is for > >> array > >> > currently). bash does not have multi-dimensional arrays, so it needs > to > >> be > >> > a string. > >> > > >> > This makes writing shell snippets much easier in my experience, and > there > >> > I'd like to propose this fix for the org-mode community at large. > >> > > >> > --paf > >> > > >> > diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el > >> > index 3ede701..0a691e2 100644 > >> > --- a/lisp/ob-shell.el > >> > +++ b/lisp/ob-shell.el > >> > @@ -106,6 +106,30 @@ This function is called by > >> `org-babel-execute-src-block'." > >> > > >> > ;; helper functions > >> > > >> > +(defun org-babel-variable-assignments:bash_array (varname values > >> &optional sep hline) > >> > + "Returns a list of statements declaring the values as a bash > array." > >> > + (format "declare -a %s=( \"%s\" )" > >> > + varname > >> > + (mapconcat 'identity > >> > + (mapcar > >> > + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) > >> > + values) > >> > + "\" \""))) > >> > + > >> > +(defun org-babel-variable-assignments:bash_associative (varname > values > >> &optional sep hline) > >> > + "Returns a list of statements declaring the values as bash > >> associative array." > >> > + (format "declare -A %s\n%s" > >> > + varname > >> > + (mapconcat 'identity > >> > + (mapcar > >> > + (lambda (items) > >> > + (format "%s[\"%s\"]=%s" > >> > + varname > >> > + (org-babel-sh-var-to-sh (car items) sep hline) > >> > + (org-babel-sh-var-to-sh (cdr items) sep hline))) > >> > + values) > >> > + "\n"))) > >> > + > >> > (defun org-babel-variable-assignments:sh (params) > >> > "Return list of shell statements assigning the block's variables." > >> > (let ((sep (cdr (assoc :separator params))) > >> > @@ -114,9 +138,17 @@ This function is called by > >> `org-babel-execute-src-block'." > >> > "hline")))) > >> > (mapcar > >> > (lambda (pair) > >> > - (format "%s=%s" > >> > - (car pair) > >> > - (org-babel-sh-var-to-sh (cdr pair) sep hline))) > >> > + (if (and (string= org-babel-sh-command "bash") (listp (cdr > >> pair))) > >> > + (if (listp (car (cdr pair))) > >> > + (org-babel-variable-assignments:bash_associative > >> > + (car pair) (cdr pair) sep hline) > >> > + (org-babel-variable-assignments:bash_array > >> > + (car pair) (cdr pair) sep) hline) > >> > + (format "%s=%s" > >> > + (car pair) > >> > + (org-babel-sh-var-to-sh (cdr pair) sep hline)) > >> > + ) > >> > + ) > >> > (mapcar #'cdr (org-babel-get-header params :var))))) > >> > > >> > (defun org-babel-sh-var-to-sh (var &optional sep hline) > >> > >> -- > >> Eric Schulte > >> https://cs.unm.edu/~eschulte > >> PGP: 0x614CA05D > >> > > -- > Eric Schulte > https://cs.unm.edu/~eschulte > PGP: 0x614CA05D > > [-- Attachment #1.2: Type: text/html, Size: 10558 bytes --] [-- Attachment #2: bash-arrays_with_test.patch --] [-- Type: text/x-patch, Size: 7030 bytes --] diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el index 3ede701..d7f1802 100644 --- a/lisp/ob-shell.el +++ b/lisp/ob-shell.el @@ -105,6 +105,44 @@ This function is called by `org-babel-execute-src-block'." buffer))) ;; helper functions +(defun org-babel-variable-assignments:generic (varname values &optional sep hline) + "Returns a list of statements declaring the values as a generic variable." + (format "%s=%s" varname (org-babel-sh-var-to-sh values sep hline))) + +(defun org-babel-variable-assignments:bash_array (varname values &optional sep hline) + "Returns a list of statements declaring the values as a bash array." + (format "unset %s\ndeclare -a %s=( \"%s\" )" + varname varname + (mapconcat 'identity + (mapcar + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) + values) + "\" \""))) + +(defun org-babel-variable-assignments:bash_assoc (varname values &optional sep hline) + "Returns a list of statements declaring the values as bash associative array." + (format "unset %s\ndeclare -A %s\n%s" + varname varname + (mapconcat 'identity + (mapcar + (lambda (items) + (format "%s[\"%s\"]=%s" + varname + (org-babel-sh-var-to-sh (car items) sep hline) + (org-babel-sh-var-to-sh (cdr items) sep hline))) + values) + "\n"))) + +(defun org-babel-variable-assignments:bash (varname values &optional sep hline) + "Represents the parameters as useful Bash shell variables." + (if (listp values) + (if (and (listp (car values)) (= 1 (length (car values)))) + (org-babel-variable-assignments:bash_array varname values sep hline) + (org-babel-variable-assignments:bash_assoc varname values sep hline) + ) + (org-babel-variable-assignments:generic varname values sep hline) + ) +) (defun org-babel-variable-assignments:sh (params) "Return list of shell statements assigning the block's variables." @@ -114,10 +152,15 @@ This function is called by `org-babel-execute-src-block'." "hline")))) (mapcar (lambda (pair) - (format "%s=%s" - (car pair) - (org-babel-sh-var-to-sh (cdr pair) sep hline))) - (mapcar #'cdr (org-babel-get-header params :var))))) + (if (string= org-babel-sh-command "bash") + (org-babel-variable-assignments:bash + (car pair) (cdr pair) sep hline) + (org-babel-variable-assignments:generic + (car pair) (cdr pair) sep hline) + ) + ) + (mapcar #'cdr (org-babel-get-header params :var)))) +) (defun org-babel-sh-var-to-sh (var &optional sep hline) "Convert an elisp value to a shell variable. diff --git a/testing/examples/ob-shell-test.org b/testing/examples/ob-shell-test.org new file mode 100644 index 0000000..a54e5c0 --- /dev/null +++ b/testing/examples/ob-shell-test.org @@ -0,0 +1,88 @@ +#+Title: a collection of examples for ob-shell tests +#+OPTIONS: ^:nil + +* Sample data structures +#+NAME: sample_array +| one | +| two | +| three | + +#+NAME: sample_mapping_table +| first | one | +| second | two | +| third | three | + +#+NAME: sample_big_table +| bread | 2 | kg | +| spaghetti | 20 | cm | +| milk | 50 | dl | + +* Array tests + :PROPERTIES: + :ID: 0ba56632-8dc1-405c-a083-c204bae477cf + :END: +** Generic shell: no arrays +#+begin_src sh :exports results :var array=sample_array +echo ${array} +#+end_src + +#+RESULTS: +: one two three + +** Bash shell: support for arrays +Bash will see a simple indexed array. In this test, we check that the +returned value is indeed only the first item of the array, as opposed to +the generic serialiation that will return all elements of the array as +a single string. +#+begin_src bash :exports results :var array=sample_array +echo ${array} +#+end_src + +#+RESULTS: +: one + +* Associative array tests (simple map) + :PROPERTIES: + :ID: bec1a5b0-4619-4450-a8c0-2a746b44bf8d + :END: +** Generic shell: no special handing +The shell will see all values as a single string. +#+begin_src sh :exports results :var table=sample_mapping_table +echo ${table} +#+end_src + +#+RESULTS: +: first one second two third three + +** Bash shell: support for associative arrays +Bash will see a table that contains the first column as the 'index' +of the associative array, and the second column as the value. +#+begin_src bash :exports results :var table=sample_mapping_table +echo ${table[second]} +#+end_src + +#+RESULTS: +: two + +* Associative array tests (more than 2 columns) + :PROPERTIES: + :ID: 82320a48-3409-49d7-85c9-5de1c6d3ff87 + :END: +** Generic shell: no special handing +#+begin_src sh :exports results :var table=sample_big_table +echo ${table} +#+end_src + +#+RESULTS: +: bread 2 kg spaghetti 20 cm milk 50 dl + +** Bash shell: support for associative arrays with lists +Bash will see an associative array that contains each row as a single +string. Bash cannot handle lists in associative arrays. +#+begin_src bash :exports results :var table=sample_big_table +echo ${table[spaghetti]} +#+end_src + +#+RESULTS: +: 20 cm + diff --git a/testing/lisp/test-ob-shell.el b/testing/lisp/test-ob-shell.el index 2b3e48f..58a7859 100644 --- a/testing/lisp/test-ob-shell.el +++ b/testing/lisp/test-ob-shell.el @@ -47,6 +47,45 @@ ob-comint.el, which was not previously tested." (should res) (should (listp res)))) +; A list of tests using the samples in ob-shell-test.org +(ert-deftest ob-shell/generic-uses-no-arrays () + "No arrays for generic" + (org-test-at-id "0ba56632-8dc1-405c-a083-c204bae477cf" + (org-babel-next-src-block) + (should (equal "one two three" (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/bash-uses-arrays () + "Bash arrays" + (org-test-at-id "0ba56632-8dc1-405c-a083-c204bae477cf" + (org-babel-next-src-block 2) + (should (equal "one" (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/generic-uses-no-assoc-arrays () + "No associative arrays for generic" + (org-test-at-id "bec1a5b0-4619-4450-a8c0-2a746b44bf8d" + (org-babel-next-src-block) + (should (equal "first one second two third three" + (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/bash-uses-assoc-arrays () + "Bash associative arrays" + (org-test-at-id "bec1a5b0-4619-4450-a8c0-2a746b44bf8d" + (org-babel-next-src-block 2) + (should (equal "two" (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/generic-uses-no-assoc-arrays () + "No associative arrays for generic" + (org-test-at-id "82320a48-3409-49d7-85c9-5de1c6d3ff87" + (org-babel-next-src-block) + (should (equal "bread 2 kg spaghetti 20 cm milk 50 dl" + (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/bash-uses-assoc-arrays () + "Bash associative arrays as strings for the row" + (org-test-at-id "82320a48-3409-49d7-85c9-5de1c6d3ff87" + (org-babel-next-src-block 2) + (should (equal "20 cm" (org-babel-execute-src-block))))) + (provide 'test-ob-shell) ^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-06 23:25 ` Pascal Fleury @ 2014-04-11 2:38 ` Eric Schulte 2014-04-11 9:33 ` Bastien 0 siblings, 1 reply; 26+ messages in thread From: Eric Schulte @ 2014-04-11 2:38 UTC (permalink / raw) To: Pascal Fleury; +Cc: Pascal Fleury, emacs-orgmode Hi Pascal, This patch looks great, thanks for making the additions. Once last request, would you mind formatting it with "git format-patch"? With that done I'll be happy to apply this to the repo. Also, I think the google-wide copyright stuff is sorted out. Best, Pascal Fleury <pascal@telefleuries.com> writes: > Hi Eric, > > Please find attached a new patch that contains the same changes of the > ob-shell.el exporter as before, but also contains unit tests for checking > that it works. > > Let me know if you need some changes in there, and how the google-wide > copyright issues comes along. My information came from Chris DiBona (our > master of open-source licenses), is this helps to find the relevant > documents. > > Thanks, > Pascal > > > > On Sat, Mar 29, 2014 at 8:37 PM, Eric Schulte <schulte.eric@gmail.com>wrote: > >> Thanks for making these changes. Once they're in and Bastien figures >> out how the google-wide copyright attribution works we should be good to >> go. >> >> Thanks! >> >> Pascal Fleury <fleury@google.com> writes: >> >> > Hi Eric, see comments inline. >> > >> > >> > On Thu, Mar 27, 2014 at 6:43 PM, Eric Schulte <schulte.eric@gmail.com >> >wrote: >> > >> >> Hi Pascal, >> >> >> >> This looks like a good patch. If I could make three changes/requests. >> >> >> >> >> > Thanks, I am happy to see it makes sense. >> > >> > >> >> 1. This patch should also work for "begin_src bash" code blocks. After >> >> a very quick glance it doesn't appear to. >> >> >> >> I have actually tried this with the latest org-mode release (8.2.5h) and >> > it did plainly not accept 'begin_src bash'. Maybe that's new with the >> > ob-shell.el (I noticed it has been renamed :-) >> > >> > >> >> 2. Could you include one or two tests ensuring that this patch does what >> >> it intends with bash code blocks, and does not affect code blocks >> >> executed with bin/sh? >> >> >> > >> > Will do, seeing it has some traction. >> > >> > >> >> >> >> 3. Large contributions like this require some FSF paperwork. Please see >> >> the following page for information on requirements to contribute. >> >> >> >> >> > I checked internally, and apparently, Google has already such a signed >> > document. It would run on the same document, as I am a google employee. >> > >> > >> >> http://orgmode.org/worg/org-contribute.html >> >> >> >> Thanks, and I look forward to seeing this merged into Org-mode! >> >> Eric >> >> >> >> Pascal Fleury <fleury@google.com> writes: >> >> >> >> > Hello, >> >> > >> >> > I'dl like to propose a patch for inclusion into org-mode (ob-shell.el >> in >> >> > particular). >> >> > >> >> > *TL;DR:* use arrays and associative arrays when exporting variables to >> >> bash >> >> > in 'sh' code blocks. >> >> > >> >> > *Details:* >> >> > When variables are defined in a 'sh' code block, they are exported as >> >> > strings. when the variable itself is an array or a table, then we >> simply >> >> > get a shell variable that contains the list of all values in a >> >> > non-structured form. E.g. >> >> > >> >> > #+NAME: my_list >> >> > | one | >> >> > | two | >> >> > | three | >> >> > >> >> > #+NAME: experiment >> >> > | name | first_attempt | >> >> > | date | [2014-03-27 Thu] | >> >> > | user | fleury | >> >> > >> >> > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var >> >> table=config >> >> > echo ${scalar} # -> prints 'some value' >> >> > echo ${array} # -> prints 'one two three' >> >> > echo ${table} # -> prints 'first attempt [2014-03-27 Thu] fleury' >> >> > #+END_SRC >> >> > >> >> > This will print simple strings. Also, there is no easy way to access >> the >> >> > date of the experiment, for example. Now bash has things like arrays >> and >> >> > associative arrays, but the current ob-shell.el does not use these. >> >> > Probably because their syntax is bash-specific, and ob-shell.el is >> >> > shell-agnostic. >> >> > >> >> > My patch (attached) changes this in the case you have >> >> > (setq org-babel-sh-command "bash") >> >> > in your emacs config somewhere. If any other value is used, it >> continues >> >> to >> >> > export them as we do today (I don't know enough about other shells). >> >> > >> >> > In that case, it will export the list as an array, the table as an >> >> > associative array, and the scalar as it does already. So the 'sh' code >> >> > block could then use >> >> > >> >> > #+BEGIN_SRC sh :var scalar="some value" :var array=my_list :var >> >> table=config >> >> > echo ${scalar} >> >> > echo ${array[1]} # -> prints "two" >> >> > echo ${table[user]} # -> prints "fleury" >> >> > #+END_SRC >> >> > >> >> > In the case we have a bigger table, then the first row is used as key, >> >> the >> >> > others are represented as a string with all the values (as it is for >> >> array >> >> > currently). bash does not have multi-dimensional arrays, so it needs >> to >> >> be >> >> > a string. >> >> > >> >> > This makes writing shell snippets much easier in my experience, and >> there >> >> > I'd like to propose this fix for the org-mode community at large. >> >> > >> >> > --paf >> >> > >> >> > diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el >> >> > index 3ede701..0a691e2 100644 >> >> > --- a/lisp/ob-shell.el >> >> > +++ b/lisp/ob-shell.el >> >> > @@ -106,6 +106,30 @@ This function is called by >> >> `org-babel-execute-src-block'." >> >> > >> >> > ;; helper functions >> >> > >> >> > +(defun org-babel-variable-assignments:bash_array (varname values >> >> &optional sep hline) >> >> > + "Returns a list of statements declaring the values as a bash >> array." >> >> > + (format "declare -a %s=( \"%s\" )" >> >> > + varname >> >> > + (mapconcat 'identity >> >> > + (mapcar >> >> > + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) >> >> > + values) >> >> > + "\" \""))) >> >> > + >> >> > +(defun org-babel-variable-assignments:bash_associative (varname >> values >> >> &optional sep hline) >> >> > + "Returns a list of statements declaring the values as bash >> >> associative array." >> >> > + (format "declare -A %s\n%s" >> >> > + varname >> >> > + (mapconcat 'identity >> >> > + (mapcar >> >> > + (lambda (items) >> >> > + (format "%s[\"%s\"]=%s" >> >> > + varname >> >> > + (org-babel-sh-var-to-sh (car items) sep hline) >> >> > + (org-babel-sh-var-to-sh (cdr items) sep hline))) >> >> > + values) >> >> > + "\n"))) >> >> > + >> >> > (defun org-babel-variable-assignments:sh (params) >> >> > "Return list of shell statements assigning the block's variables." >> >> > (let ((sep (cdr (assoc :separator params))) >> >> > @@ -114,9 +138,17 @@ This function is called by >> >> `org-babel-execute-src-block'." >> >> > "hline")))) >> >> > (mapcar >> >> > (lambda (pair) >> >> > - (format "%s=%s" >> >> > - (car pair) >> >> > - (org-babel-sh-var-to-sh (cdr pair) sep hline))) >> >> > + (if (and (string= org-babel-sh-command "bash") (listp (cdr >> >> pair))) >> >> > + (if (listp (car (cdr pair))) >> >> > + (org-babel-variable-assignments:bash_associative >> >> > + (car pair) (cdr pair) sep hline) >> >> > + (org-babel-variable-assignments:bash_array >> >> > + (car pair) (cdr pair) sep) hline) >> >> > + (format "%s=%s" >> >> > + (car pair) >> >> > + (org-babel-sh-var-to-sh (cdr pair) sep hline)) >> >> > + ) >> >> > + ) >> >> > (mapcar #'cdr (org-babel-get-header params :var))))) >> >> > >> >> > (defun org-babel-sh-var-to-sh (var &optional sep hline) >> >> >> >> -- >> >> Eric Schulte >> >> https://cs.unm.edu/~eschulte >> >> PGP: 0x614CA05D >> >> >> >> -- >> Eric Schulte >> https://cs.unm.edu/~eschulte >> PGP: 0x614CA05D >> >> > -- Eric Schulte https://cs.unm.edu/~eschulte PGP: 0x614CA05D ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-11 2:38 ` Eric Schulte @ 2014-04-11 9:33 ` Bastien 2014-04-14 8:48 ` Pascal Fleury 2014-04-15 3:37 ` Eric Schulte 0 siblings, 2 replies; 26+ messages in thread From: Bastien @ 2014-04-11 9:33 UTC (permalink / raw) To: Eric Schulte; +Cc: Pascal Fleury, Pascal Fleury, emacs-orgmode Hi Eric and Pascal, Eric Schulte <schulte.eric@gmail.com> writes: > Also, I think the google-wide copyright stuff is sorted out. Yes it is: we can accept patch from employees of Google, Inc. Pascal, I guess it's safe to assume anyone with a @google.com email address is a Google employee -- let me know if it's not the case. Also, if you can sign your patches (git format-patch -s) that'd be even better, but not mandatory. Thanks! -- Bastien ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-11 9:33 ` Bastien @ 2014-04-14 8:48 ` Pascal Fleury 2014-04-15 3:35 ` Eric Schulte 2014-04-15 3:37 ` Eric Schulte 1 sibling, 1 reply; 26+ messages in thread From: Pascal Fleury @ 2014-04-14 8:48 UTC (permalink / raw) To: Bastien; +Cc: Pascal Fleury, emacs-orgmode, Eric Schulte [-- Attachment #1.1: Type: text/plain, Size: 818 bytes --] Hello, Great, thanks for the guidance. I hope I managed it all correctly. On Fri, Apr 11, 2014 at 11:33 AM, Bastien <bzg@gnu.org> wrote: > Hi Eric and Pascal, > > Eric Schulte <schulte.eric@gmail.com> writes: > > > Also, I think the google-wide copyright stuff is sorted out. > > Yes it is: we can accept patch from employees of Google, Inc. > > Good :-) > Pascal, I guess it's safe to assume anyone with a @google.com > email address is a Google employee -- let me know if it's not > the case. > > Yes, I checked internally, and this is a safe assumption. > Also, if you can sign your patches (git format-patch -s) that'd > be even better, but not mandatory. > > I did, also wrote the description of the patch according to the rules I found on orgmode.org > Thanks! > > -- > Bastien > Best regards, --paf [-- Attachment #1.2: Type: text/html, Size: 1922 bytes --] [-- Attachment #2: 0001-ob-shell.el-export-vars-as-arrays-for-sh-code-blocks.patch --] [-- Type: text/x-patch, Size: 8463 bytes --] From c61c28f0b97544a12c3f89180b309cb25ed9f3a9 Mon Sep 17 00:00:00 2001 From: Pascal Fleury <fleury@google.com> Date: Fri, 11 Apr 2014 23:27:02 +0200 Subject: [PATCH] ob-shell.el: export vars as arrays for 'sh' code blocks * lisp/ob-shell.el: added support to serialize vars as arrays or associative arrays as appropriate if it is using bash. * testing/examples/ob-shell-test.org: a file containing a few code blocks both illustrating the use of arrays as well as serving as test for the new export functionality. * testing/lisp/test-ob-shell.el: added a few unit tests that verify that this new logic only triggers for bash and no other shell at this time. When variables are defined in a 'sh' code block, they are exported as strings. when the variable itself is an array or a table, then we simply get a shell variable that contains the list of all values in a non-structured form. When calling the code block with bash, however, it will now export the list as an array, the table as an associative array. A scalar is exported the same way as before. Signed-off-by: Pascal Fleury <fleury@google.com> --- lisp/ob-shell.el | 51 ++++++++++++++++++++-- testing/examples/ob-shell-test.org | 88 ++++++++++++++++++++++++++++++++++++++ testing/lisp/test-ob-shell.el | 39 +++++++++++++++++ 3 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 testing/examples/ob-shell-test.org diff --git a/lisp/ob-shell.el b/lisp/ob-shell.el index 3ede701..d7f1802 100644 --- a/lisp/ob-shell.el +++ b/lisp/ob-shell.el @@ -105,6 +105,44 @@ This function is called by `org-babel-execute-src-block'." buffer))) ;; helper functions +(defun org-babel-variable-assignments:generic (varname values &optional sep hline) + "Returns a list of statements declaring the values as a generic variable." + (format "%s=%s" varname (org-babel-sh-var-to-sh values sep hline))) + +(defun org-babel-variable-assignments:bash_array (varname values &optional sep hline) + "Returns a list of statements declaring the values as a bash array." + (format "unset %s\ndeclare -a %s=( \"%s\" )" + varname varname + (mapconcat 'identity + (mapcar + (lambda (value) (org-babel-sh-var-to-sh value sep hline)) + values) + "\" \""))) + +(defun org-babel-variable-assignments:bash_assoc (varname values &optional sep hline) + "Returns a list of statements declaring the values as bash associative array." + (format "unset %s\ndeclare -A %s\n%s" + varname varname + (mapconcat 'identity + (mapcar + (lambda (items) + (format "%s[\"%s\"]=%s" + varname + (org-babel-sh-var-to-sh (car items) sep hline) + (org-babel-sh-var-to-sh (cdr items) sep hline))) + values) + "\n"))) + +(defun org-babel-variable-assignments:bash (varname values &optional sep hline) + "Represents the parameters as useful Bash shell variables." + (if (listp values) + (if (and (listp (car values)) (= 1 (length (car values)))) + (org-babel-variable-assignments:bash_array varname values sep hline) + (org-babel-variable-assignments:bash_assoc varname values sep hline) + ) + (org-babel-variable-assignments:generic varname values sep hline) + ) +) (defun org-babel-variable-assignments:sh (params) "Return list of shell statements assigning the block's variables." @@ -114,10 +152,15 @@ This function is called by `org-babel-execute-src-block'." "hline")))) (mapcar (lambda (pair) - (format "%s=%s" - (car pair) - (org-babel-sh-var-to-sh (cdr pair) sep hline))) - (mapcar #'cdr (org-babel-get-header params :var))))) + (if (string= org-babel-sh-command "bash") + (org-babel-variable-assignments:bash + (car pair) (cdr pair) sep hline) + (org-babel-variable-assignments:generic + (car pair) (cdr pair) sep hline) + ) + ) + (mapcar #'cdr (org-babel-get-header params :var)))) +) (defun org-babel-sh-var-to-sh (var &optional sep hline) "Convert an elisp value to a shell variable. diff --git a/testing/examples/ob-shell-test.org b/testing/examples/ob-shell-test.org new file mode 100644 index 0000000..a54e5c0 --- /dev/null +++ b/testing/examples/ob-shell-test.org @@ -0,0 +1,88 @@ +#+Title: a collection of examples for ob-shell tests +#+OPTIONS: ^:nil + +* Sample data structures +#+NAME: sample_array +| one | +| two | +| three | + +#+NAME: sample_mapping_table +| first | one | +| second | two | +| third | three | + +#+NAME: sample_big_table +| bread | 2 | kg | +| spaghetti | 20 | cm | +| milk | 50 | dl | + +* Array tests + :PROPERTIES: + :ID: 0ba56632-8dc1-405c-a083-c204bae477cf + :END: +** Generic shell: no arrays +#+begin_src sh :exports results :var array=sample_array +echo ${array} +#+end_src + +#+RESULTS: +: one two three + +** Bash shell: support for arrays +Bash will see a simple indexed array. In this test, we check that the +returned value is indeed only the first item of the array, as opposed to +the generic serialiation that will return all elements of the array as +a single string. +#+begin_src bash :exports results :var array=sample_array +echo ${array} +#+end_src + +#+RESULTS: +: one + +* Associative array tests (simple map) + :PROPERTIES: + :ID: bec1a5b0-4619-4450-a8c0-2a746b44bf8d + :END: +** Generic shell: no special handing +The shell will see all values as a single string. +#+begin_src sh :exports results :var table=sample_mapping_table +echo ${table} +#+end_src + +#+RESULTS: +: first one second two third three + +** Bash shell: support for associative arrays +Bash will see a table that contains the first column as the 'index' +of the associative array, and the second column as the value. +#+begin_src bash :exports results :var table=sample_mapping_table +echo ${table[second]} +#+end_src + +#+RESULTS: +: two + +* Associative array tests (more than 2 columns) + :PROPERTIES: + :ID: 82320a48-3409-49d7-85c9-5de1c6d3ff87 + :END: +** Generic shell: no special handing +#+begin_src sh :exports results :var table=sample_big_table +echo ${table} +#+end_src + +#+RESULTS: +: bread 2 kg spaghetti 20 cm milk 50 dl + +** Bash shell: support for associative arrays with lists +Bash will see an associative array that contains each row as a single +string. Bash cannot handle lists in associative arrays. +#+begin_src bash :exports results :var table=sample_big_table +echo ${table[spaghetti]} +#+end_src + +#+RESULTS: +: 20 cm + diff --git a/testing/lisp/test-ob-shell.el b/testing/lisp/test-ob-shell.el index 2b3e48f..58a7859 100644 --- a/testing/lisp/test-ob-shell.el +++ b/testing/lisp/test-ob-shell.el @@ -47,6 +47,45 @@ ob-comint.el, which was not previously tested." (should res) (should (listp res)))) +; A list of tests using the samples in ob-shell-test.org +(ert-deftest ob-shell/generic-uses-no-arrays () + "No arrays for generic" + (org-test-at-id "0ba56632-8dc1-405c-a083-c204bae477cf" + (org-babel-next-src-block) + (should (equal "one two three" (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/bash-uses-arrays () + "Bash arrays" + (org-test-at-id "0ba56632-8dc1-405c-a083-c204bae477cf" + (org-babel-next-src-block 2) + (should (equal "one" (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/generic-uses-no-assoc-arrays () + "No associative arrays for generic" + (org-test-at-id "bec1a5b0-4619-4450-a8c0-2a746b44bf8d" + (org-babel-next-src-block) + (should (equal "first one second two third three" + (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/bash-uses-assoc-arrays () + "Bash associative arrays" + (org-test-at-id "bec1a5b0-4619-4450-a8c0-2a746b44bf8d" + (org-babel-next-src-block 2) + (should (equal "two" (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/generic-uses-no-assoc-arrays () + "No associative arrays for generic" + (org-test-at-id "82320a48-3409-49d7-85c9-5de1c6d3ff87" + (org-babel-next-src-block) + (should (equal "bread 2 kg spaghetti 20 cm milk 50 dl" + (org-babel-execute-src-block))))) + +(ert-deftest ob-shell/bash-uses-assoc-arrays () + "Bash associative arrays as strings for the row" + (org-test-at-id "82320a48-3409-49d7-85c9-5de1c6d3ff87" + (org-babel-next-src-block 2) + (should (equal "20 cm" (org-babel-execute-src-block))))) + (provide 'test-ob-shell) -- 1.8.3.2 ^ permalink raw reply related [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-14 8:48 ` Pascal Fleury @ 2014-04-15 3:35 ` Eric Schulte 2014-04-15 11:15 ` Pascal Fleury 2014-04-22 14:47 ` Skip Collins 0 siblings, 2 replies; 26+ messages in thread From: Eric Schulte @ 2014-04-15 3:35 UTC (permalink / raw) To: Pascal Fleury; +Cc: Bastien, Pascal Fleury, emacs-orgmode Pascal Fleury <fleury@google.com> writes: > Hello, > > Great, thanks for the guidance. I hope I managed it all correctly. > I've applied this patch. I made a couple of minor changes in a subsequent commit (a7189aa). These were indentation and whitespace changes to enforce two coding conventions, 1. limit line lengths to <80 characters 2. remove dangling parens on lines w/o any other text and to rename one function to be specific to ob-shell.el. Thanks for contributing! > > On Fri, Apr 11, 2014 at 11:33 AM, Bastien <bzg@gnu.org> wrote: > >> Hi Eric and Pascal, >> >> Eric Schulte <schulte.eric@gmail.com> writes: >> >> > Also, I think the google-wide copyright stuff is sorted out. >> >> Yes it is: we can accept patch from employees of Google, Inc. >> >> > Good :-) > > >> Pascal, I guess it's safe to assume anyone with a @google.com >> email address is a Google employee -- let me know if it's not >> the case. >> >> > Yes, I checked internally, and this is a safe assumption. > > >> Also, if you can sign your patches (git format-patch -s) that'd >> be even better, but not mandatory. >> >> > I did, also wrote the description of the patch according to the rules I > found on orgmode.org > > >> Thanks! >> >> -- >> Bastien >> > > > Best regards, > --paf > -- Eric Schulte https://cs.unm.edu/~eschulte PGP: 0x614CA05D ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-15 3:35 ` Eric Schulte @ 2014-04-15 11:15 ` Pascal Fleury 2014-04-22 14:47 ` Skip Collins 1 sibling, 0 replies; 26+ messages in thread From: Pascal Fleury @ 2014-04-15 11:15 UTC (permalink / raw) To: Eric Schulte; +Cc: Bastien, Pascal Fleury, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 1577 bytes --] Thanks Eric! --pascal On Tue, Apr 15, 2014 at 5:35 AM, Eric Schulte <schulte.eric@gmail.com>wrote: > Pascal Fleury <fleury@google.com> writes: > > > Hello, > > > > Great, thanks for the guidance. I hope I managed it all correctly. > > > > I've applied this patch. > > I made a couple of minor changes in a subsequent commit (a7189aa). > These were indentation and whitespace changes to enforce two coding > conventions, > > 1. limit line lengths to <80 characters > 2. remove dangling parens on lines w/o any other text > > and to rename one function to be specific to ob-shell.el. > > Thanks for contributing! > > > > > On Fri, Apr 11, 2014 at 11:33 AM, Bastien <bzg@gnu.org> wrote: > > > >> Hi Eric and Pascal, > >> > >> Eric Schulte <schulte.eric@gmail.com> writes: > >> > >> > Also, I think the google-wide copyright stuff is sorted out. > >> > >> Yes it is: we can accept patch from employees of Google, Inc. > >> > >> > > Good :-) > > > > > >> Pascal, I guess it's safe to assume anyone with a @google.com > >> email address is a Google employee -- let me know if it's not > >> the case. > >> > >> > > Yes, I checked internally, and this is a safe assumption. > > > > > >> Also, if you can sign your patches (git format-patch -s) that'd > >> be even better, but not mandatory. > >> > >> > > I did, also wrote the description of the patch according to the rules I > > found on orgmode.org > > > > > >> Thanks! > >> > >> -- > >> Bastien > >> > > > > > > Best regards, > > --paf > > > > -- > Eric Schulte > https://cs.unm.edu/~eschulte > PGP: 0x614CA05D > -- --paf [-- Attachment #2: Type: text/html, Size: 2850 bytes --] ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-15 3:35 ` Eric Schulte 2014-04-15 11:15 ` Pascal Fleury @ 2014-04-22 14:47 ` Skip Collins 2014-04-22 15:37 ` Bastien 1 sibling, 1 reply; 26+ messages in thread From: Skip Collins @ 2014-04-22 14:47 UTC (permalink / raw) To: emacs-org list Test 80/480 fails when I use make up2 with Mac OS X GNU Emacs 24.3.1 (x86_64-apple-darwin12.5.0, Carbon Version 1.6.0 AppKit 1187.4) of 2014-03-05: executing Bash code block... Wrote /var/folders/dt/9hkw2mj50dd566y5qs2s4b8sq962bh/T/tmp-orgtest/ob-input-32986Ogm Code block evaluation complete. Test ob-shell/bash-uses-assoc-arrays backtrace: signal(ert-test-failed (((should (equal "20 cm" (org-babel-execute-s ert-fail(((should (equal "20 cm" (org-babel-execute-src-block))) :fo (if (unwind-protect (setq value-984 (apply fn-982 args-983)) (setq f (let (form-description-986) (if (unwind-protect (setq value-984 (app (let ((value-984 (quote ert-form-evaluation-aborted-985))) (let (for (let ((fn-982 (function equal)) (args-983 (list "20 cm" (org-babel-e (save-restriction (org-babel-next-src-block 2) (let ((fn-982 (functi (progn (org-id-goto "82320a48-3409-49d7-85c9-5de1c6d3ff87") (setq to (unwind-protect (progn (org-id-goto "82320a48-3409-49d7-85c9-5de1c6d (let ((save-match-data-internal (match-data))) (unwind-protect (prog (progn (let ((save-match-data-internal (match-data))) (unwind-protec (unwind-protect (progn (let ((save-match-data-internal (match-data)) (let ((wconfig (current-window-configuration))) (unwind-protect (pro (unwind-protect (let ((wconfig (current-window-configuration))) (unw (let* ((id-location (org-id-find "82320a48-3409-49d7-85c9-5de1c6d3ff (lambda nil (let* ((id-location (org-id-find "82320a48-3409-49d7-85c byte-code("\306\307!q\210\310\216\311 \312\216\313\314\315\316\3 ert--run-test-internal([cl-struct-ert--test-execution-info [cl-struc byte-code("\306\307!\211\211r\310\311!q\210\312 d\313\223)L\210)\3 ert-run-test([cl-struct-ert-test ob-shell/bash-uses-assoc-arrays "Ba ert-run-or-rerun-test([cl-struct-ert--stats "\\(org\\|ob\\)" [[cl-st ert-run-tests("\\(org\\|ob\\)" #[(event-type &rest event-args) "\306 ert-run-tests-batch("\\(org\\|ob\\)") ert-run-tests-batch-and-exit("\\(org\\|ob\\)") (let ((org-id-track-globally t) (org-test-selector (if org-test-sele org-test-run-batch-tests("\\(org\\|ob\\)") eval((org-test-run-batch-tests org-test-select-re)) command-line-1(("--eval" "(setq vc-handled-backends nil org-startup- command-line() normal-top-level() Test ob-shell/bash-uses-assoc-arrays condition: (ert-test-failed ((should (equal "20 cm" (org-babel-execute-src-block))) :form (equal "20 cm" "50 dl") :value nil :explanation (array-elt 0 (different-atoms (50 "#x32" "?2") (53 "#x35" "?5"))))) FAILED 80/480 ob-shell/bash-uses-assoc-arrays ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-22 14:47 ` Skip Collins @ 2014-04-22 15:37 ` Bastien 2014-04-22 17:19 ` Skip Collins 0 siblings, 1 reply; 26+ messages in thread From: Bastien @ 2014-04-22 15:37 UTC (permalink / raw) To: Skip Collins; +Cc: emacs-org list Skip Collins <skip.collins@gmail.com> writes: > Test 80/480 fails when I use make up2 with Mac OS X GNU Emacs 24.3.1 > (x86_64-apple-darwin12.5.0, Carbon Version 1.6.0 AppKit 1187.4) of > 2014-03-05: > executing Bash code block... > Wrote /var/folders/dt/9hkw2mj50dd566y5qs2s4b8sq962bh/T/tmp-orgtest/ob-input-32986Ogm > Code block evaluation complete. > Test ob-shell/bash-uses-assoc-arrays backtrace: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ I'm not aware of such a test -- where did you get it from? -- Bastien ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-22 15:37 ` Bastien @ 2014-04-22 17:19 ` Skip Collins 2014-04-22 20:59 ` Bastien 0 siblings, 1 reply; 26+ messages in thread From: Skip Collins @ 2014-04-22 17:19 UTC (permalink / raw) To: Bastien; +Cc: emacs-org list As I wrote at the top of the report, the test fails when running make up2. I am using the unmodified master branch. -- skip collins 240 687 7802 On Tue, Apr 22, 2014 at 11:37 AM, Bastien <bzg@gnu.org> wrote: > Skip Collins <skip.collins@gmail.com> writes: > >> Test 80/480 fails when I use make up2 with Mac OS X GNU Emacs 24.3.1 >> (x86_64-apple-darwin12.5.0, Carbon Version 1.6.0 AppKit 1187.4) of >> 2014-03-05: >> executing Bash code block... >> Wrote /var/folders/dt/9hkw2mj50dd566y5qs2s4b8sq962bh/T/tmp-orgtest/ob-input-32986Ogm >> Code block evaluation complete. >> Test ob-shell/bash-uses-assoc-arrays backtrace: > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > I'm not aware of such a test -- where did you get it from? > > -- > Bastien ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-22 17:19 ` Skip Collins @ 2014-04-22 20:59 ` Bastien 2014-04-22 21:04 ` Skip Collins 0 siblings, 1 reply; 26+ messages in thread From: Bastien @ 2014-04-22 20:59 UTC (permalink / raw) To: Skip Collins; +Cc: emacs-org list Skip Collins <skip.collins@gmail.com> writes: > As I wrote at the top of the report, the test fails when running make > up2. I am using the unmodified master branch. You should probably check for "sh" in this local.mk line: BTEST_OB_LANGUAGES: ... and replace is by "shell". -- Bastien ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-22 20:59 ` Bastien @ 2014-04-22 21:04 ` Skip Collins 2014-04-22 21:09 ` Skip Collins 2014-04-22 21:15 ` Bastien 0 siblings, 2 replies; 26+ messages in thread From: Skip Collins @ 2014-04-22 21:04 UTC (permalink / raw) To: Bastien; +Cc: emacs-org list On Tue, Apr 22, 2014 at 4:59 PM, Bastien <bzg@gnu.org> wrote: > You should probably check for "sh" in this local.mk line: Nope. I suspect this is a Mac-related thing. Here are the contents of my local.mk: ORG_ADD_CONTRIB = org-download.el* EMACS = /Applications/Emacs.app/Contents/MacOS/Emacs prefix = /usr/local/share ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-22 21:04 ` Skip Collins @ 2014-04-22 21:09 ` Skip Collins 2014-04-22 21:22 ` Bastien 2014-04-22 21:15 ` Bastien 1 sibling, 1 reply; 26+ messages in thread From: Skip Collins @ 2014-04-22 21:09 UTC (permalink / raw) To: Bastien; +Cc: emacs-org list On Tue, Apr 22, 2014 at 5:04 PM, Skip Collins <skip.collins@gmail.com> wrote: > I suspect this is a Mac-related thing. OS X 10.8.5 ships with bash version 3 which seems to have some issues with declaring arrays: http://stackoverflow.com/questions/6047648/bash-4-associative-arrays-error-declare-a-invalid-option ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-22 21:09 ` Skip Collins @ 2014-04-22 21:22 ` Bastien 2014-04-23 13:51 ` Skip Collins 0 siblings, 1 reply; 26+ messages in thread From: Bastien @ 2014-04-22 21:22 UTC (permalink / raw) To: Skip Collins; +Cc: emacs-org list Skip Collins <skip.collins@gmail.com> writes: > On Tue, Apr 22, 2014 at 5:04 PM, Skip Collins <skip.collins@gmail.com> wrote: >> I suspect this is a Mac-related thing. > > OS X 10.8.5 ships with bash version 3 which seems to have some issues > with declaring arrays: > http://stackoverflow.com/questions/6047648/bash-4-associative-arrays-error-declare-a-invalid-option Mhh... okay then, thanks for mentioning it. -- Bastien ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-22 21:22 ` Bastien @ 2014-04-23 13:51 ` Skip Collins 2014-04-23 14:13 ` Pascal Fleury 0 siblings, 1 reply; 26+ messages in thread From: Skip Collins @ 2014-04-23 13:51 UTC (permalink / raw) To: emacs-org list; +Cc: Bastien, Pascal Fleury On Tue, Apr 22, 2014 at 5:22 PM, Bastien <bzg@gnu.org> wrote: > Mhh... okay then, thanks for mentioning it. The stackoverflow link contains what appears to be a good workaround that functions in old and new versions of bash. Perhaps Pascal Fleury could modify the org code to avoid using 'declare -A' when bash version < 4. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-23 13:51 ` Skip Collins @ 2014-04-23 14:13 ` Pascal Fleury 2014-04-23 16:31 ` Skip Collins 0 siblings, 1 reply; 26+ messages in thread From: Pascal Fleury @ 2014-04-23 14:13 UTC (permalink / raw) To: Skip Collins; +Cc: Bastien, emacs-org list [-- Attachment #1: Type: text/plain, Size: 691 bytes --] Hi, Yes that is a test I added, and did not think of older versions of bash (have not used bash3 in quite a long time :-) Actually, if we have bash3, then we should not use the associative arrays at all, but fallback to the lists. Will give it a go. --paf On Wed, Apr 23, 2014 at 3:51 PM, Skip Collins <skip.collins@gmail.com>wrote: > On Tue, Apr 22, 2014 at 5:22 PM, Bastien <bzg@gnu.org> wrote: > > Mhh... okay then, thanks for mentioning it. > > The stackoverflow link contains what appears to be a good workaround > that functions in old and new versions of bash. Perhaps Pascal Fleury > could modify the org code to avoid using 'declare -A' when bash > version < 4. > -- --paf [-- Attachment #2: Type: text/html, Size: 1199 bytes --] ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-23 14:13 ` Pascal Fleury @ 2014-04-23 16:31 ` Skip Collins 2014-04-24 1:23 ` Eric Schulte 0 siblings, 1 reply; 26+ messages in thread From: Skip Collins @ 2014-04-23 16:31 UTC (permalink / raw) To: Pascal Fleury; +Cc: Bastien, emacs-org list On Wed, Apr 23, 2014 at 10:13 AM, Pascal Fleury <fleury@google.com> wrote: > (have not used bash3 in quite a long time :-) Even OS X Mavericks uses bash 3. So it will be around for quite a long time. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-23 16:31 ` Skip Collins @ 2014-04-24 1:23 ` Eric Schulte 2014-04-24 7:44 ` Pascal Fleury 0 siblings, 1 reply; 26+ messages in thread From: Eric Schulte @ 2014-04-24 1:23 UTC (permalink / raw) To: Skip Collins; +Cc: Pascal Fleury, Bastien, emacs-org list Skip Collins <skip.collins@gmail.com> writes: > On Wed, Apr 23, 2014 at 10:13 AM, Pascal Fleury <fleury@google.com> wrote: >> (have not used bash3 in quite a long time :-) > > Even OS X Mavericks uses bash 3. So it will be around for quite a long time. > I believe Bash 4 is GPLv3 and Bash 3 is GPLv2, so it is very possible that OSX will never upgrade to the current bash. If the fix is obvious and simple then it sounds like a win. I suppose the argument could be made that an Emacs project should not go out of it's way to support old versions of software which are potentially being used only to avoid GPLv3 licensing... but I won't make that argument here. -- Eric Schulte https://cs.unm.edu/~eschulte PGP: 0x614CA05D ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-24 1:23 ` Eric Schulte @ 2014-04-24 7:44 ` Pascal Fleury 0 siblings, 0 replies; 26+ messages in thread From: Pascal Fleury @ 2014-04-24 7:44 UTC (permalink / raw) To: Eric Schulte; +Cc: Skip Collins, Bastien, emacs-org list [-- Attachment #1: Type: text/plain, Size: 1287 bytes --] On Thu, Apr 24, 2014 at 3:23 AM, Eric Schulte <schulte.eric@gmail.com>wrote: > Skip Collins <skip.collins@gmail.com> writes: > > > On Wed, Apr 23, 2014 at 10:13 AM, Pascal Fleury <fleury@google.com> > wrote: > >> (have not used bash3 in quite a long time :-) > > > > Even OS X Mavericks uses bash 3. So it will be around for quite a long > time. > > > > I believe Bash 4 is GPLv3 and Bash 3 is GPLv2, so it is very possible > that OSX will never upgrade to the current bash. > > If the fix is obvious and simple then it sounds like a win. > > I think it should be. It could prod the version the very first time it runs, and use that. > I suppose the argument could be made that an Emacs project should not go > out of it's way to support old versions of software which are > potentially being used only to avoid GPLv3 licensing... but I won't make > that argument here. > Even array support in ob-shell.el is a win for bash3, and as a user of Mac OSX myself, I would not like a project like org-mode to push such pains onto the users especially as here it is a regression for bash3 users. I'm a bit overbooked these days, I hope you won't mind if it will take a few more days for a fix. --paf > > -- > Eric Schulte > https://cs.unm.edu/~eschulte > PGP: 0x614CA05D > -- --paf [-- Attachment #2: Type: text/html, Size: 2354 bytes --] ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-22 21:04 ` Skip Collins 2014-04-22 21:09 ` Skip Collins @ 2014-04-22 21:15 ` Bastien 1 sibling, 0 replies; 26+ messages in thread From: Bastien @ 2014-04-22 21:15 UTC (permalink / raw) To: Skip Collins; +Cc: emacs-org list Skip Collins <skip.collins@gmail.com> writes: > On Tue, Apr 22, 2014 at 4:59 PM, Bastien <bzg@gnu.org> wrote: >> You should probably check for "sh" in this local.mk line: > > Nope. I suspect this is a Mac-related thing. > Here are the contents of > my local.mk: > ORG_ADD_CONTRIB = org-download.el* > EMACS = /Applications/Emacs.app/Contents/MacOS/Emacs > prefix = /usr/local/share What happens if you remove local.mk, then git checkout master, then make config to recreate local.mk? -- Bastien ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-11 9:33 ` Bastien 2014-04-14 8:48 ` Pascal Fleury @ 2014-04-15 3:37 ` Eric Schulte 2014-04-15 15:37 ` Nick Dokos 2014-04-17 6:31 ` Bastien 1 sibling, 2 replies; 26+ messages in thread From: Eric Schulte @ 2014-04-15 3:37 UTC (permalink / raw) To: Bastien; +Cc: Pascal Fleury, Pascal Fleury, emacs-orgmode > > Also, if you can sign your patches (git format-patch -s) that'd > be even better, but not mandatory. > Should I start signing my patches as well? I'm very happy to, I've just never thought about it. If so is there an easy way to make -s a default option for the Org-mode repo? Thanks, -- Eric Schulte https://cs.unm.edu/~eschulte PGP: 0x614CA05D ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-15 3:37 ` Eric Schulte @ 2014-04-15 15:37 ` Nick Dokos 2014-04-17 6:31 ` Bastien 1 sibling, 0 replies; 26+ messages in thread From: Nick Dokos @ 2014-04-15 15:37 UTC (permalink / raw) To: emacs-orgmode Eric Schulte <schulte.eric@gmail.com> writes: >> >> Also, if you can sign your patches (git format-patch -s) that'd >> be even better, but not mandatory. >> > > Should I start signing my patches as well? > > I'm very happy to, I've just never thought about it. If so is there an > easy way to make -s a default option for the Org-mode repo? > $ git config --global alias.fm 'format-patch -s' Then $ git fm <since-commit> Nick ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: Export arrays for 'sh' code blocks when using bash 2014-04-15 3:37 ` Eric Schulte 2014-04-15 15:37 ` Nick Dokos @ 2014-04-17 6:31 ` Bastien 1 sibling, 0 replies; 26+ messages in thread From: Bastien @ 2014-04-17 6:31 UTC (permalink / raw) To: Eric Schulte; +Cc: Pascal Fleury, Pascal Fleury, emacs-orgmode Hi Eric, Eric Schulte <schulte.eric@gmail.com> writes: >> Also, if you can sign your patches (git format-patch -s) that'd >> be even better, but not mandatory. > > Should I start signing my patches as well? Up to you, I don't want to enforce a policy here, I just think it's good to have signed patch for people who don't contribute on behalf of themselves but do so on behalf of a company they work for. I'm myself only signing tags for new releases (have been since a while at least.) -- Bastien ^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2014-04-25 1:34 UTC | newest] Thread overview: 26+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-03-27 10:26 Export arrays for 'sh' code blocks when using bash Pascal Fleury 2014-03-27 17:43 ` Eric Schulte 2014-03-27 22:52 ` Pascal Fleury 2014-03-29 19:37 ` Eric Schulte 2014-04-06 23:25 ` Pascal Fleury 2014-04-11 2:38 ` Eric Schulte 2014-04-11 9:33 ` Bastien 2014-04-14 8:48 ` Pascal Fleury 2014-04-15 3:35 ` Eric Schulte 2014-04-15 11:15 ` Pascal Fleury 2014-04-22 14:47 ` Skip Collins 2014-04-22 15:37 ` Bastien 2014-04-22 17:19 ` Skip Collins 2014-04-22 20:59 ` Bastien 2014-04-22 21:04 ` Skip Collins 2014-04-22 21:09 ` Skip Collins 2014-04-22 21:22 ` Bastien 2014-04-23 13:51 ` Skip Collins 2014-04-23 14:13 ` Pascal Fleury 2014-04-23 16:31 ` Skip Collins 2014-04-24 1:23 ` Eric Schulte 2014-04-24 7:44 ` Pascal Fleury 2014-04-22 21:15 ` Bastien 2014-04-15 3:37 ` Eric Schulte 2014-04-15 15:37 ` Nick Dokos 2014-04-17 6:31 ` Bastien
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).