Java自動更新SVN程序,注意系統默認的忽略文件

以前寫的一個小程序,用於自動更新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命令獲得文件狀態,以判斷是否要更新,常見的狀態有:

'A'

Item is scheduled for addition.

'D'

Item is scheduled for deletion.

'M'

項目已經修改了。

'R'

項目在工作拷貝中已經被替換了。這意味着文件預定要刪除,然後有一個同樣名稱的文件要在同一個位置替換它。

'C'

項目的內容(相對於屬性)與更新得到的數據衝突了。

'X'

項目與外部定義相關。

'I'

Item is being ignored (e.g., with the svn:ignore property).

'?'

項目不在版本控制之下。

'!'

項目已經丟失(例如,你使用svn移動或者刪除了它)。這也說明了一個目錄不是完整的(一個檢出或更新中斷)。


這個小程序以前是能正常工作了,不過最近要提交的文件後綴名採用了.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。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章