2 # This script starts LyX, and restarts LyX if it is closed
3 # it logs all output, including backtraces to development/keystest/out/GDB
5 #Setting the following may give better screen shots
6 #gconftool-2 /apps/metacity/general/compositing_manager -s -t bool true
8 DIRNAME0=`dirname "$0"`
10 ROOT_OUTDIR="$DIRNAME0/out"
15 if [ ! -e "$EXE_TO_TEST" ]
17 echo "$EXE_TO_TEST" does not exist
22 #BORED_AFTER_SECS=7200 #If we have spend more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead
23 BORED_AFTER_SECS=3600 #If we have spend more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead
27 #############################
28 # This section of code is LyX Specific
29 #############################
31 if [ ! -e $DIRNAME0/.lyx ]
33 echo WARNING $DIRNAME0/.lyx does not exist
34 echo will need to regenerate .lyx every test
37 #if [ ! -e lib/doc.orig ]
39 # mv lib/doc lib/doc.orig
43 kill `list_all_children.sh $1`
45 kill -9 `list_all_children.sh $1`
50 ensure_cannot_print () {
51 if [ ! -z "$REPLAYFILE" ]
58 echo We can print, this is bad!
59 echo use lpadmin to stop keytest from destroying a forest.
63 echo "Phew, lpq reckons we aren't ready to print. This is a *good* thing!"
71 if [ lib/doc/$f -nt lib/doc.orig/$f -o ! -e lib/doc.orig/$f ]
73 #echo making doc dir $OUTDIR/$SEC.doc
74 mkdir -p $OUTDIR/$SEC.doc
75 cp -a lib/doc/$f $OUTDIR/$SEC.doc/
84 cp -p lib/doc.orig/*.lyx lib/doc/
88 name=`(cat $GDB | grep -o ' in lyx::[[:alnum:]:]*' ; cat $GDB | grep -o ' [ai][nt] [[:alnum:]:]*' ) | head -n3 | sed s/in// | sed 's/ //g'`
89 echo $name | sed 's/ /__/g'
94 echo "$ROOT_OUTDIR/$id.reproduced"
99 echo getting pidof "$1" 1>&2
100 #PID=`ps "-u$USER" "$2" | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
101 PID=`ps x | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
102 echo "$PID" | ( grep " " > /dev/null && ( echo too many PIDs 1>&2 ; full_exit ) )
103 nPIDs=`echo PID "$PID" | wc -l`
104 echo nPIDs $nPIDs 1>&2
106 echo -- if [ "$nPIDs" != "1" ] 1>&2
107 if test "$nPIDs" != "1" #2> /tmp/testerr
109 echo autolyx: Wrong number of PIDs "$nPIDs" "($1)" "($2)" 1>&2
112 echo got pidof "$1" 1>&2
115 KT_PID=`get_pid keytest.py x`
124 echo attempting to exit this entire script... normal exit may just exit one function
128 echo We should not get this far
131 echo We really should not get this far
141 shell kill $CHILD_PID
144 shell kill -9 $CHILD_PID
145 " ; yes q) | HOME="$NEWHOME" gdb src/lyx 2>&1 | strings| tee $GDB
148 #shell wmctrl -r __renamed__ -b add,shaded
149 #shell wmctrl -r term -b add,shaded
150 #shell wmctrl -r term -b add,shaded
151 #shell wmctrl -R lyx'
153 #shell import -window root '$GDB.png'
154 #shell import -window root '$GDB..png'
159 ###########################
166 export CONFIRM_FILE=`calc_confirm_file`
167 if [ ! -e "$CONFIRM_FILE" ]
169 echo $CONFIRM_FILE does not exist
170 echo This bug appears not to have been reproduced before
171 echo Will try to reproduce now
175 echo Finished attempt at replay
177 echo $CONFIRM_FILE exists
178 echo This bugs has already been reproduced
179 echo Will not attempt to reproduce again
184 (REPLAYFILE="$KEYCODEpure" TAIL_LINES=25 MAX_TAIL_LINES=10000 bash "$0")&
186 echo Backgrounded $TEST_PID
187 echo waiting for $TEST_PID to finish
192 test -e "$f.replay/last_crash_sec" -o -e "$f.replay/Irreproducible"
195 move_to_replayed () {
196 mkdir -p $REPLAY_DIR/replayed
197 mv $f* $REPLAY_DIR/replayed
200 do_queued_replays() {
201 REPLAY_DIR=development/keytest/out/toreplay
202 for f in `ls $REPLAY_DIR/*KEYCODEpure`
208 #./development/keytest/killtest
212 KEYCODEpure="$f" do_replay
223 # ps a | grep $1 | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'
228 KEYCODE=$OUTDIR/$SEC.KEYCODE
229 KEYCODEpure=$OUTDIR/$SEC.KEYCODEpure
230 NEWHOME=~/kt.dir/$SEC.dir
232 NEWHOME=`cd $NEWHOME; pwd`
233 echo NEWHOME $NEWHOME
235 cp -rv $DIRNAME0/.lyx "$NEWHOME"/
236 killall -9 lyx latex pdflatex
239 echo -- 1 || full_exit
242 echo -- while [ -z "$LYX_PID" -a 200 -gt $i ]
243 while [ -z "$LYX_PID" -a 200 -gt $i ]
245 #export LYX_PID=`ps a | grep /src/lyx | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
246 export LYX_PID=`get_pid "/src/lyx$" `
247 echo LYXPID "$LYX_PID" || full_exit
251 echo `ps a | grep /src/lyx`
253 echo `ps a | grep /src/lyx | grep -v grep`
255 echo `ps a | grep /src/lyx | grep -v grep | sed 's/ [a-z].*$//'`
257 echo LYX_PID=$LYX_PID
258 echo XA_PRIMARY | xclip -selection XA_PRIMARY
259 echo XA_SECONDARY | xclip -selection XA_SECONDARY
260 echo XA_CLIPBOARD | xclip -selection XA_CLIPBOARD
262 echo -- if [ ! -z "$LYX_PID" ]
263 if [ ! -z "$LYX_PID" ]
265 kill `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
267 kill -9 `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
268 while ! wmctrl -r lyx -b add,maximized_vert,maximized_horz
270 echo trying to maximize lyx
273 KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py | tee $KEYCODE
274 #echo "$!" > $NEWHOME/keytest_py.pid
281 #You may want to use the following to simulate SIGFPE
282 #(sleep 90 && killall -8 lyx) &
289 # (sleep 600 ; kill "$!")
290 # echo WAITING FOR: wait $GDBTASK_PID
292 # echo NOLONGER waiting for: wait $GDBTASK_PID
296 KT_PID=`get_pid keytest.py`
302 # Or use "exited normally":
304 # these tend to take up a huge amount of space:
306 if (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE)
309 mkdir -p $OUTDIR/save && (
310 ln $OUTDIR/$SEC.* $OUTDIR/save ||
311 cp $OUTDIR/$SEC.* $OUTDIR/save)
313 echo $LAST_CRASH_SEC > $OUTDIR/last_crash_sec
314 if [ ! -z "$TAIL_LINES" ]
317 echo Reproducible > $OUTDIR/Reproducible
320 if [ -z "$REPLAYFILE" ]
322 echo ATTEMPTING TO REPLAY
325 export KEYTEST_INFILE=$KEYCODEpure
326 NUM_KEYCODES=`wc -l < $KEYCODEpure`
327 echo NUM_KEYCODES $NUM_KEYCODES, was $LAST_NUM_KEYCODES
328 if [ "$NUM_KEYCODES" != "$LAST_NUM_KEYCODES" ]
331 LAST_NUM_KEYCODES=$NUM_KEYCODES
332 echo "Hooray! we have eleminated some keycodes"
335 if [ ! -z "$AND_THEN_QUIT" ]
341 if [ ! -z "$LAST_CORE" ]
345 LAST_CORE="$GDB.core"
348 mv $OUTDIR/$SEC.* $BAK/
349 if [ ! -z "$TAIL_LINES" ]
351 echo TTL3 $TAIL_LINES
352 echo MAX_TAIL_LINES "$MAX_TAIL_LINES"
353 TAIL_LINES=$(($TAIL_LINES*2))
354 echo TTL4 $TAIL_LINES
355 if [ "$TAIL_LINES" -ge "0$MAX_TAIL_LINES" -a ! -z "$MAX_TAIL_LINES" ]
357 echo Giving up because $TAIL_LINES '>' $MAX_TAIL_LINES
358 echo Irreproducible > $OUTDIR/Irreproducible
362 if [ ! -z "$AND_THEN_QUIT" ]
369 echo TTL2 $TAIL_LINES
378 if [ ! -z "$REPLAYFILE" ]
381 OUTDIR="$REPLAYFILE.replay/"
382 mkdir -p $REPLAYFILE.replay/ || full_exit
383 export KEYTEST_INFILE=$REPLAYFILE
384 if [ ! -e "$REPLAYFILE" ]
386 echo "$REPLAYFILE" does not exist
395 get_pid [0-9].x-session-manager"$" x
396 export X_PID=`get_pid [0-9].x-session-manager x`
399 export TAIL_LINES=$TAIL_LINES
409 #rename other windows to avoid confusion.
410 wmctrl -N __renamed__ -r lyx
411 wmctrl -N __renamed__ -r lyx
412 wmctrl -N __renamed__ -r lyx
413 wmctrl -N __renamed__ -r lyx
414 export PATH=`cd $DIRNAME0; pwd`/path:$PATH
420 if [ ".$SCREENSHOT_OUT." = ".auto." ]
422 echo SCREENSHOT_OUT was $SCREENSHOT_OUT.
423 export SCREENSHOT_OUT="$OUTDIR/$SEC.s"
424 echo SCREENSHOT_OUT is $SCREENSHOT_OUT.
428 do_one_test #| tee do_one_test.log
432 kill `list_all_children.sh $$`
434 kill -9 `list_all_children.sh $$`
447 LAST_EVENT=`date +%s` # Last time something interesting happened. If nothing interesting has happened for a while, we should quit.
451 export X_PID=`get_pid [0-9].x-session-manager"$" x`
455 echo Currently running autolyx PID=$$
456 if [ ! -z "$TAIL_LINES" ]
458 echo TAIL_LINES: "$TAIL_LINES"
459 TAIL_FILE=$OUTDIR/tail_"$TAIL_LINES"
460 tail -n "$TAIL_LINES" "$REPLAYFILE" > $TAIL_FILE
461 KEYTEST_INFILE=$TAIL_FILE
468 if [ ! -z "$REPLAYFILE" ]
470 echo Boredom factor: $SEC-$LAST_EVENT'=' $(($SEC-$LAST_EVENT))
471 if [ $(($SEC-$LAST_EVENT)) -gt $BORED_AFTER_SECS ]
474 echo Is is now $SEC seconds
475 echo The last time we managed to eliminate a keycode was at $LAST_EVENT
476 echo We get bored after $BORED_AFTER_SECS seconds
479 echo $LAST_CRASH_SEC > $OUTDIR/Finished
481 ln $OUTDIR/$SEC* $OUTDIR/final || cp $OUTDIR/$SEC* $OUTDIR/final
482 CONFIRM_FILE=`calc_confirm_file`
483 echo Reproducible > "$CONFIRM_FILE"
494 ) 2>&1 |tee $OUTDIR/log