程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 使用 SharpSvn 執行 svn 操作的Demo,sharpsvnsvn

使用 SharpSvn 執行 svn 操作的Demo,sharpsvnsvn

編輯:C#入門知識

使用 SharpSvn 執行 svn 操作的Demo,sharpsvnsvn


1. SharpSvn簡介

SharpSvn.dll 是為.Net 2.0-4.0+ 應用提供的 Subversion Client API,更多詳細介紹請見 https://sharpsvn.open.collab.net/。

2. 鑒權操作

SharpSvn 通過 Authentication 接口提供相關的鑒權操作,例如用戶名和密碼獲取、證書確認等。Authentication 接口分別為這些操作定義了相關的事件句柄(Handlers)。當需要某些鑒權操作時,SharpSvn 就會去調用相對應的句柄。我們只需要將我們需要執行的鑒權操作掛載到相對應的句柄上即可。下面各提供用戶名和密碼獲取、證書確認的例子。

2.1 用戶名和密碼獲取

當執行某個 svn 操作需要用戶權限認證時,會調用 UserNamePasswordHandlers 中的句柄來獲取用戶名和密碼。例如,

using (SvnClient client = new SvnClient())
{
    client.Authentication.UserNamePasswordHandlers +=
        new EventHandlers<SvnUserNamePasswordEventArgs>(
            delegate (object s, SvnUserNamePasswordEventArgs e)
            {
                e.UserName = "test";
                e.Password = "password";
            });
} 

2.2 證書確認

當我們訪問的 Svn 服務器使用的協議不是我們默認執行標准,svn 客戶會讓用戶確認這個服務器是否值得信任並繼續訪問。此時,SharpSvn 會執行 Authentication 接口中的 SslServerTrustHandlers 中掛載的事件句柄。例如,

using (SvnClient client = new SvnClient())
{
    client.Authentication.SslServerTrustHandlers +=
        delegate (object s, SvnSslServerTrustEventHandlerArgs> e)
        {
            e.Save = true;
            //e.Cancel = true; //表示不信任該服務器,放棄訪問。
        };
}

2.3 SharpSvnUI綁定

SharpSvn.UI.dll 提供了一個默認的操作界面。例如上面的用戶名和密碼獲取界面、證書確認界面。我們只需要將下面這兩行代碼寫入我們程序中,SharpSvn 會自動掛載相對應的事件句柄。當需要用戶名和密碼獲取或者證書確認時就會彈出相對應的界面。

using (SvnClient client = new SvnClient())
{
    SharpSvn.UI.SvnUIBindArgs uiBindArgs = new SharpSvn.UI.SvnUIBindArgs();
    SharpSvn.UI.SvnUI.Bind(client, uiBindArgs);
}

3 SVN基本操作

3.1 更新 Update

using (SvnClient client = new SvnClient())
{
    string path = @”d:\\svn\temp";
    SvnUpdateArgs updateArgs = new SvnUpdateArgs();
    updateArgs.Depth = SvnDepth.Empty;
    client.Update(path, updateArgs);
}

3.2加入版本控制 Add

using (SvnClient client = new SvnClient())
{
    string path = @"d:\\svn\temp\new.txt";
    SvnAddArgs args = new SvnAddArgs();
    args.Depth = SvnDepth.Empty;
    client.Add(path, args);
}

3.3 提交 Commit

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 等,這些基本操作的代碼結構跟上面這幾個操作類似,這裡就不贅述了。

3.4 獲取本更文件列

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中獲取每個變更文件的相關信息
    }
}

4 SharpSvn 操作日志獲取

通過 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()釋放某個日志重定向。

5 取消操作

SharpSvn 的取消機制類似與線程的取消機制。SharpSvn 的操作過程中會有一些取消檢測點。當操作執行到某個檢測點時會判斷一下用戶是否設置了取消標志,如果沒有,則繼續操作;如果設置了取消標志,則終止當前操作。

在 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
}

6 Svn 遠程會話 SvnRemoteSession


通過提供的一個 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 配置庫根目錄之後,我們就可以各個配置庫元素執行相關的遠程操作,例如列出某個配置庫目錄下的所有元素、獲取當前配置庫的最新版本號、獲取某個元素的提交記錄等。下面分別給出這三個操作的例子,

6.1 列出目錄下的所有元素(非遞歸)

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: 元素的版本號
        }));

6.2 獲取配置庫最新版本號

long latestRevision = 0;
remoetSession.GetLatestRevision(out latestRevision);

6.3 獲取指定文件的提交記錄

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: 提交備注信息
    }));

7 結束語

SharpSvn 項目自身提供的 Demo 樣例幾乎沒有,提供的文檔對各個 API 介紹的少得可憐。之前因工作需要,在網上搜索也沒有發現多少關於 SharpSvn 的樣例介紹。上面這些只是自身因需要用到而進行驗證得來的一些 demo 樣例,後面就沒有再更多得使用 SharpSvn,所以關於SharpSvn 的探索就這麼淺薄了,也懶得再繼續深入了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved