牧羊岛

懒是不会有好果子吃滴//

导航

svn客户端代码版本号自动更新 依赖Lua

Posted on 2011-06-07 18:27  牧羊岛  阅读(1785)  评论(0编辑  收藏  举报

首先,依赖于提交前拿项目根的最大版本号,然后加1再提交

依赖:Lua和Subversion

不清楚这个流程是否有问题,望高人指点。实现如下:

文档类有个静态变量表示svn的版本

public static const SVN_VERSION : String = "71";

然后项目根目录下有个比处理hook.bat,是入口

@echo off
setlocal enabledelayedexpansion
::Lua路径
SET LUA_PATH=D:\Lua\
SET LOCAL_PATH=%~dp0
%LUA_PATH%lua
.exe -e "local_path='%LOCAL_PATH:\=\\%';file_name='src\\LocalFile.as';dofile('%LUA_PATH%\\svn\\hook.lua');"
if %errorlevel% gtr 0 goto err
exit 0
:err
echo 错误
exit 1

file_name:表示要替换的文件在项目的相对路径,在我这里是LocalFile.as

在Lua的svn的下面有个hook.lua的文件是实际查找替换的文件,在我这里是D:\Lua\svn\hook.lua

下面是lua的代码

--初始化
svn
= {};
--设置svn的路径
svn.bin
= "C:\\Program Files\\Subversion\\bin\\";
--要替换的文件相对路径
svn.fileName
= file_name;
svn.localPath
= local_path.."";
function os.capture(cmd, raw)
local f
= assert(io.popen(cmd, 'r'))
local s
= assert(f:read('*a'))
f:close()
if raw then return s end
s
= string.gsub(s, '^%s+', '')
s
= string.gsub(s, '%s+$', '')
s
= string.gsub(s, '[\n\r]+', ' ')
return s
end
function svn.info(path)
local s
= os.capture("\"".. svn.bin .."svn.exe\" info "..path,1);
if s then
return s;
else
return nil;
end
end
function svn.getHeadVersion(path)
local s
= svn.info(path);
if s then
local info
= s;
io.write(s);
s
= info:match("最后修改的版本:(%d*)");
end
return s;
end
function svn.getInfo(path)
local info
= {};
local s
= svn.info(path);
for k,v in s:gmatch("([^:]+):%s*([^\r\n]+)[\r\n]+") do
info[k]
=v
end
return info;
end
--先拿版本库的根
local local_info
= svn.getInfo(svn.localPath);
--再拿版本库根的最新版本
local ii
= svn.getInfo(local_info["版本库根"]);
--local ss = svn.getHeadVersion("svn://192.168.1.243/Flash");
local _version
= ii["最后修改的版本"] + 1;
local _root
= ii["版本库根"];
if _version and svn.fileName and svn.localPath and svn.localPath ~= '' then
file
= io.open(svn.localPath..svn.fileName,"r");
local v
= _version;
ss
= file:read("*a");
ss
= ss:gsub("SVN_VERSION%s?:%s?String%s?=%s?\"(%d*)\"","SVN_VERSION : String = \""..v.."\"",1);
file:close();
file
= nil;
file
= io.open(svn.localPath..svn.fileName,"w");
file:write(ss);
file:close();

else
do
local message
= "";
if not _version then message = message.."_version 为空"; end
if not svn.fileName then message = message.."svn.fileName 为空"; end
if not svn.localPath then message = message.."svn.localPath 为空"; end
if svn.localPath == "" then message = message.."svn.localPath 为\"\""; end
error(
"错误 in lua"..message);
end

end

在这里要指定svn的bin目录,我的Subversion是中文版,不知道其他的情况怎么样

使用方法是在客户端挂re-commit hook就可以了,指定项目路径和执行文件的路径就好了

还有,或许这个东西用bat或者vb都是很简单,但我不怎么精通,哎

今天就到这里吧