我试图使用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
报告了正斜杠和反斜杠的令人不快的混合物。
提前感谢您提供更多帮助。
答案 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
及其参数(checkout
,https:\github.com\jenglish\tile-extras.git
和C:\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程序中有太多的变化让我们这样做。来电者 - 你 - 必须处理用它。)