From 4396b7880347824e7d855b043127f6417df62e41 Mon Sep 17 00:00:00 2001 From: Kirk McKelvey Date: Tue, 7 May 2024 17:40:27 -0400 Subject: [PATCH] source ~/.jq file on windows (fixes #3104) --- docs/content/manual/manual.yml | 3 ++- jq.1.prebuilt | 2 +- src/linker.c | 8 ++++---- tests/shtest | 16 ++++++++++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/docs/content/manual/manual.yml b/docs/content/manual/manual.yml index f2000f6ffa..ba2e66605b 100644 --- a/docs/content/manual/manual.yml +++ b/docs/content/manual/manual.yml @@ -3662,7 +3662,8 @@ sections: For example, with `-L$HOME/.jq` a module `foo` can be found in `$HOME/.jq/foo.jq` and `$HOME/.jq/foo/foo.jq`. - If `$HOME/.jq` is a file, it is sourced into the main program. + If `.jq` exists in the user's home directory, and is a file (not a + directory), it is automatically sourced into the main program. entries: - title: "`import RelativePathString as NAME [];`" diff --git a/jq.1.prebuilt b/jq.1.prebuilt index efa5aa2f34..678f8e3b14 100644 --- a/jq.1.prebuilt +++ b/jq.1.prebuilt @@ -4084,7 +4084,7 @@ Consecutive components with the same name are not allowed to avoid ambiguities ( For example, with \fB\-L$HOME/\.jq\fR a module \fBfoo\fR can be found in \fB$HOME/\.jq/foo\.jq\fR and \fB$HOME/\.jq/foo/foo\.jq\fR\. . .P -If \fB$HOME/\.jq\fR is a file, it is sourced into the main program\. +If \fB\.jq\fR exists in the user\'s home directory, and is a file (not a directory), it is automatically sourced into the main program\. . .SS "import RelativePathString as NAME [];" Imports a module found at the given path relative to a directory in a search path\. A \fB\.jq\fR suffix will be added to the relative path string\. The module\'s symbols are prefixed with \fBNAME::\fR\. diff --git a/src/linker.c b/src/linker.c index e7d1024c1d..2439babc92 100644 --- a/src/linker.c +++ b/src/linker.c @@ -420,13 +420,13 @@ int load_program(jq_state *jq, struct locfile* src, block *out_block) { return 1; } - char* home = getenv("HOME"); - if (home) { // silently ignore no $HOME - /* Import ~/.jq as a library named "" found in $HOME */ + jv home = get_home(); + if (jv_is_valid(home)) { // silently ignore if home dir not determined + /* Import ~/.jq as a library named "" found in $HOME or %USERPROFILE% */ block import = gen_import_meta(gen_import("", NULL, 0), gen_const(JV_OBJECT( jv_string("optional"), jv_true(), - jv_string("search"), jv_string(home)))); + jv_string("search"), home))); program = BLOCK(import, program); } diff --git a/tests/shtest b/tests/shtest index 6cc2e1725b..b7c2d0257a 100755 --- a/tests/shtest +++ b/tests/shtest @@ -354,11 +354,24 @@ clean=true # Check handling of ~/.jq; these can't move into jq_test.c yet because # they depend on $HOME +HOME_BAK=$HOME +unset HOME + if [ "$(HOME="$mods/home1" $VALGRIND $Q $JQ -nr fg)" != foobar ]; then echo "Bug #479 appears to be back" 1>&2 exit 1 fi +test_win_home_dir=false +$msys && test_win_home_dir=true +$mingw && test_win_home_dir=true +if $test_win_home_dir; then + if [ "$(USERPROFILE="$mods/home1" $VALGRIND $Q $JQ -nr foo)" != baz ]; then + echo "Bug #3104 regressed (sourcing %USERPROFILE%/.jq on Windows)" 1>&2 + exit 1 + fi +fi + if [ $(HOME="$mods/home1" $VALGRIND $Q $JQ --debug-dump-disasm -n fg | grep '^[a-z]' | wc -l) -ne 3 ]; then echo "Binding too many defs into program" 1>&2 exit 1 @@ -369,6 +382,9 @@ if ! HOME="$mods/home2" $VALGRIND $Q $JQ -n 'include "g"; empty'; then exit 1 fi +HOME=$HOME_BAK +unset HOME_BAK + cd "$JQBASEDIR" # so that relative library paths are guaranteed correct if ! $VALGRIND $Q $JQ -L ./tests/modules -ne 'import "test_bind_order" as check; check::check==true'; then echo "Issue #817 regression?" 1>&2