racket/collects/meta/build/unix-installer/test-expand-path-var
Eli Barzilay 0814fd5fb5 Make it possible to use "~" or "~user" in the installer.
I've looked for a while, and it seems that there is no easy way to do
this, not even in bash, and worse with /bin/sh.  So this is kind of
resorting to a simple parsing of the input, and using `eval' if it
starts with a tilde.  Note the hack of not doing that when there is a
space, otherwise the `eval' thing will silently ignore it.

This hack means that it's easy to get into a mess if quotes are used
after a tilde, but that was already the case with the use of `eval' to
handle environment variables.  It's not a real security issue, however,
since we're talking about a user who can just run any command anyway.

Also including a test file for the expansion functionality.  If anyone
wants to improve this code, making the tests pass would reveal the
tricky issues.

[FWIW, I've asked on the #bash channel, and the only serious suggestion
was getting the paths as command-line arguments.  This will, however,
defeat the point of being newbie friendly...]

Closes PR 12893.
2012-07-18 22:25:41 -04:00

48 lines
1.0 KiB
Bash
Executable File

#!/bin/sh
awk -- '
/^expand_path_var()/ { showing = 1; }
{ if (showing) print; }
/^}/ { showing = 0; }
' "`dirname \"$0\"/`/installer-header" > "/tmp/test-$$"
. "/tmp/test-$$"
rm "/tmp/test-$$"
test() {
foo="$1"
expand_path_var foo
if [ ! "x$foo" = "x$2" ]; then
echo "fail: $1 -> $foo; expected $2" 1>&2
exit 1
fi
}
test 'blah' "blah"
test 'blah blah' "blah blah"
test 'blah blah' "blah blah"
test 'blah=blah' "blah=blah"
test 'x=1 y=2 z=3' "x=1 y=2 z=3"
test '$HOME' "$HOME"
test '$HOME/foo' "$HOME/foo"
test '$HOME/ foo' "$HOME/ foo"
test '$HOME / foo' "$HOME / foo"
test '~' "$HOME"
test '~/' "$HOME/"
test '~/x' "$HOME/x"
test '~/x/y' "$HOME/x/y"
test '~/x /y' "$HOME/x /y"
test '~/ x / y ' "$HOME/ x / y "
test '~/ ' "$HOME/ "
test '~ ' "~ "
test '~eli' "$HOME"
test '~eli ' "~eli "
test '~e li' "~e li"
test '~ eli' "~ eli"
test '~eli /x' "~eli /x"
test '~root/x' "/root/x"
test '~bleh' "~bleh"
test '~bleh ' "~bleh "
test '~/x y' "$HOME/x y"
test '~/x;pwd' "$HOME/x;pwd"
echo "All tests passed."