summaryrefslogtreecommitdiff
path: root/trip.rc
diff options
context:
space:
mode:
authorToby Goodwin <toby@paccrat.org>2014-09-02 08:01:39 +0100
committerToby Goodwin <toby@paccrat.org>2015-05-16 21:22:10 +0100
commita8699a58d8632f21e897ea5c4900a15483a9a8ca (patch)
treefd8e7910807eb91bcd79d498582959f1d750f9c6 /trip.rc
parentd884971193ef4934424b77ae862e8b0ecf70bab3 (diff)
release: rc-1.7.2
Diffstat (limited to 'trip.rc')
-rw-r--r--trip.rc141
1 files changed, 72 insertions, 69 deletions
diff --git a/trip.rc b/trip.rc
index 734429c..ed9c75d 100644
--- a/trip.rc
+++ b/trip.rc
@@ -4,9 +4,10 @@
rc=$0
echo tripping $rc $version
+tmpdir=''
fn fail {
echo >[1=2] trip took a wrong turn: $*
- rm -f $tmp
+ rm -rf $tmpdir
fn sigexit
exit 1
}
@@ -23,8 +24,8 @@ fn sigexit sigint sigquit sigsegv
fn sigexit {
echo trip complete
}
-tmp=/tmp/trip.$pid
-rm -f $tmp
+tmpdir=`{ mktemp -t -d rc-trip.XXXXXX }
+tmp=$tmpdir/tmp
nl='
'
@@ -51,19 +52,19 @@ if (false) { # WARNING: this differs from sh
umask 0
> $tmp
x=`{ls -l $tmp}
-if (!~ $x(1) '-rw-rw-rw-') fail umask 0 produced incorrect result: $x(1)
+if (!~ $x(1) -rw-rw-rw-*) fail umask 0 produced incorrect result: $x(1)
rm -f $tmp
umask 027
> $tmp
y=`{ls -l $tmp}
-if (!~ $y(1) '-rw-r-----') fail umask 027 produced incorrect file: $y(1)
+if (!~ $y(1) -rw-r-----*) fail umask 027 produced incorrect file: $y(1)
rm -f $tmp
if (!~ `umask 027) fail umask reported bad value: `umask
submatch 'umask bad' 'bad umask' 'bad umask'
submatch 'umask -027' 'bad umask' 'bad umask'
submatch 'umask 999999' 'bad umask' 'bad umask'
-submatch 'umask hi there' 'too many arguments to umask' 'umask arg count'
+submatch 'umask hi there' 'rc: too many arguments to umask' 'umask arg count'
if (!~ `umask 027) fail bad umask changed umask value to `umask
@@ -85,8 +86,8 @@ rm -f 1 2
expect error from cat, closing stdin
cat >[0=]
-submatch 'cat>(1 2 3)' 'multi-word filename in redirection' 'redirection error'
-submatch 'cat>()' 'null filename in redirection' 'redirection error'
+submatch 'cat>(1 2 3)' 'rc: multi-word filename in redirection' 'redirection error'
+submatch 'cat>()' 'rc: null filename in redirection' 'redirection error'
#
# blow the input stack
@@ -111,7 +112,7 @@ eval eval eval eval eval eval eval eval eval eval eval echo hi
# heredocs and herestrings
#
-bigfile=/tmp/big.$pid
+bigfile=$tmpdir/big.$pid
od $rc | sed 5000q > $bigfile
abc=(this is a)
x=()
@@ -140,11 +141,11 @@ eof
} '$')
fail quoting '$' in heredoc
-submatch 'cat<<eof' 'heredoc incomplete' 'incomplete heredoc'
+submatch 'cat<<eof' 'rc: heredoc incomplete' 'incomplete heredoc'
submatch 'cat<<eof
-' 'heredoc incomplete' 'incomplete heredoc'
+' 'rc: heredoc incomplete' 'incomplete heredoc'
-submatch 'cat<<(eof eof)' 'eof-marker not a single literal word' 'bad heredoc marker'
+submatch 'cat<<(eof eof)' 'rc: eof-marker not a single literal word' 'bad heredoc marker'
#
# lexical analysis
@@ -155,27 +156,27 @@ expect warning
$rc $tmp
rm -f $tmp
-echo here_is_a_really_long_word.It_has_got_to_be_longer_than_1000_characters_for_the_lexical_analyzers_buffer_to_overflow_but_that_should_not_be_too_difficult_to_do.Let_me_start_writing_some_Lewis_Carroll.Twas_brillig_and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe.All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.Beware_the_Jabberwock_my_son,The_jaws_that_bite,the_claws_that_catch.Beware_the_Jub-jub_bird,and_shun_The_frumious_Bandersnatch.He_took_his_vorpal_sword_in_hand,Long_time_the_manxome_foe_he_sought,So_rested_he_by_the_Tumtum_tree,And_stood_awhile_in_thought.And_as_in_uffish_thought_he_stood,The_Jabberwock,with_eyes_of_flame,Came_whiffling_through_the_tulgey_wood,And_burbled_as_it_came.One_two,one_two.And_through_and_through_The_vorpal_blade_went_snicker-snack.He_left_it_dead_and_with_its_head,He_went_galumphing_back.And_hast_thou_slain_the_Jabberwock?Come_to_my_arms,my_beamish_boy,Oh_frabjous_day.Callooh_callay.He_chortled_in_his_joy.Twas_brillig,and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe,All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe. > /tmp/$pid.lw
+echo here_is_a_really_long_word.It_has_got_to_be_longer_than_1000_characters_for_the_lexical_analyzers_buffer_to_overflow_but_that_should_not_be_too_difficult_to_do.Let_me_start_writing_some_Lewis_Carroll.Twas_brillig_and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe.All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.Beware_the_Jabberwock_my_son,The_jaws_that_bite,the_claws_that_catch.Beware_the_Jub-jub_bird,and_shun_The_frumious_Bandersnatch.He_took_his_vorpal_sword_in_hand,Long_time_the_manxome_foe_he_sought,So_rested_he_by_the_Tumtum_tree,And_stood_awhile_in_thought.And_as_in_uffish_thought_he_stood,The_Jabberwock,with_eyes_of_flame,Came_whiffling_through_the_tulgey_wood,And_burbled_as_it_came.One_two,one_two.And_through_and_through_The_vorpal_blade_went_snicker-snack.He_left_it_dead_and_with_its_head,He_went_galumphing_back.And_hast_thou_slain_the_Jabberwock?Come_to_my_arms,my_beamish_boy,Oh_frabjous_day.Callooh_callay.He_chortled_in_his_joy.Twas_brillig,and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe,All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe. > $tmpdir/$pid.lw
-echo 'here_is_a_really_long_word.It_has_got_to_be_longer_than_1000_characters_for_the_lexical_analyzers_buffer_to_overflow_but_that_should_not_be_too_difficult_to_do.Let_me_start_writing_some_Lewis_Carroll.Twas_brillig_and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe.All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.Beware_the_Jabberwock_my_son,The_jaws_that_bite,the_claws_that_catch.Beware_the_Jub-jub_bird,and_shun_The_frumious_Bandersnatch.He_took_his_vorpal_sword_in_hand,Long_time_the_manxome_foe_he_sought,So_rested_he_by_the_Tumtum_tree,And_stood_awhile_in_thought.And_as_in_uffish_thought_he_stood,The_Jabberwock,with_eyes_of_flame,Came_whiffling_through_the_tulgey_wood,And_burbled_as_it_came.One_two,one_two.And_through_and_through_The_vorpal_blade_went_snicker-snack.He_left_it_dead_and_with_its_head,He_went_galumphing_back.And_hast_thou_slain_the_Jabberwock?Come_to_my_arms,my_beamish_boy,Oh_frabjous_day.Callooh_callay.He_chortled_in_his_joy.Twas_brillig,and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe,All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.' > /tmp/$pid.lq
+echo 'here_is_a_really_long_word.It_has_got_to_be_longer_than_1000_characters_for_the_lexical_analyzers_buffer_to_overflow_but_that_should_not_be_too_difficult_to_do.Let_me_start_writing_some_Lewis_Carroll.Twas_brillig_and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe.All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.Beware_the_Jabberwock_my_son,The_jaws_that_bite,the_claws_that_catch.Beware_the_Jub-jub_bird,and_shun_The_frumious_Bandersnatch.He_took_his_vorpal_sword_in_hand,Long_time_the_manxome_foe_he_sought,So_rested_he_by_the_Tumtum_tree,And_stood_awhile_in_thought.And_as_in_uffish_thought_he_stood,The_Jabberwock,with_eyes_of_flame,Came_whiffling_through_the_tulgey_wood,And_burbled_as_it_came.One_two,one_two.And_through_and_through_The_vorpal_blade_went_snicker-snack.He_left_it_dead_and_with_its_head,He_went_galumphing_back.And_hast_thou_slain_the_Jabberwock?Come_to_my_arms,my_beamish_boy,Oh_frabjous_day.Callooh_callay.He_chortled_in_his_joy.Twas_brillig,and_the_slithy_toves,Did_gyre_and_gimble_in_the_wabe,All_mimsy_were_the_borogoves,And_the_mome-raths_outgrabe.' > $tmpdir/$pid.lq
-if (!~ ``(){cat /tmp/$pid.lw} ``(){cat /tmp/$pid.lq})
+if (!~ ``(){cat $tmpdir/$pid.lw} ``(){cat $tmpdir/$pid.lq})
fail expected long string and long word to be identical
-if (! x=`{wc -c /tmp/$pid.lw} ~ $x(1) 1088)
+if (! x=`{wc -c $tmpdir/$pid.lw} ~ $x(1) 1088)
fail expected long word to be 1088 bytes
-if (! x=`{wc -c /tmp/$pid.lq} ~ $x(1) 1088)
+if (! x=`{wc -c $tmpdir/$pid.lq} ~ $x(1) 1088)
fail expected long quote to be 1088 bytes
-rm /tmp/$pid.lw
-rm /tmp/$pid.lq
+rm $tmpdir/$pid.lw
+rm $tmpdir/$pid.lq
-submatch 'echo hi |[2' 'expected ''='' or '']'' after digit' 'scan error'
-submatch 'echo hi |[92=]' 'expected digit after ''=''' 'scan error'
-submatch 'echo hi |[a]' 'expected digit after ''[''' 'scan error'
-submatch 'echo hi |[2-' 'expected ''='' or '']'' after digit' 'scan error'
-submatch 'echo hi |[2=99a]' 'expected '']'' after digit' 'scan error'
-submatch 'echo hi |[2=a99]' 'expected digit or '']'' after ''=''' 'scan error'
-submatch 'echo ''hi' 'eof in quoted string' 'scan error'
+submatch 'echo hi |[2' 'rc: expected ''='' or '']'' after digit' 'scan error'
+submatch 'echo hi |[92=]' 'rc: expected digit after ''=''' 'scan error'
+submatch 'echo hi |[a]' 'rc: expected digit after ''[''' 'scan error'
+submatch 'echo hi |[2-' 'rc: expected ''='' or '']'' after digit' 'scan error'
+submatch 'echo hi |[2=99a]' 'rc: expected '']'' after digit' 'scan error'
+submatch 'echo hi |[2=a99]' 'rc: expected digit or '']'' after ''=''' 'scan error'
+submatch 'echo ''hi' 'rc: eof in quoted string' 'scan error'
ifs='' {
if (!~ 'h i' `{echo -n h\
@@ -197,7 +198,7 @@ if (! $rc -c '# eof in comment')
# test the syntax error printer
-prompt='' if (!~ `` $nl {$rc -cif>[2=1]} 'line 1: '*' error near if')
+prompt='' if (!~ `` $nl {$rc -cif>[2=1]} 'rc: line 1: '*' error near if')
fail print syntax error
prompt='' if (!~ `` $nl {$rc -icif>[2=1]} *' error')
@@ -226,9 +227,9 @@ bar
if (!~ $i 3)
fail return inside loop inside function failed
-submatch return 'return outside of function' 'return outside of function'
-submatch 'break 1' 'too many arguments to break' 'break arg count'
-submatch break 'break outside of loop' 'break outside of loop'
+submatch return 'rc: return outside of function' 'return outside of function'
+submatch 'break 1' 'rc: too many arguments to break' 'break arg count'
+submatch break 'rc: break outside of loop' 'break outside of loop'
for (i in 1 2 3 4 5)
if (~ $i 2)
@@ -236,7 +237,7 @@ for (i in 1 2 3 4 5)
if (!~ $i 2)
fail break out of loop
-submatch 'wait foo' 'foo is a bad number' 'bogus argument to wait'
+submatch 'wait foo' 'rc: `foo'' is a bad number' 'bogus argument to wait'
if (~ `{echo -n} ?)
fail echo -n
@@ -303,7 +304,7 @@ if (~ `{whatis limit >[2]/dev/null} builtin) {
fn cd
-submatch 'cd a b c' 'too many arguments to cd' 'cd arg count'
+submatch 'cd a b c' 'rc: too many arguments to cd' 'cd arg count'
$rc -c 'cdpath=() cd /frobnatz' >[2]/dev/null && fail 'cd to /frobnatz succeeded!?'
submatch 'cdpath='''' cd frobnatz' 'couldn''t cd to frobnatz' 'cd to frobnatz succeeded!?'
@@ -315,7 +316,7 @@ submatch 'cdpath='''' cd frobnatz' 'couldn''t cd to frobnatz' 'cd to frobnatz su
# wait
#
-submatch 'wait 1 2 3' 'too many arguments to wait' 'arg count'
+submatch 'wait 1 2 3' 'rc: too many arguments to wait' 'wait arg count'
$rc -c 'wait 1' >[2]/dev/null && fail wait 1
sleep 3&
@@ -329,9 +330,9 @@ if (~ `` '' {wait} ?)
#
# matching
#
-touch /tmp/abc.$pid /tmp/bbc.$pid
-mkdir /tmp/dir.$pid /tmp/dip.$pid
-touch /tmp/dir.$pid/^(a b c) /tmp/dip.$pid/^(a b c)
+touch $tmpdir/abc.$pid $tmpdir/bbc.$pid
+mkdir $tmpdir/dir.$pid $tmpdir/dip.$pid
+touch $tmpdir/dir.$pid/^(a b c) $tmpdir/dip.$pid/^(a b c)
if (!~ 123 [~x]?[0-9])
fail match
@@ -352,18 +353,18 @@ if (~ x [y])
if (~ x x?)
fail too many characters in pattern
-sh -c 'test -f /////tmp//////a?c.'^$pid || fail glob with many slashes
-if (!~ /////tmp//////a*.$pid /////tmp//////a?c.$pid)
+sh -c 'test -f /////$tmpdir//////a?c.'^$pid || fail glob with many slashes
+if (!~ /////$tmpdir//////a*.$pid /////$tmpdir//////a?c.$pid)
fail glob with many slashes
-if (!~ ////tmp////di?.$pid////* ////tmp////dir.$pid////*b*)
+if (!~ ////$tmpdir////di?.$pid////* ////$tmpdir////dir.$pid////*b*)
fail glob with more slashes
-if (! @{cd /; ~ */a*.$pid tmp/a*})
+if (! @{cd $tmpdir; ~ *.$pid/a d*/*})
fail glob in current directory
-if (!~ /tmp/?bc.$pid /tmp/bbc.$pid)
+if (!~ $tmpdir/?bc.$pid $tmpdir/bbc.$pid)
fail match of bbc.$pid against '('abc.$pid bbc.$pid')'
-rm /tmp/abc.$pid /tmp/bbc.$pid
-rm -rf /tmp/dir.$pid /tmp/dip.$pid
+rm $tmpdir/abc.$pid $tmpdir/bbc.$pid
+rm -rf $tmpdir/dir.$pid $tmpdir/dip.$pid
#
# signals
@@ -377,12 +378,12 @@ fn sigint
#
$rc -c /frobnatz >[2]/dev/null && fail 'search error'
-touch /tmp/noexec.$pid
-chmod a-x /tmp/noexec.$pid
-$rc -c /tmp/noexec.$pid >[2]/dev/null && fail /tmp/noexec.$pid is found!?
-rm /tmp/noexec.$pid
+touch $tmpdir/noexec.$pid
+chmod a-x $tmpdir/noexec.$pid
+$rc -c $tmpdir/noexec.$pid >[2]/dev/null && fail $tmpdir/noexec.$pid is found!?
+rm $tmpdir/noexec.$pid
-submatch 'path='''' frobnatz' 'frobnatz not found' 'search error'
+submatch 'path='''' frobnatz' 'rc: cannot find `frobnatz''' 'search error'
{path=() /bin/sh -c 'exit 0'} || fail abs pathname with path set to null
@@ -409,15 +410,15 @@ if (~ `` '' . ?*)
if (~ `` '' {. -i} ?*)
fail null dot -i
-cat > /tmp/dot.$pid << eof
+cat > $tmpdir/dot.$pid << eof
echo hi
eof
-prompt=';' if (!~ `` '' {. -i /tmp/dot.$pid>[2=1]} ';hi'^$nl';')
+prompt=';' if (!~ `` '' {. -i $tmpdir/dot.$pid>[2=1]} ';hi'^$nl';')
fail dot -i
-submatch .' '/tmp/dot.$pid hi dot
+submatch .' '$tmpdir/dot.$pid hi dot
-rm /tmp/dot.$pid
+rm $tmpdir/dot.$pid
$rc -c '. /frobnatz' >[2]/dev/null && fail 'dot of a nonexistent file'
@@ -459,7 +460,7 @@ foo=nest *=nest {
~ $* bar || fail restore of '$*' after local group
~ `{exec>[2=1];$rc -xc 'foo=()'} 'foo=()' || fail -x echo of variable deletion
-fn_ff='{' prompt='' if (!~ `` $nl {$rc -cff>[2=1]} 'line 1: '*' error near eof')
+fn_ff='{' prompt='' if (!~ `` $nl {$rc -cff>[2=1]} 'rc: line 1: '*' error near eof')
fail 'bogus function in environment'
#
@@ -509,8 +510,8 @@ switch (nothing) {
~ $i frobnatz || fail match '*' in switch
-submatch '()=()' 'null variable name' 'assignment diagnostic'
-submatch 'fn () {eval}' 'null function name' 'assigning null function name'
+submatch '()=()' 'rc: null variable name' 'assignment diagnostic'
+submatch 'fn () {eval}' 'rc: null function name' 'assigning null function name'
#
# prompt
@@ -522,19 +523,19 @@ fn prompt
#
# history
#
-history=/tmp/hist.$pid prompt='' echo 'history=()' | $rc -i
+history=$tmpdir/hist.$pid prompt='' echo 'history=()' | $rc -i
-if (!~ `{cat /tmp/hist.$pid} 'history=()')
+if (!~ `{cat $tmpdir/hist.$pid} 'history=()')
fail output to history file
-history=/tmp/hist.$pid prompt='' echo 'history=()' | $rc -i
+history=$tmpdir/hist.$pid prompt='' echo 'history=()' | $rc -i
-if (!~ `` () {cat /tmp/hist.$pid} 'history=()
+if (!~ `` () {cat $tmpdir/hist.$pid} 'history=()
history=()
')
fail append to history file
-rm /tmp/hist.$pid
+rm $tmpdir/hist.$pid
if (!~ `{history=/frobnatz/foo prompt='' echo eval | $rc -i >[2=1]} ?*)
fail accessing bad history file
@@ -564,7 +565,7 @@ x=/*
# fn sigexit should be cleared in children
x = ()
-expect nonesuch not found
+expect rc: cannot find '`nonesuch'''
x = `{true | nonesuch}; if (~ $x trip) fail sigexit in children
x = `{ < /dev/null wc |grep xxx }; if (~ $x trip) fail sigexit in children
x = `{{ wc | wc } < /dev/null }; if (~ $x trip) fail sigexit in children
@@ -575,7 +576,7 @@ x = `{{ wc | wc } < /dev/null }; if (~ $x trip) fail sigexit in children
# check for ctrl-a bug
x=`{./tripping a}
-# ~ `{$rc -c 'echo $x'} $x || fail ctrl-a bug detected
+~ `{$rc -c 'echo $x'} $x || fail ctrl-a bug detected
# check for hilarious quoting bug introduced while fixing ctrl-a
x=('#' '#' '#')
@@ -584,13 +585,15 @@ eval z^`{whatis -v x}
# parens bypass quote detector bug
fn x {echo x.y $(x.y)}
-~ ``''{whatis -f x} 'fn x {echo x.y $''x.y''}
+~ ``''{whatis -f x} 'fn x {echo x.y $(x^.y)}
' || fail sneaky parens bug
# before rc-1.7.1, certain glob patterns could fail on broken symlinks
-mkdir $tmp.qux
-ln -s /frobnatz $tmp.qux/foo
-x=$tmp.qux/foo*
-~ $x $tmp.qux/foo || { rm -rf $tmp.qux; fail broken symlink globbing }
-x=$tmp.qux*/foo
-~ $x $tmp.qux/foo || { rm -rf $tmp.qux; fail broken symlink globbing }
+mkdir $tmpdir/qux
+ln -s /frobnatz $tmpdir/qux/foo
+x=$tmpdir/qux/foo*
+~ $x $tmpdir/qux/foo || { rm -rf $tmpdir/qux; fail broken symlink globbing }
+x=$tmpdir/qux*/foo
+~ $x $tmpdir/qux/foo || { rm -rf $tmpdir/qux; fail broken symlink globbing }
+
+rm -rf $tmpdir