多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > java操作svn【svnkit】實操

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中,所有的倉庫urlSVNURL類來表示,如果1個路徑字符串不是UTF⑻編碼的,可使用SVNURLparseURIDecoded()方法來創建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些成型的產品,包括fisheyeJenkins他們的底層與svn的繼承也許就是通過SVNKit來實現的。或是類似的產品實現的。對我們更好的理解這些工具的使用提供了很大的幫助。



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 成人在线一区二区三区 | 高清完整视频在线播放 | 宅男午夜大片啪啪软件 | 日本人69式视频最长 | 欧美xxxxxxxxxxxxx| 国产一区精品 | 久久999精品 | 国内精品伊人久久久久 | 亚洲在线h | 伊人久久久综在合线久久在播 | 精品一区国产 | 欧美日韩亚洲国产一区二区三区 | 欧美日韩午夜 | 亚洲精品日韩一区二区 | 青青青青手机在线视频观看国产 | 美毛片 | 日韩欧美精品综合一区二区三区 | 亚洲一区二区三区四区五区六区 | 手机看片日韩国产一区二区 | 成人性生活免费视频 | 欧美性猛交xxxx免费 | 成人精品第一区二区三区 | 亚洲国产成人精品不卡青青草原 | 2018一级毛片免费观看 | 亚洲精品高清久久 | 精品日韩| 日本乱人伦片中文三区 | 亚洲黄网站wwwwww | 国产成人毛片 | 免费羞羞视频 | 亚洲欧美日韩综合在线一区二区三区 | 国产女主播一区二区在线观看 | 亚洲永久| 日本成本人在线观看免费视频 | 亚洲天堂免费视频 | 一级做a爰片久久毛片欧美 一级做a爰片久久毛片人呢 | 性欧美videos另类hd高清 | 午夜dj免费视频观看社区 | 亚洲色图第1页 | 中文字幕日本一本二本三区 | www亚洲一区 |