想要在cvs commit之前检测重复的proc

时间:2014-05-23 17:08:11

标签: tcl cvs

全部,  需要以下建议。  在我在cvs中提交新的tcl proc之前,我想检查正在提交的新procs是否具有预先存在的tcl procs的重复名称。如果名称中有重复,我们可以中止提交。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以使用dict来检查重复项:

dict exists $hash procName
dict append hash procName value

所以

if ![dict exists $hash procName] {dict append hash procName value}

答案 1 :(得分:0)

好吧,我建议使用Tcl本身而不是使用bash或python。我假设你有Tcl 8.5或更高版本。

基本思想是使用一个解释器,它忽略除proc定义之外的大多数命令。

set ip [interp create]
interp hide $ip source
interp eval $ip {
    rename ::tcl::info::frame tcl:info:frame
}
interp hide $ip tcl:info:frame
interp eval $ip {
    namespace delete ::
}
proc NOP args {}
interp alias $ip unknown {} NOP

现在我们需要以特殊方式处理一些命令:

proc qualify-cmd {name} {
    return $name
}

proc proc-alias {name arg body} {
    define-cmd [qualify-cmd $name]
}
interp alias $ip proc {} proc-alias

proc define-cmd {name} {
   global procs
   set frameinfo [interp invokehidden $::ip tcl:info:frame 1]
   if {[dict get $frameinfo type] eq "source"} {
      set file [dict get $frameinfo file]
      set line [dict get $frameinfo line]
   } else {
      set file "<unknown>"
      set line 0
   }
   if {[dict exists $procs $name]} {
       set ofile [dict get $procs $name file]
       set oline [dict get $procs $name line]
       return -code error "proc redefiniton of $name in $file line $line (original $ofile line $oline)"
   } else {
       dict set procs $name file $file
       dict set procs $name line $line
   }
}
# Load the old definitions
set procs {}

# Now we have to source changed file in the slave interp

proc checkfile {file} {
    global procs
    dict for {name val} $procs {
        if {[dict get $val file] eq $file} {
            dict unset procs $name
        }
    }
    interp invokehidden $ip source foobar.tcl
}

其余的是最艰苦的工作,但我不确定你是否需要它:

  • 命名空间即可。您必须处理namespace命令并修改qualify-cmd
  • 分支即可。有人可以在ifwhile等内部定义命令。
  • 变量即可。这种解决方案不是防弹的。如果有人使用proc之外的变量,则会失败。您可以尝试捕获错误,设置变量并再试一次。 (这就是我想要unknownvar
  • 的原因