SVN和CVS之間代碼同步更新
這個標題其實不是很準確, 但是是在想不出改用一個什麼樣的標題, 所以只能講究了.
最近一直在維護一個項目, 公司內部使用的源碼管理工具是cvs, 客戶那邊使用的是svn.
而且兩邊都有可能修改代碼, 這就給代碼更新帶來了麻煩. 很多時候都要手工來做.
因為Eclipse中一個項目只能使用一種Team管理的工具, 不是CVS就是SVN, 所以我建立了兩個項目, 一個是CVS(內部), 一個是SVN(外部).
Eclipse中SVN的每次update都會在console中輸出日誌, 大致就是增加/更新/刪除了什麼檔案.
我們要做的就是, 分析log中每一行log相關的檔案, 並且把它複製到CVS 工程相應的目錄中.
之前也是這用ruby寫過一個小程式, 最近想學習並使用Groovy, 於是有重寫了一下.
大致邏輯是:
1. 用Eclipse從svn更新客戶提交的修改, 然後將eclipse中svn在console中輸出的日誌/內容儲存到一個文本中
2. 通過程式逐行讀取文本中svn的log, 分析出涉及的檔案,
3. 針對檔案, 要麼copy 要麼 mkdir, 把SVN 項目中的最新檔案覆蓋CVS項目中的檔案.
- public class Svn2Cvs{
-
- public static void main(String[] args) {
- svn2cvs("adreel");
- }
- static void svn2cvs(String project) {
- File inFile = new File("svn_log.txt");
- inFile.eachLine() { String line ->
-
- line = line.substring(7) // remove indent and A / U character
- line = line.replaceAll('/', "////") // replace forwardslash with backwardslash
- String newLine = line.replaceFirst(/$project/, "${project}_cvs") // build new line
-
- if (line.indexOf('.') == -1) { // it's a dir
- println "mkdir /"$newLine/""
- }
- else {
- println "copy /Y /"$line/" /"$newLine/""
- }
- }
- }
-
- }
以下是SVN更新時log的範例:
- U E:/Workspaces/MyWorkspace/svnproject/src/a/a/a.java
- A E:/Workspaces/MyWorkspace/svnproject/src/a/b
- A E:/Workspaces/MyWorkspace/svnproject/src/a/b/b.java