以前写的一个小程序,用于自动更新SVN和自动编辑swf文件,以代替繁琐的手动操作,需要先安装flash sdk和csvn。
最近发现对.o文件不起作用了,更新操作还好,如果是新添加的文件就无法识别,先看下以前的程序:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 工具类
*
* @author monitor
* Created on ***********************
*/
public class Tools {
private static final Pattern p=Pattern.compile("([M|?|A])\\s+(.*)");
private static String userpass=" --username yourname --password yourpass";
/**
* 调用SDK工具编辑swf文件
*
* @param update 是否自动更新SVN
* @param fileName 要编译的文件名
* @param sourPath 源路径
* @param destPath 目标路径
*/
public static void compileSwf(boolean update,String fileName,String sourPath,String destPath){
String line=null;
Process process;
BufferedReader br;
Runtime runTime=Runtime.getRuntime();
String cmd="mxmlc "+sourPath+fileName+".as -output "+destPath+fileName+".data";
OutputMsg.append(new OutputMsg(MsgType.INFO,"Client","【终端】:准备运行命令 "+cmd));
try{
process=runTime.exec(cmd);
br = new BufferedReader(new InputStreamReader(process.getInputStream(),"GB2312"));
while ( (line=br.readLine()) != null){
OutputMsg.append(new OutputMsg(MsgType.INFO,"Client","【终端】:"+line));
}
br.close();
process.destroy();
if(update) updateDataToSvn(destPath,"更新"+fileName+".swf");
}catch(IOException e){
OutputMsg.append(new OutputMsg(MsgType.ERROR,"Client","执行 "+cmd+" 出错:"+e.getMessage()));
}
}
/**
* 调用cvsn的命令自动更新SVN
*
* @param dir 要更新的文件(夹)
* @param commitMsg LOG日志
*/
public static void updateDataToSvn(String dir,String commitMsg){
Matcher matcher;
List<String> msgList=null;
Map<String,List<String>> map=new HashMap<String,List<String>>();
OutputMsg.append(new OutputMsg(OutputMsg.MsgType.INFO,"Client","检测可更新文件:"));
msgList=runCmd("svn status "+dir+" "+userpass);
if(msgList!=null){
map.put("M", new LinkedList<String>());
map.put("?", new LinkedList<String>());
map.put("A", new LinkedList<String>());
for(String msg:msgList){
matcher=p.matcher(msg);
if(matcher.matches()){
if(matcher.group(1).equals("M")){
map.get("M").add(matcher.group(2));
}else if(matcher.group(1).equals("A")){
map.get("A").add(matcher.group(2));
runCmd("svn add "+matcher.group(2)+userpass);
map.get("M").add(matcher.group(2));
}else if(matcher.group(1).equals("?")){
map.get("?").add(matcher.group(2));
runCmd("svn add "+matcher.group(2)+userpass);
map.get("M").add(matcher.group(2));
}
}
}
}
if(!map.get("M").isEmpty()){
StringBuilder cmd=new StringBuilder("svn commit -m \"【程序自动更新】"+commitMsg+"\" ");
for(String str:map.get("M")){
cmd.append(str).append(" ");
}
cmd.append(userpass);
runCmd(cmd.toString());
OutputMsg.append(new OutputMsg(OutputMsg.MsgType.INFO,"Client","SVN更新成功!!"));
}else{
OutputMsg.append(new OutputMsg(OutputMsg.MsgType.INFO,"Client","无可更新文件!!"));
}
}
/**
* 运行CMD命令
* @param cmd 要运行的命令
* @return 输出的消息列表
*/
public static List<String> runCmd(String cmd){
String line=null;
Process process;
BufferedReader br;
List<String> msgList=new LinkedList<String>();
Runtime runTime=Runtime.getRuntime();
try{
process=runTime.exec(cmd);
br = new BufferedReader(new InputStreamReader(process.getInputStream(),"GB2312"));
while ( (line=br.readLine()) != null){
msgList.add(line);
OutputMsg.append(new OutputMsg(MsgType.INFO,"Client","【终端】:"+line));
}
br.close();
process.destroy();
}catch(IOException e){
e.printStackTrace();
OutputMsg.append(new OutputMsg(MsgType.ERROR,"Client","执行 "+cmd+" 出错:"+e.getMessage()));
}
return msgList;
}
}
原理其实很简单,就是调用csvn的svn命令,主要是status 和 commit,通过status命令获得文件状态,以判断是否要更新,常见的状态有:
-
Item is scheduled for addition.
-
Item is scheduled for deletion.
-
项目已经修改了。
-
项目在工作拷贝中已经被替换了。这意味着文件预定要删除,然后有一个同样名称的文件要在同一个位置替换它。
-
项目的内容(相对于属性)与更新得到的数据冲突了。
-
项目与外部定义相关。
-
Item is being ignored (e.g., with the
svn:ignore
property). -
项目不在版本控制之下。
-
项目已经丢失(例如,你使用svn移动或者删除了它)。这也说明了一个目录不是完整的(一个检出或更新中断)。
'A'
'D'
'M'
'R'
'C'
'X'
'I'
'?'
'!'
这个小程序以前是能正常工作了,不过最近要提交的文件后缀名采用了.o的后缀,一直没法提交。连文件的状态也没有输出;网上查了下资料,
原来是SVN会默认的忽略一些文件,如.o文件等。
忽略了就没法提交了,那就把忽略去掉,先是在status后加 --no-ignore 参数,这样文件状态是出来了,不过是‘I’,也没法提交。
只能改config文件了,进入C:\Users\monitor\AppData\Roaming\Subversion下,打开config,找到:
# global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo
改为:
global-ignores = *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo
OK。