从Expect脚本运行Git命令失败

时间:2012-02-29 18:07:38

标签: git tcl expect

我正在编写一个Expect脚本,每次在AWS上生成新的服务器实例时从我们的dev服务器中提取最新的代码。我们的想法是,在创建新服务器时,脚本在启动之前运行,然后放在负载均衡器之后。它完美无缺,除非Git因冲突而中止。这是迄今为止的代码:

#!/usr/bin/expect -f
set timeout 240

spawn /xyz/pullfromdev
expect "*?assphrase*"
send -- "<mypass>\r"

expect {
        "Aborting" {
                set response $expect_out(buffer)
                set format [split $response "\n"]
                cd /var/www/html
                foreach line $format {
                        if { !([string range $line 0 8] == "Identity " || [string range $line 0 8] == "Updating " || [string range $line 0 5] == "error:" || [string range $line 0 6] == "Please," || [string range $line 0 7] == "Aborting" || [string length $line] == 1 ) } {
                                open "| git checkout -- [string trim $line]"
                        }
                }
                spawn /xyz/pullfromdev
                expect "*?assphrase*"
                send -- "<mypass>\r"
        }
}

expect eof

基本上我正在拆分输出缓冲区并尝试为每个有冲突的文件运行git checkout -- <filename>。然后试图再次拉动,希望成功完成。

问题在于:

open "| git checkout -- [string trim $line]"

它显然不会执行任何操作,我也不会收到任何错误。该脚本试图从开发服务器再次拉出并中止,因为没有发生git checkout并且冲突仍然存在。 TCL对我来说有点陌生,所以它可能是一个语法问题?我尝试过spawn和exec,但它们似乎也没有用。冲突仍然存在,git中止。

但是,如果我通过命令行运行git checkout -- <filename>,那么该特定文件不再发生冲突(因为实际发生了结账)。所以问题实际上是让git checkout命令从Expect脚本运行,我无法以某种方式进行。

有没有人有任何建议?

如果它有帮助,这是在CentOS 5上,代码中引用的'pullfromdev'脚本就是:

#!/bin/bash
cd /var/www/html
ssh-agent bash -c 'ssh-add /xyz/<identity>; git pull'

2 个答案:

答案 0 :(得分:1)

您不能使用==来比较TCL中的字符串。试试string compareregexp命令。

答案 1 :(得分:1)

打开管道时,除第一个字符外的所有内容都是Tcl参数列表(第一个|是特殊的)。这意味着你应该使用它:

open |[list git checkout -- [string trim $line]]