This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Expect script stops working after upgrade to latest version


A 40-page expect script I've been maintaining for my department for a
year and a half stopped working when I upgraded to 20021217-1 last
December. I reported it at that time:

http://cygwin.com/ml/cygwin/2002-12/msg01316.html

The same problem still occurs after upgrades to 20021218-1 as well as
20030128-1. When I back out to version 20010117-1, the script resumes
functioning correctly.

The script dies thusly (although the strings displayed after "invalid
command name" and "while executing" vary):

----------------------------------------

expect: does "\r\n=== Received trap ===\r\n" (spawn_id 4) match regular expression "=+ +(Journaled Event [(]C[^:]*: +([0-9]+|0x[0-9A-Fa-f]+), +S[^:]*: +([0-9]+|0x[0-9A-Fa-f]+)[)]) +=+ *[\n\r]+"? no
"=+ +(Received trap) +=+ *[\n\r]+"? yes
expect: set expect_out(0,string) "=== Received trap ===\r\n"
expect: set expect_out(1,string) "Received trap"
expect: set expect_out(spawn_id) "4"
expect: set expect_out(buffer) "\r\n=== Received trap ===\r\n"

===== Received trap =====

expect: does "" (spawn_id 4) match regular expression "^toolname@4840_27_28> "? no
"([^\n\r]*)[\n\r][\n\r]"? no

expect: does "toolname@4840_27_28> \r\n=== Sending set ===\r\n" (spawn_id 4) match regular expression "^toolname@4840_27_28> "? yes
expect: set expect_out(0,string) "toolname@4840_27_28> "
expect: set expect_out(spawn_id) "4"
expect: set expect_out(buffer) "toolname@4840_27_28> "
invalid command name "^C"
    while executing
"^A"
    invoked from within
"expect_user -nobrace       -re "^ *#\[^\n\r]*\[\n\r]+" {
      send_log $expect_out(buffer)
    }      -re "^ *auto-journaling +(on|off) *\[\n\r]+" {
..."
    invoked from within
"expect_user {

    -re "^ *#\[^\n\r]*\[\n\r]+" {
      send_log $expect_out(buffer)
    }

    -re "^ *auto-journaling +(on|off) *\[\n\r]+" {
      se..."
    ("while" body line 3)
    invoked from within
"while { 1 } {
  send_user $tool_prompt
  expect_user {

    -re "^ *#\[^\n\r]*\[\n\r]+" {
      send_log $expect_out(buffer)
    }

    -re "^ *auto-j..."
    (file "/usr/local/bin/cneomi" line 1583)

----------------------------------------

What it's attempting to do

First, it matches "===== Received trap =====" via the second regexp in this pattern:

expect_before {
  -re "=+ +(Journaled Event \[(]C\[^:]*: +(${num_pat}), +S\[^:]*: +(${num_pat})\[)]) +=+ *\[\n\r]+" {
    send_user "\n===== $expect_out(1,string) =====\n"
    dump_output
    send_special_set $expect_out(2,string) $expect_out(3,string)
  }
  -re "=+ +(Received trap) +=+ *\[\n\r]+" {
    send_user "\n===== $expect_out(1,string) =====\n"
    dump_output
  }
  -re "=+ +(Discarded trap from \"\[0-9.]+\") +=+ *\[\n\r]+" {
    send_user "\n===== $expect_out(1,string) =====\n"
    dump_output
  }
  -re "=+ +(Sending set) +=+ *\[\n\r]+" {
    send_user "\n===== $expect_out(1,string) =====\n"
    dump_output
  }
}

Then, it runs dump_output to dump the output from the spawned process
until the tool prompt is encountered. The expect script dies after
matching the prompt string regexp:

proc dump_output {} {
  global prompt

  set old_before [ expect_before -info ]
  set old_after [ expect_after -info ]

  expect_before
  expect_after

  expect {
    -re "^${prompt}" {}
    -re "(\[^\n\r]*)\[\n\r]\[\n\r]" {
      send_user " $expect_out(1,string)\n"
      exp_continue
    }
  }

  expect_before -brace $old_before
  expect_after -brace $old_after
}

----------------------------------------

Here's what it looks like when it works with version 20010117-1:

expect: does "\r\n=== Received trap ===\r\n" (spawn_id 4) match regular expression "=+ +(Journaled Event [(]C[^:]*: +([0-9]+|0x[0-9A-Fa-f]+), +S[^:]*: +([0-9]+|0x[0-9A-Fa-f]+)[)]) +=+ *[\n\r]+"? no
"=+ +(Received trap) +=+ *[\n\r]+"? yes
expect: set expect_out(0,string) "=== Received trap ===\r\n"
expect: set expect_out(1,string) "Received trap"
expect: set expect_out(spawn_id) "4"
expect: set expect_out(buffer) "\r\n=== Received trap ===\r\n"

===== Received trap =====

expect: does "" (spawn_id 4) match regular expression "^toolname@4840_27_28> "? no
"([^\n\r]*)[\n\r][\n\r]"? no

expect: does "toolname@4840_27_28> \r\n=== Sending set ===\r\n" (spawn_id 4) match regular expression "^toolname@4840_27_28> "? yes
expect: set expect_out(0,string) "toolname@4840_27_28> "
expect: set expect_out(spawn_id) "4"
expect: set expect_out(buffer) "toolname@4840_27_28> "

CNEOMI>
expect: does "\r\n=== Sending set ===\r\n" (spawn_id 4) match regular expression "=+ +(Journaled Event [(]C[^:]*: +([0-9]+|0x[0-9A-Fa-f]+), +S[^:]*: +([0-9]+|0x[0-9A-Fa-f]+)[)]) +=+ *[\n\r]+"? no
"=+ +(Received trap) +=+ *[\n\r]+"? no
"=+ +(Discarded trap from "[0-9.]+") +=+ *[\n\r]+"? no
"=+ +(Sending set) +=+ *[\n\r]+"? yes
expect: set expect_out(0,string) "=== Sending set ===\r\n"
expect: set expect_out(1,string) "Sending set"
expect: set expect_out(spawn_id) "4"
expect: set expect_out(buffer) "\r\n=== Sending set ===\r\n"

===== Sending set =====

----------------------------------------
-- 
Bradley Holdridge

Attachment: cygcheck.txt
Description: cygcheck dump

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]