SharpSvn.dll 是爲.Net 2.0-4.0+ 應用提供的 Subversion Client API,更多詳細介紹請見 https://sharpsvn.open.collab.net/。服務器
SharpSvn 經過 Authentication 接口提供相關的鑑權操做,例如用戶名和密碼獲取、證書確認等。Authentication 接口分別爲這些操做定義了相關的事件句柄(Handlers)。當須要某些鑑權操做時,SharpSvn 就會去調用相對應的句柄。咱們只須要將咱們須要執行的鑑權操做掛載到相對應的句柄上便可。下面各提供用戶名和密碼獲取、證書確認的例子。svn
當執行某個 svn 操做須要用戶權限認證時,會調用 UserNamePasswordHandlers 中的句柄來獲取用戶名和密碼。例如,ui
using (SvnClient client = new SvnClient()) { client.Authentication.UserNamePasswordHandlers += new EventHandlers<SvnUserNamePasswordEventArgs>( delegate (object s, SvnUserNamePasswordEventArgs e) { e.UserName = "test"; e.Password = "password"; }); }
當咱們訪問的 Svn 服務器使用的協議不是咱們默認執行標準,svn 客戶會讓用戶確認這個服務器是否值得信任並繼續訪問。此時,SharpSvn 會執行 Authentication 接口中的 SslServerTrustHandlers 中掛載的事件句柄。例如,spa
using (SvnClient client = new SvnClient()) { client.Authentication.SslServerTrustHandlers += delegate (object s, SvnSslServerTrustEventHandlerArgs> e) { e.Save = true; //e.Cancel = true; //表示不信任該服務器,放棄訪問。 }; }
SharpSvn.UI.dll 提供了一個默認的操做界面。例如上面的用戶名和密碼獲取界面、證書確認界面。咱們只須要將下面這兩行代碼寫入咱們程序中,SharpSvn 會自動掛載相對應的事件句柄。當須要用戶名和密碼獲取或者證書確認時就會彈出相對應的界面。.net
using (SvnClient client = new SvnClient()) { SharpSvn.UI.SvnUIBindArgs uiBindArgs = new SharpSvn.UI.SvnUIBindArgs(); SharpSvn.UI.SvnUI.Bind(client, uiBindArgs); }
using (SvnClient client = new SvnClient()) { string path = @」d:\\svn\temp"; SvnUpdateArgs updateArgs = new SvnUpdateArgs(); updateArgs.Depth = SvnDepth.Empty; client.Update(path, updateArgs); }
using (SvnClient client = new SvnClient()) { string path = @"d:\\svn\temp\new.txt"; SvnAddArgs args = new SvnAddArgs(); args.Depth = SvnDepth.Empty; client.Add(path, args); }
using (SvnClient client = new SvnClient()) { SvnCommitArgs commitArgs = new SvnCommitArgs(); commitArgs.Depth = SvnDepth.Empty; commitArgs.LogMessage = "My Test Commit"; SvnCommitResult commitResult = null; client.Commit(@"d:\\svn\temp\test.txt", commitArgs, out commitResult); }
其餘操做,例如 Delete、Lock、Unlock 等,這些基本操做的代碼結構跟上面這幾個操做相似,這裏就不贅述了。線程
using (SvnClient client = new SvnClient()) { SvnStatusArgs args = new SvnStatusArgs(); args.Depth = SvnDepth.Empty; args.RetriveRemoteStatus = false; Collection<SvnStatusEventArgs> list = new Collection<SvnStatusEventArgs>(); client.GetStatus(@"d:\\svn\temp", args, out list); foreach (SvnStatusEventArgs eventArgs in list) { //從eventArgs中獲取每一個變動文件的相關信息 } }
經過 SvnClientReporter 能夠將 SharpSvn 的操做日誌信息進行重定向,能夠重定向到一個 StringBuilder 或者某個文件中,下面的這兩行代碼SharpSvn 重定向到某個 StringBuilder 中,版本控制
using (SvnClient client = new SvnClient()) { StringBuilder strBuilder = new StringBuilder(); SvnClientReporter reporter = new SvnClientReporter(client, strBuilder); }
注:SharpSvn 可重定向到多個目標,可一個屢次重定向到同一個目標。例如,若是對於同一個 StringBuilder,定義了多個 SvnClientReporter 對象,則該 StringBuilder 中的 SharpSvn 操做日誌會記錄多份。能夠手工調用SvnClientReporter 對象的 Dispose()釋放某個日誌重定向。日誌
SharpSvn 的取消機制相似與線程的取消機制。SharpSvn 的操做過程當中會有一些取消檢測點。當操做執行到某個檢測點時會判斷一下用戶是否設置了取消標誌,若是沒有,則繼續操做;若是設置了取消標誌,則終止當前操做。code
在 SharpSvn 的操做過程當中,當到達一個取消檢測點時會處罰一個Cancel 事件,經過 Cancel 事件來獲取用戶是否設置了取消標誌。當咱們要取消 svn 操做時,註冊一下 Cancel 事件處理方法,則改方法中設置SvnCancelEventArgs 對象的 Cancel 屬性爲 true 便可。例如,對象
using (SvnClient client = new SvnClient()) { //do something client.Cancel += delegate (object s, SvnCancelEventArgs e) { e.Cancel = true; }; //do svn operations }
經過提供的一個 Svn 控制元素路徑能夠便可創建一個 Svn 遠程會話SvnRemoteSession,
string elementPath = @"https://10.23.34.45:6801/svn/temp/test.txt"; SvnRemoteSession remoteSession = new SvnRemoteSession(new Uri(elementPath));
調用 SvnRemoteSession 對象的 GetRepositoryRoot() 方法能夠獲取當前svn 配置庫服務器的根目錄,
Uri repoRootUri = null; remoteSession.GetRepositoryRoot(out repoRootUri);
獲取到 svn 配置庫的根目錄以後,咱們就能夠調用 Reparent() 方法將SvnRemoteSession 會話對象設置到 svn 配置庫的根,
remoteSession.Reparent(repoRootUri);
將遠程會話設置到 svn 配置庫根目錄以後,咱們就能夠各個配置庫元素執行相關的遠程操做,例如列出某個配置庫目錄下的全部元素、獲取當前配置庫的最新版本號、獲取某個元素的提交記錄等。下面分別給出這三個操做的例子,
string dirPath = @"https://10.23.34.45:6801/svn/temp"; string dirRelPath = remoteSession.MakeRepositoryRootRelativePath(new Uri(dirPath)); //獲取相對目錄相對配置庫根目錄的相對路徑 remoteSession.List(dirRelPath, new EventHandler<SvnRemoteListEventArgs>( delegate (object s, SvnRemoteListEventArgs e) { //e.Name: 元素名 //e.Path: 元素路徑 //e.RetrievedRevistion: 元素的版本號 }));
long latestRevision = 0; remoetSession.GetLatestRevision(out latestRevision);
Uri fileUri = new Uri(@"https://10.23.34.45:6801/svn/temp/test.txt"); string fileRelPath = remoteSession.MakeRepositoryRootRelativePath(fileUri); delegate (object s, SvnRemoteLogEventArgs e) { //e.Author: 提交人 //e.Revision: 版本號 //e.LogMessage: 提交備註信息 }));
SharpSvn 項目自身提供的 Demo 樣例幾乎沒有,提供的文檔對各個 API 介紹的少得可憐。以前因工做須要,在網上搜索也沒有發現多少關於 SharpSvn 的樣例介紹。上面這些只是自身因須要用到而進行驗證得來的一些 demo 樣例,後面就沒有再更多得使用 SharpSvn,因此關於SharpSvn 的探索就這麼淺薄了,也懶得再繼續深刻了。