某个项目经常需要在改完代码之后修改版本号,大概有7、8个文件需要一个个改动然后check in。我发现这个操作有个特点就是所有的版本号都是一样的,而且需要修改的字符串非常有规律,就是类似查找1, 6, 0, 16替换成1, 6, 0, 17这样,同时还有1,6,0,16替换成1,6,0,17(区别是逗号后面没有空格)。这种分析查找替换用Lua来做再简单不过了,故此写了这个脚本。
如果要使用的话,需要修改下面粗体部分,comment_string是将被作为注释加入clearcase的。old_string和new_string分别是当前版本号以及下一个版本号。projfolder一般只需要修改一次,就是clearcase的项目view目录。使用之前应该安装Lua for windows。如果要用在其他的版本管理工具,就修改最后几行的命令就可以了。
从这个脚本我们可以看出Lua作为utility script的特点:开发快速、使用方便、代码清晰。对于反复重复的手工操作非常适合。
—will be used as comment content——————————-
local comment_string = "increase version"
———————————————-
—–old string will be replaced by new string
———————————————-
local old_string = "1, 6, 0, 16"
local new_string = "1, 6, 0, 17"
———————————————-
———————————————-
local projfolder = [[D:\\VSS3\net_proj]]
———————————————-
local files = {
projfolder .. [[\PrjFolder1\AFXEXRES.RC]],
projfolder .. [[\PrjRES\prstrres.rc]],
projfolder .. [[\PrjSCN\enu\1747SCNenu.rc]],
projfolder .. [[\PrjCNetCnfg\enu\enu.rc]],
projfolder .. [[\PrjScanner\enu\enu.rc]],
projfolder .. [[\PrjServices\enu\enu.rc]],
}
local old_string2 = string.gsub(old_string, " ", "")
print(old_string2)
local new_string2 = string.gsub(new_string, " ", "")
print(new_string2)
for _, filename in ipairs(files) do
print(filename)
— remove read-only attribute.
os.execute("attrib -R " .. filename)
— open files
————————————————-
local f = assert(io.open(filename, "rb"))
buffer = f:read("*all")
buffer = string.gsub(buffer, old_string, new_string)
buffer = string.gsub(buffer, old_string2, new_string2)
f:close()
local outf = assert(io.open(filename, "wb"))
outf:write(buffer)
outf:close()
local cmd1 = [[cleartool checkout -reserved -usehijack -c "]] .. comment_string .. [[" ]] .. filename
print(cmd1)
os.execute(cmd1)
local cmd2 = [[cleartool checkin -nc ]] .. filename
print(cmd2)
os.execute(cmd2)
end