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

首先,依赖于提交前拿项目根的最大版本号,然后加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都是很简单,但我不怎么精通,哎

今天就到这里吧