Tcl 如何做';svn签出URL';使用exec?

Tcl 如何做';svn签出URL';使用exec?,tcl,Tcl,我正在尝试使用svn和Tcl脚本从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

我正在尝试使用svn和Tcl脚本从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…

作为参考,我在Windows10上运行,使用cygwin(安装版本2.889(64位))、SVN1.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
    }
 }
#由Donal Fellows在
# http://stackoverflow/questions/49224268
proc svn{args}{
exec{*}[auto_execok svn]{*}$args@stdout}
#从github签出到临时存储库
设置存储库https://github.com/jenglish/tile-extras.git 设置
svnImage[自动执行svn]
设置fil[文件tempffile tempfnm]关闭$fil文件删除$tempfnm
set tempRepo[file rootname$tempfnm]放置标准输出tempRepo:\$tempRepo
文件mkdir$tempRepo
设置svnCmd[列出svn签出$repository[文件nativename$tempRepo]]
放置标准输出svnCmd:\$svnCmd eval$svnCmd
#确定平铺附加源
设置源文件{keynav.tcl icons.tcl}
设置目标[file nativename[file join$tempRepo trunk*.tcl]]
foreach filnam[拆分[svn ls$目标]\n]{
如果{[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/
$
$tclsh foo.tcl
tempRepo:C:/cygwin64/tmp/TCL61838
svnCmd:svn签出
https://github.com/jenglish/tile-extras.git {C:\cygwin64\tmp\TCL61838}
A C:\cygwin64\tmp\TCL61838/branchs
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
签出第7版。
svn:E155007:“/home/alan/C:\cygwin64\tmp\TCL61838\trunk\*.tcl”不是工作副本
执行“exec{*}[auto_execok svn]{*}$args@stdout”时
(程序“svn”第2行)
从“svn ls$目标”中调用
从“拆分[svn ls$目标]\n”中调用
从“foreach filnam[split[svn ls$targets]\n]内调用{
如果{[string match*.tcl$filnam]&&[lsearch$sourceFiles$filnam]<0}{
lappend源文件$filn…”
(文件“foo.tcl”第30行)
$ls/tmp/TCL61838/
$
目录
/tmp/TCL61838
是空的,因此
svn checkout
命令似乎没有完全顺利完成。我还看到
svn
报告了一个令人不快的正斜杠和反斜杠的混合体


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

给出了错误消息,看起来您在未向我们展示的代码中得到了错误的单词边界;而您可能认为代码“归结为”对于该
exec
,实际上并没有这样做。此外,您在URL中翻转了斜杠,这不会起作用,但这可能是其他操作的副作用

唉,我猜不出如何为你解决问题。选择太多了。我在下面提供了一个建议,但无法确定它是否会奏效

诊断方法学 为什么我认为问题在于我所说的?这个交互式会话日志(在OSX上,但一般行为应该是相同的):

第一种情况显示来自外部程序的错误。第二种情况显示由于没有此类程序而导致的错误。第三种情况显示由于没有此类程序而导致错误时不报告参数

这让我得出结论,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
}

这可能会奏效™. 还请注意,只有目录名通过
文件nativename
;URL不通过。(如果我们要进行专门的签出过程,我们可以在过程中嵌入对
文件nativename
的调用,但是完整的svn程序中有太多的变化,我们无法做到这一点。调用方-您-必须处理它。)

等等,什么?什么时候可以使用SVN克隆Git存储库了?为什么需要Tcl?按照问题的顺序回答上述两个问题-我不知道,但是,从Github的帮助中,“您还可以使用Subversion客户端访问Github上的任何存储库”。我不需要Tcl。我希望将各种源连接到一个文件中,原因我已记不清了。我有一个代码库,建立了十多年,依赖于单个文件,该文件足够大,我希望继续使用该技术。当您将URL括在大括号中时,它是否有效?这并不容易;实际上,我在变量中同时包含URL和
exec
命令,并且我还不能立即生成URL周围正好有一对大括号的内容。我正在将命令编写为
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 checkout $theURL [file nativename $theDirectory]