2025-05-05  Ludovic Courtès  <ludo@gnu.org>

	Update NEWS.

2025-05-05  Ludovic Courtès  <ludo@gnu.org>

	Open low-numbered file descriptors for use by the shell.

	Fixes <https://issues.guix.gnu.org/75658>.

	Previously, the signal thread and finalization thread would both create
	a pipe and get file descriptors 5 to 9 for their own use.  Thus, when
	calling ‘install-current-ports!’ in the child process, ‘exec-utility’
	would race with the post-fork re-initialization of these two threads,
	which could manifest like this:

	  $ guix shell gash -- gash -c 'exec 7>/dev/null; while true; do echo $(sh --version) > /dev/null; done'
	  Backtrace:
	  […]
	       92:9  3 (exec-utility _ "/home/ludo/.guix-home/profile/bin/sh" # …)
	  In srfi/srfi-1.scm:
	      634:9  2 (for-each #<procedure 7f2a245c94c0 at gash/shell.scm:7…> …)
	  In ice-9/ports.scm:
	     317:17  1 (dup->port _ _ _)
	  In unknown file:
	             0 (fdopen 7 "w")

	  ERROR: In procedure fdopen:
	  In procedure scm_fdes_to_port: Bad file descriptor

	This would manifest when running Autoconf-generated ‘configure’ scripts,
	which use file descriptors 6 and 7 for logging.

	* scripts/gash.in (main): Open 10 file descriptors.

2025-05-05  Ludovic Courtès  <ludo@gnu.org>

	shell: ‘install-current-ports!’ opens file descriptors, not ports.

	* gash/shell.scm (install-current-ports!): Use ‘dup->fdes’ instead of
	‘dup’ to avoid opening a port that can be GC’d at any time, leading file
	descriptor i to be closed.

2025-05-05  Ludovic Courtès  <ludo@gnu.org>

	shell: Remove dead code in ‘install-current-ports!’.

	* gash/shell.scm (install-current-ports!): Remove unreached clauses;
	change catch-all close to #f.

2025-05-05  Ludovic Courtès  <ludo@gnu.org>

	shell: Exit child process when ‘execle’ fails.

	* gash/shell.scm (exec-utility): Wrap ‘execle’ call in ‘catch’ and
	‘dynamic-wind’.
	* tests/exiting.org (exit-exec, exit-file-not-found, exit-bad-interpreter):
	New tests.

2024-12-18  Timothy Sample  <samplet@ngyro.com>

	Do not rely on HOME variable being set.

	Additionally, respect the XDG Base Directory Specification and
	handle an unset USER variable.

	See https://lists.gnu.org/archive/html/gash-devel/2024-12/msg00000.html

	* gash/gash.scm (get-history-file): New procedure.
	(main): Use it, and only read and write history when the filename
	can be determined.
	(prompt): Handle unset HOME and USER variables.

2024-12-18  Timothy Sample  <samplet@ngyro.com>

	Update INSTALL file from Automake.

	* INSTALL: Update.

2022-02-11  Timothy Sample  <samplet@ngyro.com>

	Update NEWS for 0.3.0.

	* NEWS (release 0.3.0): New section.

2022-02-11  Timothy Sample  <samplet@ngyro.com>

	Update ChangeLog copyright years.

	* ChangeLog: Update copyright years for Timothy Sample.

2022-02-11  Timothy Sample  <samplet@ngyro.com>

	Support Guile 3.0.

	* configure.ac (GUILE_PKG): Add '3.0'.
	* guix.scm: Use 'guile-3.0' for the Gash package.

2021-06-23  Timothy Sample  <samplet@ngyro.com>

	parser: Simplify default port handling.

	* gash/parser.scm (read-sh, read-sh-all): Set the default value for
	the 'port' argument in the usual way (rather than doing it
	manually).

2021-06-23  Timothy Sample  <samplet@ngyro.com>

	parser: Fix port name typo.

	* gash/parser.scm (read-sh): Read from 'current-input-port' instead
	of 'current-output-port'.

2021-05-26  Timothy Sample  <samplet@ngyro.com>

	Add arithmetic expansion.

	* gash/arithmetic.scm: New file.
	* Makefile.am (SOURCES): Add it.
	* gash/lexer.scm (get-arithmetic-expansion): New procedure.
	(get-expansion): Check for "$((" and use the new procedure to read an
	arithmetic expansion.
	* gash/eval.scm (word->qword): Handle '<sh-arithmetic>'.
	* tests/unit/eval.scm: Add tests.
	* tests/spec/Makefile.am (TESTS): Add 'arith'.
	* tests/spec/oil.scm: Patch seven of its tests and filter out fifteen
	others.
	* doc/gash.texi, doc/syntax.txt: Add '<sh-arithmetic>' syntax.

2021-04-19  Timothy Sample  <samplet@ngyro.com>

	Move evaluation code from 'word' to 'eval'.

	This adjustment paves the way for writing a compiler.

	* gash/word.scm (eval-cmd-sub, string-not-null?, word->qword,
	expand-word): Move these...
	* gash/eval.scm: ...to this module.
	* tests/unit/word.scm: Adjust qword tests to use 'expand-qword', and
	move non-qword (evaluation) tests to...
	* tests/unit/eval.scm: ...this new file, adjusting them to use
	'eval-word'.
	* Makefile.am (UNIT_TESTS): Add the new file.

2021-04-19  Timothy Sample  <samplet@ngyro.com>

	Add an 'expand-qword' procedure.

	* gash/word.scm (expand-qword): New procedure.
	(expand-word): Rewrite in terms of 'expand-qword'.

2021-04-17  Timothy Sample  <samplet@ngyro.com>

	Fix long lines in the examples in the manual.

	* doc/gash.texi (Internal representation examples): Fix long lines
	in examples.

2021-04-17  Timothy Sample  <samplet@ngyro.com>

	Correct ice cream parsing example in the manual.

	* doc/gash.texi (Internal representation examples): In the section
	on pipelines, change a redirect in the result to "ice-cream.txt" to
	match its input.

2020-08-21  Timothy Sample  <samplet@ngyro.com>

	Remove asynchronous commands as a missing feature.

	* doc/gash.texi (Missing features): Remove asynchronous commands
	from the list.

2020-08-21  Timothy Sample  <samplet@ngyro.com>

	List variable operators as working in the manual.

	* doc/gash.texi (Using Gash): Specify that all the variable
	operators work.
	(Missing features): Remove the bullet point about variable
	operators.

2020-08-21  Stephen J. Scheck  <sscheck@singularsyntax.one>

	Add a language specification.

	* language/sh/spec.scm: New file.
	* Makefile.am (SOURCES): Add it.
	* doc/gash.texi (Using Gash from the Guile REPL): New section.

2020-03-31  Timothy Sample  <samplet@ngyro.com>

	Reset status on empty commands.

	* gash/eval.scm (exp->thunk, exps->thunk): When the expression has
	value '#f', reset the status.

2020-03-22  Timothy Sample  <samplet@ngyro.com>

	Respect noclobber when redirecting.

	* gash/shell.scm (process-redir): Respect the noclobber option.
	* tests/redirects.org: Add a test.

2020-03-22  Timothy Sample  <samplet@ngyro.com>

	Support printing the current umask.

	* gash/built-ins/umask.scm (umask->octal-string): New procedure.
	(main): Handle the no argument case.

2020-03-17  Timothy Sample  <samplet@ngyro.com>

	Add the wait built-in.

	* gash/built-ins/wait.scm: New file.
	* Makefile.scm (SOURCES): Add it.
	* geesh/built-ins.scm (*built-ins*): Add 'wait'.

2020-03-17  Timothy Sample  <samplet@ngyro.com>

	Add basic support for asynchronous commands.

	* gash/environment.scm (*last-job*): New variable.
	(get-last-job): New procedure.
	(set-last-job!): New procedure.
	(reap-child-processes!): New procedure.
	* gash/eval.scm (eval-sh): Handle '<sh-async>'.
	* gash/gash.scm (main): Reap child processes.
	* gash/repl.scm (run-repl): Likewise.
	* gash/shell.scm (sh:async): New procedure.
	* gash/word.scm (parameter-ref): Handle "!".

2020-02-07  Timothy Sample  <samplet@ngyro.com>

	Install Git in the CI environment.

	* build-aux/gitlab-ci.yml (before_script): Install 'git'.

2020-02-07  Timothy Sample  <samplet@ngyro.com>

	Use the configured system shell in tests.

	* Makefile.am (AM_TESTS_ENVIRONMENT): New variable.
	* tests/redirects.org (Files opened for redirect can be executed
	immediately): Use an environment variable instead of hard-coding
	'/bin/sh'.

2020-02-07  Timothy Sample  <samplet@ngyro.com>

	Restore 'guix build -f guix.scm'.

	This broke when we started building the 'version.texi' file
	reproducibly (cf. 6f598de23a626b5f9e9c74cefbf9ab2fe6547cef).

	* guix.scm: Make sure 'make-select' includes the '.git' directory;
	add 'git-minimal' to the main package's 'native-inputs'.

2020-02-05  Timothy Sample  <samplet@ngyro.com>

	Speed up getting non-whitespace IFS characters.

	* gash/word.scm (split-fields): Compute 'char-set:ifs/nw' using
	'string-delete' instead of 'char-set-difference'.

2020-02-05  Timothy Sample  <samplet@ngyro.com>

	Mark 'next-char' as inlinable.

	* gash/lexer.scm (next-char): Mark as inlinable.

2020-02-05  Timothy Sample  <samplet@ngyro.com>

	Speed up checking for operators.

	* gash/lexer.scm (operator-prefix-char?): Compute the list of prefix
	characters ahead of time.

2019-12-16  Timothy Sample  <samplet@ngyro.com>

	Update the NEWS file.

	NEWS: Update for release 0.2.0.

2019-12-16  Timothy Sample  <samplet@ngyro.com>

	Make the bootstrap test work with current Guix.

	* tests/bootstrap/bash-without-bash.scm (%boot0-inputs): Call the
	upstream '%boot0-inputs' to get the list of packages.

2019-12-10  Timothy Sample  <samplet@ngyro.com>

	Generate 'version.texi' reproducibly.

	* Makefile.am ($(srcdir)/doc/version.texi): New rule (overriding one
	provided by Automake).

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Add janneke to the ChangeLog copyright notice.

2019-12-09  Jan Nieuwenhuizen  <janneke@gnu.org>
	    Timothy Sample  <samplet@ngyro.com>

	Allow 'make dist' in a Git worktree.

	* Makefile.am (dist-hook, gen-ChangeLog): Test for mere existence of
	.git instead of asserting a directory.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Generate the ChangeLog reproducibly.

	* build-aux/gitlog-to-changelog-repro.patch: New file.
	* Makefile.am (EXTRA_DIST): Add it.
	(build-aux/gitlog-to-changelog-repro): New rule.
	(gen-ChangeLog): Use 'gitlog-to-changelog-repro'.
	(DISTCLEANFILES): Add 'build-aux/gitlog-to-changelog-repro'.

2019-12-09  Jan Nieuwenhuizen  <janneke@gnu.org>
	    Timothy Sample  <samplet@ngyro.com>

	Generate reproducible source tarballs.

	* Makefile.am (dist-hook): Generate a '.tarball-timestamp' file.
	(GZIP_ENV): Override, adding '--no-name'.
	(am__tar): Override, adding flags to create reproducible source
	tarballs.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Allow running 'make dist' from extracted tarball.

	* Makefile (dist-hook): Check for '.git' before generating
	'.tarball-manifest'.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Generate ChangeLog from Git.

	* ChangeLog: Update Git log URL and add a copyright notice.
	* Makefile.am (gen-ChangeLog): Use 'gitlog-to-changelog' to generate
	the ChangeLog.

2019-12-09  Jan Nieuwenhuizen  <janneke@gnu.org>

	gash compat textual-ports: Add put-char.

	* gash/compat/textual-ports.scm: Add put-char.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Initialize the current locale on Guile 2.0.

	* gash/gash.scm: Initialize the current locale on Guile 2.0.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Allow one-armed 'if-guile-version-below'.

	* gash/compat.scm: Allow one-armed 'if-guile-version-below' syntax and
	use it to simplify the conditional definitions throughout.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Use bindings with regular built-ins.

	* gash/shell.scm (sh:exec-let): Save and set variables according to
	'bindings' before executing a regular built-in.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Reap every process in a pipeline.

	* gash/shell.scm (waitpid/any): New procedure.
	(sh:pipeline): Use it to reap every process spawned while executing a
	pipeline.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Do not leak ports into pipeline processes.

	* gash/shell.scm (swap-and-shift-pairs): Remove procedure.
	(make-pipes): Remove procedure.
	(plumb): Accept another port as an argument and close it when setting
	up the child process.
	(sh:pipeline): Do not use 'make-pipes' to create all the pipe ports
	upfront, but rather create them as needed and give them directly to
	'plumb'.

2019-12-09  Jan Nieuwenhuizen  <janneke@gnu.org>
	    Timothy Sample  <samplet@ngyro.com>

	Test executing redirect-created files immediately.

	* tests/redirects.org (Files opened for redirect can be executed
	immediately): New test.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Close ports opened for redirects.

	* gash/shell.scm (redir->parameter+port): Rename this...
	(process-redirect): ...to this, and make it return a list with the
	third element being a boolean indicating if the port was opened by us.
	(sh:with-redirects): Close ports when the new boolean is set.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Enable 'glob' specification test

	* tests/spec/Makefile.am (TESTS): Add 'glob'.
	* tests/spec/oil.scm: Patch one of its tests and filter out eleven
	others.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Respect the 'noglob' option.

	* gash/word.scm (expand-pathnames): Do not expand pathnames if the
	'noglob' option is set.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Fix pathname expansion.

	The old implementation had several bugs, prompting this complete
	rewrite.

	* gash/compat/srfi-43.scm (vector-empty?): New procedure.
	* gash/pattern.scm (pattern-null?): New procedure.
	* gash/word.scm (qword->pattern-string): New procedure.
	(qword->pattern): Rewrite using 'qword->pattern-string'.
	(find-files): New procedure.
	(expand-pathnames): Rewrite using 'find-files' and add a docstring.
	* tests/unit/word.scm: Add tests.
	(mock): New syntax.
	(make-pure-scandir): New procedure.
	(with-mocked-files): New syntax.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Simplify the 'pattern' data structure.

	* gash/pattern.scm (<pattern>): Remove the 'start-anchored?' and
	'end-anchored?' fields.
	(parse-pattern): Replace the fields with empty parts at the start or
	end of the parts list.
	(pattern-plain?): Instead of checking the fields, just check the
	number of parts.
	(pattern-match?, pattern-drop, pattern-drop-right): Do not worry about
	the fields, because the empty parts ensure the right thing happens.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Swap semantics of ':+' and '+'.

	These were mixed up, with ':+' behaving like '+' and vice versa.

	* gash/word.scm (word->qword): Swap implementations of '<sh-ref-and>'
	and '<sh-ref-and*>'.
	* tests/unit/word.scm: Swap tests.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Enable 'command-sub' specification test

	* tests/spec/Makefile.am (TESTS): Add 'command-sub'.
	* tests/spec/oil.scm: Patch four of its tests and filter out another.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Fix case statements in '$(...)' substitutions.

	* gash/parser.scm (make-parser): Fix the 'pattern!' rule so that it
	gets reduced before reading an 'RPAREN' token.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Add test for backquoted commands in heredocs.

	* tests/unit/parser.scm: Add test.

2019-12-09  Timothy Sample  <samplet@ngyro.com>

	Correctly parse double-quoted backquoted commands.

	* gash/lexer.scm (read-backquoted-command): Make the default procedure
	accept a 'quoted?' keyword.
	(get-backquoted-command): Accept a 'quoted?' keyword and pass it on to
	'read-backquoted-command'.
	(get-expansion): Accept a 'quoted?' keyword and pass it on to
	'get-backquoted-command'.
	(get-double-quotation): Set the 'quoted?' keyword when calling
	'get-expansion'.
	* tests/unit/lexer.scm: Add tests.
	* gash/parser.scm (call-with-backquoted-input-port): Accept a
	'quoted?' keyword which, if set, adds the double quote character to
	the set of escapable characters.
	(read-sh/backquoted): Accept a 'quoted?' keyword and pass it on to
	'call-with-backquoted-input-port'.
	* tests/unit/parser.scm: Add tests.

2019-12-08  Timothy Sample  <samplet@ngyro.com>

	Implement asserting references.

	* gash/word.scm (word->qword): Add an implementation for the
	'<sh-ref-assert>' and '<sh-ref-assert*>' cases.
	* tests/variable-operators.org: New file.
	* Makefile.am (FULL_TESTS): Add it.

2019-12-08  Timothy Sample  <samplet@ngyro.com>

	Reset exit status on assignment.

	* gash/eval.scm (eval-word): Add 'on-command-substitution' keyword.
	(eval-sh): On '<sh-set!>' reset the exit status unless a command
	substitution has occurred.
	* tests/assignments.org: Add tests.

2019-12-08  Timothy Sample  <samplet@ngyro.com>

	Initialize the 'IFS' variable.

	* gash/environment.scm (initial-variables): Initialize 'IFS'.

2019-12-08  Timothy Sample  <samplet@ngyro.com>

	Only throw for specific special built-in errors.

	* gash/shell.scm (sh:exec-let): Do not throw on special built-in
	errors.
	* gash/built-ins/break.scm (main),
	gash/built-ins/continue.scm (main),
	gash/built-ins/return.scm (main),
	gash/built-ins/shift.scm (main): Throw on error.

2019-12-08  Timothy Sample  <samplet@ngyro.com>

	Make 'trap' handle a numerical action.

	* gash/built-ins/utils.scm (string->nonnegative-integer): New procedure.
	* gash/built-ins/trap.scm (main): If the first argument is a number,
	treat it as if the action were '-'.

2019-12-08  Timothy Sample  <samplet@ngyro.com>

	Fix 'string->positive-integer' docstring typo.

	* gash/built-ins/utils.scm (string->positive-integer): Fix a typo in
	the docstring.

2019-12-08  Timothy Sample  <samplet@ngyro.com>

	Make 'read' handle logical lines.

	* gash/built-ins/read.scm (read-logical-line): New procedure.
	(main): Use it unless given the '-r' option.
	* tests/read.org: Add tests.

2019-12-08  Timothy Sample  <samplet@ngyro.com>

	Make 'read' handle input field splitting.

	* gash/built-ins/read.scm (split-fields): New procedure.
	(main): Use it to split the input into fields and assign each field to
	its corresponding variable.
	* tests/read.org: New file.
	* Makefile.am (FULL_TESTS): Add it.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Handle nested lists when removing quotes.

	* gash/word.scm (remove-quotes): Handle nested lists.
	(split-fields) <wedge-apart-quote>: Likewise.
	* tests/unit/word.scm: Add test.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Use temporary assignments when calling functions.

	* gash/environment.scm (save-variables-excursion): New procedure.
	* gash/shell.scm (sh:exec-let): Use it to set up temporary assignments
	during the extent of a function.
	* tests/temporary-assignments.org: New file.
	* Makefile.am (TESTS): Add it.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Delay bracket expression errors in patterns.

	* gash/pattern.scm (parse-matching-bracket-expression): Do not
	report errors until a full bracket expression has been parsed.
	* tests/unit/pattern.scm: Add test.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Use '(gash compat)' in '(gash built-ins utils)'.

	This was omitted from ffe9fc1f47306dd526a5443689c129859e72d7ae.

	* gash/built-ins/utils.scm: Use the '(gash compat)' module.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Enable 'var-op-strip' specification test

	* tests/spec/Makefile.am (TESTS): Add 'var-op-strip'.
	* tests/spec/oil.scm: Patch two of its tests and filter out four
	others.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Use UTF-8 when processing specification tests.

	* tests/spec/oil.scm: Set the encoding on the input and output ports
	to UTF-8.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Implement pattern-based variable operators.

	This commit adds an implementation for the '#', '##', '%', and '%%'
	variable operators.

	* gash/word.scm (word->qword): Add an implementation for the
	'<sh-ref-except-min>', '<sh-ref-except-max>', '<sh-ref-skip-min>',
	and '<sh-ref-skip-max>' cases.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Fix docstring for 'parameter-ref'.

	* gash/word.scm (parameter-ref): Fix docstring.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Remove tests for the '/' variable operator.

	This is a Bash-specific feature, which means that it is out of scope
	for now.

	* tests/variable-patterns.org (slash, slash-string,
	slash-string-slash): Delete tests.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Add pattern dropping procedures.

	* gash/pattern.scm (string-contains-part-right): New procedure.
	(pattern-drop): New procedure.
	(pattern-drop-right): New procedure.
	* tests/unit/pattern.scm: Test the dropping procedures.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Use a record type for patterns.

	* gash/compat/srfi-43.scm: New file.
	* Makefile.am: Add it.
	* gash/pattern.scm (<pattern>): New record type.
	(parse-part): New procedure.
	(parse-pattern): Return a '<pattern>'.
	(pattern-plain?, pattern-match?): Accept a '<pattern>'.
	(string-starts-with-part, string-ends-with-part,
	string-contains-part): Treat 'part' as a vector.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Add tests for 'pattern-plain?'.

	* tests/unit/pattern.scm: Add tests for 'pattern-plain?'.

2019-11-24  Timothy Sample  <samplet@ngyro.com>

	Do not test Bash with the specification tests.

	* tests/spec/oil.scm: Disable testing Bash in 'spec.sh'.

2019-08-20  Timothy Sample  <samplet@ngyro.com>

	Remove extra import from 'run-test-suite'.

	The '(ice-9 textual-ports)' module is not needed, and using it breaks
	the test suite on Guile 2.0.

	* tests/run-test-suite.in: Do not use '(ice-9 textual-ports)'.

2019-08-03  Timothy Sample  <samplet@ngyro.com>

	Add missing '(gash compat)' import.

	This was omitted from ffe9fc1f47306dd526a5443689c129859e72d7ae.

	* gash/shell.scm: Use the '(gash compat)' module.

2019-08-01  Timothy Sample  <samplet@ngyro.com>

	Use the 'site' Guile directories when installing.

	Thanks to Ludovic Courtès <ludo@gnu.org> for patching this in the Guix
	package definition.

	* build-aux/guile.am (moddir, ccachedir): Use the 'site' directories.

2019-08-01  Timothy Sample  <samplet@ngyro.com>

	Use 'sh:exit' for 'errexit'.

	* gash/shell.scm (errexit): Exit using 'sh:exit'.
	* tests/unit/shell.scm: Make sure exit handlers are called on
	'errexit'.

2019-08-01  Timothy Sample  <samplet@ngyro.com>

	Do not use 'with-continuation-barrier'.

	It turns out that 'with-continuation-barrier' allows delimited
	continuations (i.e., prompts) to get through.

	* gash/shell.scm (%subshell): Replace 'with-continuation-barrier' with
	'dynamic-wind', making sure to preserve exit statuses that were leaked
	through before.
	* tests/unit/shell.scm (call-with-temporary-directory): Replace
	'with-continuation-barrier' with 'dynamic-wind'.
	* tests/spec/oil.scm: Enable previously failing tests.

2019-08-01  Timothy Sample  <samplet@ngyro.com>

	Fix top-level 'break', 'continue', and 'return'.

	* gash/environment.scm (sh:break, sh:continue, sh:return): Wrap
	'abort-to-prompt' with 'false-if-exception'.
	* gash/built-ins/break.scm (main): Print warning and continue if
	'sh:break' returns.
	* gash/built-ins/continue.scm (main): Likewise, but for 'sh:continue'.
	* gash/built-ins/return.scm (main): Likewise, but for 'sh:return'.
	* tests/functions.org (Top-level return): New test.
	* tests/spec/oil.scm: Enable previously failing test.

2019-06-15  Timothy Sample  <samplet@ngyro.com>

	Handle 'return' errors.

	* gash/built-ins/utils.scm (string->exit-status): New procedure.
	* gash/built-ins/return.scm (main): Use it to simplify argument
	checking; check for too many arguments; and print messages on
	errors.
	* tests/functions.org (Too many arguments to return): New test.

2019-06-15  Timothy Sample  <samplet@ngyro.com>

	Handle 'break' and 'continue' errors.

	* gash/built-ins/utils.scm (string->positive-integer): New function.
	* gash/built-ins/break.scm (main): Use it to simplify argument
	checking; check for too many arguments; and print messages on errors.
	* gash/built-ins/continue.scm (main): Ditto.
	* gash/shell.scm (sh:exec-let): Throw an error if a special built-in
	fails.
	* tests/spec/oil.scm: Enable and adjust previously failing tests.

2019-06-15  Timothy Sample  <samplet@ngyro.com>

	Aggregate tests into test suites.

	This is a big change, but it is conceptually quite simple.  In the old
	system, the tests were specified each by multiple files ('.sh', '.exit',
	'.stdout', and '.stderr'), and run with the 'test.sh' script.  In the
	new system there are multiple tests per file ('.org') and these test
	suite files are run with the 'tests/run-test-suite' script.

	* tests/00-exit-0.sh,
	tests/00-exit-1.exit,
	tests/00-exit-1.sh,
	tests/00-exit-2.exit,
	tests/00-exit-2.sh,
	tests/00-exit-error.exit,
	tests/00-exit-error.sh,
	tests/00-exit-var.exit,
	tests/00-exit-var.sh,
	tests/00-exit.sh: Delete files, moving their contents...
	* tests/exiting.org: ...here.
	* tests/01-script-arg-0.sh,
	tests/01-script-arg-length.sh,
	tests/01-script-arg-length.stdout,
	tests/01-script-arg-list.sh,
	tests/01-script-arg-list.stdout,
	tests/01-script-backslash-space.sh,
	tests/01-script-backslash-twice.exit,
	tests/01-script-backslash-twice.sh,
	tests/01-script-backslash.exit,
	tests/01-script-backslash.sh,
	tests/01-script-newline.exit,
	tests/01-script-newline.sh,
	tests/01-script-semi.exit,
	tests/01-script-semi.sh,
	tests/01-script-shift.sh,
	tests/01-script-shift.stdout: Delete files, moving their contents...
	* tests/arguments.org: ...here.
	* tests/03-echo-brace.sh,
	tests/03-echo-brace.stdout,
	tests/03-echo-doublequotes.sh,
	tests/03-echo-doublequotes.stdout,
	tests/03-echo-escaped-doublequotes.sh,
	tests/03-echo-escaped-doublequotes.stdout,
	tests/03-echo-nesting.sh,
	tests/03-echo-nesting.stdout,
	tests/03-echo-quoted-doublequotes.sh,
	tests/03-echo-quoted-doublequotes.stdout,
	tests/03-echo.sh: Delete files, moving their contents...
	* tests/words.org: ...here.
	* tests/04-echo-equal.sh,
	tests/04-echo-equal.stdout,
	tests/04-echo-var.sh,
	tests/04-echo-word-at-word.sh,
	tests/04-echo-word-at-word.stdout,
	tests/04-echo-word-at.sh,
	tests/04-echo-word-at.stdout: Delete files, moving their contents...
	* tests/variable-words.org: ...here.
	* tests/05-assignment-backtick.sh,
	tests/05-assignment-backtick.stdout,
	tests/05-assignment-double-quote.sh,
	tests/05-assignment-doublequoted-doublequotes.sh,
	tests/05-assignment-doublequoted-doublequotes.stdout,
	tests/05-assignment-echo.sh,
	tests/05-assignment-echo.stdout,
	tests/05-assignment-empty.sh,
	tests/05-assignment-empty.stdout,
	tests/05-assignment-singlequote.sh,
	tests/05-assignment-variable-word.sh,
	tests/05-assignment-variable-word.stdout,
	tests/05-assignment-word-variable.sh,
	tests/05-assignment-word-variable.stdout,
	tests/05-assignment.sh: Delete files, moving their contents...
	* tests/assignments.org: ...here.
	* tests/06-command-compound-word.sh,
	tests/06-command-compound-word.stdout,
	tests/06-compound-word.sh,
	tests/06-compound-word.stdout: Delete files, moving their contents...
	* tests/compound-words.org: ...here.
	* tests/07-variable-not-or.sh,
	tests/07-variable-not-or.stdout,
	tests/07-variable-or-doublequote.sh,
	tests/07-variable-or-doublequote.stdout,
	tests/07-variable-or-empty.sh,
	tests/07-variable-or-empty.stdout,
	tests/07-variable-or-slash.sh,
	tests/07-variable-or-variable.sh,
	tests/07-variable-or-variable.stdout,
	tests/07-variable-or.sh,
	tests/07-variable-or.stdout: Delete files, moving their contents...
	* tests/variable-or.org: ...here.
	* tests/08-variable-and.sh,
	tests/08-variable-and.stdout,
	tests/08-variable-not-and.sh,
	tests/08-variable-not-and.stdout: Delete files, moving their contents...
	* tests/variable-and.org: ...here.
	* tests/10-else-multiple.sh,
	tests/10-else.multiple.stdout,
	tests/10-if-bracket-false.sh,
	tests/10-if-bracket.sh,
	tests/10-if-elif.sh,
	tests/10-if-else.sh,
	tests/10-if-false.sh,
	tests/10-if-line.sh,
	tests/10-if-multiple.sh,
	tests/10-if-multiple.stdout,
	tests/10-if-redirect.sh,
	tests/10-if-test-false.sh,
	tests/10-if-test.sh,
	tests/10-if-word-variable.sh,
	tests/10-if.sh: Delete files, moving their contents...
	* tests/conditionals.org: ...here.
	* tests/11-for-done-subshell.sh,
	tests/11-for-done-subshell.stdout,
	tests/11-for-split-sequence.sh,
	tests/11-for-split-sequence.stdout,
	tests/11-for.sh,
	tests/11-for.stdout: Delete files, moving their contents...
	* tests/loops.org: ...here.
	* tests/20-and.exit,
	tests/20-and.sh,
	tests/20-exec.sh,
	tests/20-or.sh,
	tests/20-pipe-exit-0.sh,
	tests/20-pipe-exit-1.exit,
	tests/20-pipe-exit-1.sh,
	tests/20-pipe-sed-cat.sh,
	tests/20-pipe-sed-cat.stdout,
	tests/20-pipe-sed.sh,
	tests/20-pipe-sed.stdout,
	tests/20-semi.exit,
	tests/20-semi.sh: Delete files, moving their contents...
	* tests/pipes-and-booleans.org: ...here.
	* tests/30-for-substitution.sh,
	tests/30-for-substitution.stdout,
	tests/30-substitution-assignment-at.sh,
	tests/30-substitution-assignment-at.stdout,
	tests/30-substitution-assignment.sh,
	tests/30-substitution-assignment.stdout,
	tests/30-substitution-backtick.sh,
	tests/30-substitution-backtick.stdout,
	tests/30-substitution-redirect.sh,
	tests/30-substitution-redirect.stdout,
	tests/30-substitution-word.sh,
	tests/30-substitution-word.stdout,
	tests/30-substitution.sh,
	tests/30-substitution.stdout: Delete files, moving their contents...
	* tests/command-substitution.org: ...here.
	* tests/40-assignment-eval-echo.sh,
	tests/40-assignment-eval-echo.stdout,
	tests/40-eval-echo-variable.sh,
	tests/40-eval-echo-variable.stdout,
	tests/40-eval.sh,
	tests/40-eval.stdout: Delete files, moving their contents...
	* tests/eval.org: ...here.
	* tests/41-dot.sh,
	tests/41-dot.stdout: Delete files, moving their contents...
	* tests/dot.org: ...here.
	* tests/42-export-new.sh,
	tests/42-export-new.stdout,
	tests/42-sh-export-new.sh,
	tests/42-sh-export-new.stdout,
	tests/42-sh-export.sh,
	tests/42-sh-export.stdout,
	tests/42-sh.sh,
	tests/42-sh.stdout: Delete files, moving their contents...
	* tests/exporting.org: ...here.
	* tests/data/42-export-new.sh: New file (copied from
	'tests/42-export-new.sh').
	* tests/43-trap-subshell.sh,
	tests/43-trap-subshell.stdout: Delete files, moving their contents...
	* tests/signals.org: ...here.
	* tests/50-iohere-builtin.sh,
	tests/50-iohere.sh,
	tests/50-iohere.stdout,
	tests/50-redirect-append.sh,
	tests/50-redirect-append.stdout,
	tests/50-redirect-clobber.sh,
	tests/50-redirect-clobber.stdout,
	tests/50-redirect-in-out.sh,
	tests/50-redirect-in-out.stdout,
	tests/50-redirect-in.sh,
	tests/50-redirect-merge.sh,
	tests/50-redirect-merge.stdout,
	tests/50-redirect-pipe.sh,
	tests/50-redirect-pipe.stdout,
	tests/50-redirect-sed.sh,
	tests/50-redirect-sed.stdout,
	tests/50-redirect-space.sh,
	tests/50-redirect-space.stdout,
	tests/50-redirect.sh,
	tests/50-redirect.stdout: Delete files, moving their contents...
	* tests/redirects.org: ...here.
	* tests/60-function-at.sh,
	tests/60-function-at.stdout,
	tests/60-function.sh,
	tests/60-function.stdout,
	tests/60-subst.sh: Delete files, moving their contents...
	* tests/functions.org: ...here.
	* tests/70-hash-hash.sh,
	tests/70-hash-hash.stdout,
	tests/70-hash.sh,
	tests/70-hash.stdout,
	tests/70-percent-percent.sh,
	tests/70-percent-percent.stdout,
	tests/70-percent-space.sh,
	tests/70-percent-space.stdout,
	tests/70-percent.sh,
	tests/70-percent.stdout,
	tests/70-slash-string-slash.sh,
	tests/70-slash-string.sh,
	tests/70-slash-string.stdout,
	tests/70-slash.sh,
	tests/70-slash.stdout: Delete files, moving their contents...
	* tests/variable-patterns.org: ...here.
	* tests/100-bracket-file.sh,
	tests/100-cd-foo.exit,
	tests/100-cd-foo.sh,
	tests/100-cd.sh,
	tests/100-cd.stdout,
	tests/100-test-false.sh,
	tests/100-test-file.sh,
	tests/100-test.sh: Delete files.
	* tests/README: Move this...
	* tests/data/README: ...here and adapt to the new directory.
	* test.sh: Delete file.
	* tests/run-test-suite.in: New file.
	* configure.ac: Configure it.
	* Makefile.am (TEST_EXTENSIONS): Replace '.sh' with '.org'.
	(SH_LOG_COMPILER): Delete variable.
	(ORG_LOG_COMPILER): New variable.
	(FULL_TESTS, XFAIL_TESTS): Replace '.sh' tests with '.org' tests.
	(BROKEN_TESTS): Delete variable.
	(TEST_DATA_FILES): Remove '.exit' and '.stdout' files; add
	tests/data/42-export-new.sh.
	(EXTRA_DIST): Add tests/data/README; remove tests/README,
	BROKEN_TESTS, and test.sh.
	* .gitignore: Adjust accordingly.

2019-06-07  Timothy Sample  <samplet@ngyro.com>

	Update the specification tests.

	* tests/spec/oil.scm: Update to the latest commit and filter out some
	new failing tests.

2019-06-04  Timothy Sample  <samplet@ngyro.com>

	Fix a typo in NEWS.

	* NEWS: Fix a typo.

Copyright © 2019-2022 Timothy Sample <samplet@ngyro.com>
Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.  This file is offered as-is,
without any warranty.
