怎么办' svn checkout URL'用exec?

时间:2018-03-11 19:39:32

标签: tcl

我试图使用Tcl脚本使用svn从Github查看Joe English的tile-extras。

所需命令是

svn checkout https://github.com/jenglish/tile-extras.git path

我有一些归结为

的代码
exec C:/cygwin64/bin/svn.exe checkout                \
     https://github.com/jenglish/tile-extras.git C:/cygwin64/tmp/TCL61416]

失败并显示消息

couldn't execute "C:\cygwin64\bin\svn.exe checkout
         https:\github.com\jenglish\tile-extras.git 
    C:\cygwin64\tmp\TCL61416": No error

将错误消息中引用的命令粘贴到Windows命令提示符窗口中,我看到

svn: E125002: 'https:\github.com\jenglish\tile-extras.git' does not appear to be a URL

所以,问题似乎是exec将Tcl风格的路径转换为Unix风格的过度热情。有什么办法可以阻止它将https://github.com/jenglish...转换为https:\github.com\jenglish...吗?

有关信息,我在Windows 10上运行,使用cygwin(安装版本2.889(64位)),svn 1.9.7和tcl版本8.6.7(通过ActiveTcl 8.6.7.0)。

更新

这是我的实际代码,我只是有点尴尬:

# svn wrapper proposed by Donal Fellows at
# http://stackoverflow/questions/49224268

proc svn {args} {
    exec {*}[auto_execok svn] {*}$args <@stdin >@stdout }

# Checkout from github to a temporary repository

set repository https://github.com/jenglish/tile-extras.git set
svnImage [auto_execok svn]

set fil [file tempfile tempfnm] close $fil file delete $tempfnm

set tempRepo [file rootname $tempfnm] puts stdout tempRepo:\ $tempRepo
file mkdir $tempRepo

set svnCmd [list svn checkout $repository [file nativename $tempRepo]]
puts stdout svnCmd:\ $svnCmd eval $svnCmd

# Determine the tile-extras sources

set sourceFiles {keynav.tcl icons.tcl}
set targets [file nativename [file join $tempRepo trunk *.tcl]]
foreach filnam [split [svn ls $targets] \n] {
    if {[string match *.tcl $filnam] && [lsearch $sourceFiles $filnam] < 0}  {
        lappend sourceFiles $filnam
    }
 }

这是结果

$ tclsh foo.tcl
tempRepo: C:/cygwin64/tmp/TCL61838
svnCmd: svn checkout
https://github.com/jenglish/tile-extras.git {C:\cygwin64\tmp\TCL61838}
A    C:\cygwin64\tmp\TCL61838/branches
A    C:\cygwin64\tmp\TCL61838/trunk
A    C:\cygwin64\tmp\TCL61838/trunk/README.md
A    C:\cygwin64\tmp\TCL61838/trunk/dialog.tcl
A    C:\cygwin64\tmp\TCL61838/trunk/doc
A    C:\cygwin64\tmp\TCL61838/trunk/doc/dialog.n
A    C:\cygwin64\tmp\TCL61838/trunk/doc/keynav.n
A    C:\cygwin64\tmp\TCL61838/trunk/icons.tcl
A    C:\cygwin64\tmp\TCL61838/trunk/keynav.tcl
A    C:\cygwin64\tmp\TCL61838/trunk/license.terms
A    C:\cygwin64\tmp\TCL61838/trunk/pkgIndex.tcl
Checked out revision 7.
svn: E155007: '/home/alan/C:\cygwin64\tmp\TCL61838\trunk\*.tcl' is not a working copy
    while executing "exec {*}[auto_execok svn] {*}$args <@stdin >@stdout"
    (procedure "svn" line 2)
    invoked from within "svn ls $targets"
    invoked from within "split [svn ls $targets] \n"
    invoked from within "foreach filnam [split [svn ls $targets] \n] {
    if {[string match *.tcl $filnam] && [lsearch $sourceFiles $filnam] < 0} {
        lappend sourceFiles $filn..."
    (file "foo.tcl" line 30)
$ ls /tmp/TCL61838/
$

目录/tmp/TCL61838为空,因此svn checkout命令似乎没有完全愉快地完成。我还看到svn报告了正斜杠和反斜杠的令人不快的混合物。

提前感谢您提供更多帮助。

1 个答案:

答案 0 :(得分:2)

鉴于错误消息,看起来您在代码中出现了错误,而您没有向我们展示;虽然您可能认为代码“归结为”exec,但实际上并非 。此外,你已经在URL中翻转了不起作用的斜杠,但这可能是其他东西的副作用。

唉,我无法猜到如何为你解决问题。有太多的选择。我在下面提供了一个建议,但没有确定它是否会成功。

诊断方法

为什么我认为这个问题就是我所说的证据?此交互式会话日志(在OSX上,但通用行为应该相同):

% exec cat asdkfajh
cat: asdkfajh: No such file or directory
% exec "cat akjsdhfdkj"
couldn't execute "cat akjsdhfdkj": no such file or directory
% exec "cat aksdjhfkdf" skdjfghd
couldn't execute "cat aksdjhfkdf": no such file or directory

第一种情况显示外部程序出错。第二种情况显示由于没有这样的程序而导致的错误。第三种情况表明,由于没有这样的程序而导致错误时参数未被报告

这让我得出结论,C:\cygwin64\bin\svn.exe及其参数(checkouthttps:\github.com\jenglish\tile-extras.gitC:\cygwin64\tmp\TCL61416实际作为单个参数传递至exec,这是一个相当常见的错误,问题在于准备代码。您没有向我们展示准备代码,因此我们无法真正解决问题,但我们可以提出解决常见问题的建议。

建议的方法

减少这些错误的一个好方法是编写一个小的包装程序:

proc svn {args} {
    # I add in the I/O redirections so svn can ask for a password
    exec {*}[auto_execok svn] {*}$args <@stdin >@stdout
}

这可以让你把你的调用写成svn:

svn checkout $theURL [file nativename $theDirectory]

它可能就是Just Work™。另请注意,目录名称通过file nativename; URL没有。 (如果我们正在制作一个专门的程序进行检查,我们可以在程序中嵌入file nativename的调用,但是完整的svn程序中有太多的变化让我们这样做。来电者 - 你 - 必须处理用它。)