java操作svn【svnkit】實操
來源:程序員人生 發布時間:2015-06-05 09:25:04 閱讀次數:3231次
SVNKit中怎樣使用不同的倉庫訪問協議?
當你下載了最新版的SVNKit2進制文件并且準備使用它時,1個問題出現了,要創建1個庫需要做哪些初始化的步驟?直接與Subversion倉庫交互已在低級層API中實現,主要的倉庫訪問驅動的接口就是SVNRepository抽象類。這個驅動實現了1些協議,1個協議1個實現。每一個驅動由1個抽象工廠類-SVNRepositoryFactory 創建,抽象工廠類也有每種協議的實現。下面的表格將1種協議和工廠類的實現類逐一對應:
svn://(svns://)
|
SVNRepositoryFactoryImpl
|
http://(https://)
|
DAVRepositoryFactory
|
file:///
|
FSRepositoryFactory
|
SVNKit初始化的操作
在使用SVNKit庫前,你必須為某1特定的協議創建1個適合的SVNRepositryFactory對象。例如,如果你想使用 svn:// 協議來和倉庫交互,你必須注冊1下SVNRepositoryFactoryImpl工廠:
try {
SVNRepositoryFactoryImpl.setup();
...
} catch (SVNException e) {
//handle exception
}
這1步以后,由于SVNKit包括了注冊的工廠對象,SVNRepositoryFactory知道了怎樣給svn:// 協議創建SVNRepository驅動。接下來你就能夠為它創建1個驅動了:
try {
...
SVNURL url = SVNURL.parseURIDecoded( "svn://host/path_to_repository_root/inner_path" );
SVNRepository repository = SVNRepositoryFactory.create( url, null );
...
} catch ( SVNException e ) {
//handle exception
}
在SVNKit中,所有的倉庫url由SVNURL類來表示,如果1個路徑字符串不是UTF⑻編碼的,可使用SVNURL的parseURIDecoded()方法來創建1個新的url(如果需要編碼,它會重新編碼)。然后你可以通過這個url來在SVNRepositoryFactory中創建1個新的SVNRepository驅動。這樣,你可以綁定驅動到任何1個你想訪問的倉庫地址。
使用高級層API
當你使用SVNKit管理工作拷貝時,由于高級層API使用低級層API來與倉庫交互,你也需要創建適合的工廠類,如果你遺漏了這1初始化步驟,可能會拋出1個SVNKit不能給提供的url創建SVNRepository對象的異常。
固然就想我們使用其他svn客戶端或是svn插件1樣。我們對
Repository進行操作的時候是需要身份驗證的,使用SVNKit也是1樣。我們需要提供身份信息:
<span style="white-space:pre"> </span>/*
* 對版本庫設置認證信息。
*/
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);
repository.setAuthenticationManager(authManager);
實現DisplayFile:
<span style="font-size:18px;">import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.SVNProperty;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
public class DisplayFile {
/**
* @param args
*/
public static void main(String[] args) {
//初始化庫。 必須先履行此操作。具體操作封裝在setupLibrary方法中。
setupLibrary();
/*
* 相干變量賦值
*/
String url = "https://hy/svn/svnkittest/branches";
String name = "hanyi";
String password = "hanyi";
String filePath = "doImport.txt";
//定義svn版本庫的URL。
SVNURL repositoryURL = null;
//定義版本庫。
SVNRepository repository = null;
try {
//獲得SVN的URL。
repositoryURL=SVNURL.parseURIEncoded(url);
//根據URL實例化SVN版本庫。
repository = SVNRepositoryFactory.create(repositoryURL);
} catch (SVNException svne) {
/*
* 打印版本庫實例創建失敗的異常。
*/
System.err
.println("創建版本庫實例時失敗,版本庫的URL是 '"
+ url + "': " + svne.getMessage());
System.exit(1);
}
/*
* 對版本庫設置認證信息。
*/
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);
repository.setAuthenticationManager(authManager);
//此變量用來寄存要查看的文件的屬性名/屬性值列表。
SVNProperties fileProperties = new SVNProperties();
//此輸出流用來寄存要查看的文件的內容。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
//取得版本庫中文件的類型狀態(是不是存在、是目錄還是文件),參數⑴表示是版本庫中的最新版本。
SVNNodeKind nodeKind = repository.checkPath(filePath, ⑴);
if (nodeKind == SVNNodeKind.NONE) {
System.err.println("要查看的文件在 '" + url + "'中不存在.");
System.exit(1);
} else if (nodeKind == SVNNodeKind.DIR) {
System.err.println("要查看對應版本的條目在 '" + url
+ "'中是1個目錄.");
System.exit(1);
}
//獲得要查看文件的內容和屬性,結果保存在baos和fileProperties變量中。
repository.getFile(filePath, ⑴, fileProperties, baos);
} catch (SVNException svne) {
System.err.println("在獲得文件內容和屬性時產生毛病: " + svne.getMessage());
System.exit(1);
}
//獲得文件的mime-type
String mimeType = fileProperties.getStringValue(SVNProperty.MIME_TYPE);
//判斷此文件是不是是文本文件
boolean isTextType = SVNProperty.isTextMimeType(mimeType);
/*
* 顯示文件的所有屬性
*/
Iterator iterator = fileProperties.nameSet().iterator();
while (iterator.hasNext()) {
String propertyName = (String) iterator.next();
String propertyValue = fileProperties.getStringValue(propertyName);
System.out.println("文件的屬性: " + propertyName + "="
+ propertyValue);
}
/*
* 如果文件是文本類型,則把文件的內容顯示到控制臺。
*/
if (isTextType) {
System.out.println("File contents:");
System.out.println();
try {
baos.writeTo(System.out);
} catch (IOException ioe) {
ioe.printStackTrace();
}
} else {
System.out
.println("由于文件不是文本文件,沒法顯示!");
}
System.out.println("");
/*
* 取得版本庫的最新版本號。
*/
long latestRevision = ⑴;
try {
latestRevision = repository.getLatestRevision();
List<SVNLogEntry> entries = new ArrayList<SVNLogEntry>();
try
{
repository.log(new String[]{""},//為過濾的文件路徑前綴,為空表示不進行過濾
entries,
⑴,//⑴代表最新的版本號,初始版本號為0
⑴,
true,
true);
}
catch (SVNException e)
{
e.printStackTrace();
}
System.out.println("當前log信息數量:"+entries.size());
String message=entries.get(0).getMessage().toString();
System.out.println("提交的message信息:"+message);
} catch (SVNException svne) {
System.err.println("獲得最新版本號時出錯: " + svne.getMessage());
System.exit(1);
}
System.out.println("");
System.out.println("---------------------------------------------");
System.out.println("版本庫的最新版本號: " + latestRevision);
System.exit(0);
}
/*
* 初始化庫
*/
private static void setupLibrary() {
/*
* For using over http:// and https://
*/
DAVRepositoryFactory.setup();
/*
* For using over svn:// and svn+xxx://
*/
SVNRepositoryFactoryImpl.setup();
/*
* For using over file:///
*/
FSRepositoryFactory.setup();
}
}</span><span style="font-weight: bold; font-size: 16pt;">
</span>
打印的結果:
文件的屬性: svn:entry:uuid=bf3500c6-b8a2-f84e⑻6b3⑻6d6154c1411
文件的屬性: svn:entry:revision=2
文件的屬性: svn:entry:committed-date=2015-04⑵9T15:53:24.910060Z
文件的屬性: svn:wc:ra_dav:version-url=/svn/svnkittest/!svn/ver/2/branches/doImport.txt
文件的屬性: svn:entry:checksum=1a3f6dc35be7edaba541a5a5053a2e03
文件的屬性: svn:entry:committed-rev=2
文件的屬性: svn:entry:last-author=hanyi
File contents:
hello the first svnkit demo
當前log信息數量:1
提交的message信息:韓義:svnkit demo test
---------------------------------------------
版本庫的最新版本號: 2
實現DisplayRepositoryTree:
import java.util.Collection;
import java.util.Iterator;
import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
public class DisplayRepositoryTree {
/**
* @param args
*/
public static void main(String[] args) {
/*
* For using over http:// and https://
*/
DAVRepositoryFactory.setup();
/*
* 相干變量賦值
*/
String url = "https://hy/svn/svnkittest";
String name = "hanyi";
String password = "hanyi";
//定義svn版本庫的URL。
SVNURL repositoryURL = null;
//定義版本庫。
SVNRepository repository = null;
/*
* 實例化版本庫類
* */
try {
//獲得SVN的URL。
repositoryURL=SVNURL.parseURIEncoded(url);
//根據URL實例化SVN版本庫。
repository = SVNRepositoryFactory.create(repositoryURL);
} catch (SVNException svne) {
/*
* 打印版本庫實例創建失敗的異常。
*/
System.err
.println("創建版本庫實例時失敗,版本庫的URL是 '"
+ url + "': " + svne.getMessage());
System.exit(1);
}
/*
* 對版本庫設置認證信息。
*/
ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager(name, password);
repository.setAuthenticationManager(authManager);
/*
* 上面的代碼基本上是固定的操作。
* 下面的部份根據任務不同,履行不同的操作。
* */
try {
//打印版本庫的根
System.out.println("Repository Root: " + repository.getRepositoryRoot(true));
//打印出版本庫的UUID
System.out.println("Repository UUID: " + repository.getRepositoryUUID(true));
System.out.println("");
//打印版本庫的目錄樹結構
listEntries(repository, "");
} catch (SVNException svne) {
System.err.println("打印版本樹時產生毛病: "
+ svne.getMessage());
System.exit(1);
}
/*
* 取得版本庫的最新版本樹
*/
long latestRevision = ⑴;
try {
latestRevision = repository.getLatestRevision();
} catch (SVNException svne) {
System.err
.println("獲得最新版本號時出錯: "
+ svne.getMessage());
System.exit(1);
}
System.out.println("");
System.out.println("---------------------------------------------");
System.out.println("版本庫的最新版本是: " + latestRevision);
System.exit(0);
}
/*
* 此函數遞歸的獲得版本庫中某1目錄下的所有條目。
*/
public static void listEntries(SVNRepository repository, String path)
throws SVNException {
//獲得版本庫的path目錄下的所有條目。參數-1表示是最新版本。
Collection entries = repository.getDir(path, ⑴, null,
(Collection) null);
Iterator iterator = entries.iterator();
while (iterator.hasNext()) {
SVNDirEntry entry = (SVNDirEntry) iterator.next();
System.out.println("/" + (path.equals("") ? "" : path + "/")
+ entry.getName() + " (author: '" + entry.getAuthor()
+ "'; revision: " + entry.getRevision() + "; date: " + entry.getDate() + ")");
/*
* 檢查此條目是不是為目錄,如果為目錄遞歸履行
*/
if (entry.getKind() == SVNNodeKind.DIR) {
listEntries(repository, (path.equals("")) ? entry.getName()
: path + "/" + entry.getName());
}
}
}
}
打印的結果:
Repository Root: https://hy/svn/svnkittest
Repository UUID: bf3500c6-b8a2-f84e⑻6b3⑻6d6154c1411
/branches (author: 'hanyi'; revision: 2; date: Wed Apr 29 23:53:24 CST 2015)
/branches/doImport.txt (author: 'hanyi'; revision: 2; date: Wed Apr 29 23:53:24 CST 2015)
/tags (author: 'VisualSVN Server'; revision: 1; date: Wed Apr 29 14:14:01 CST 2015)
/trunk (author: 'VisualSVN Server'; revision: 1; date: Wed Apr 29 14:14:01 CST 2015)
---------------------------------------------
版本庫的最新版本是: 2
其他的操作包括CheckOut,DoCommit,DoDiff,DoImport,DoUpdate我就不逐一的寫出了。上傳1個包括所有操作的小例子,方便大家在以后的工作中學習使用:SVNKitTest(猛戳這里)
總結:
在學習SVNKit的進程中讓我想起了我使用過的1些成型的產品,包括fisheye,Jenkins他們的底層與svn的繼承也許就是通過SVNKit來實現的。或是類似的產品實現的。對我們更好的理解這些工具的使用提供了很大的幫助。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈