使用 SharpSvn 执行 svn 操做的Demo

1. SharpSvn简介

SharpSvn.dll 是为.Net 2.0-4.0+ 应用提供的 Subversion Client API,更多详细介绍请见 https://sharpsvn.open.collab.net/。服务器

2. 鉴权操做

SharpSvn 经过 Authentication 接口提供相关的鉴权操做,例如用户名和密码获取、证书确认等。Authentication 接口分别为这些操做定义了相关的事件句柄(Handlers)。当须要某些鉴权操做时,SharpSvn 就会去调用相对应的句柄。咱们只须要将咱们须要执行的鉴权操做挂载到相对应的句柄上便可。下面各提供用户名和密码获取、证书确认的例子。svn

2.1 用户名和密码获取

当执行某个 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";
            });
} 

2.2 证书确认

当咱们访问的 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; //表示不信任该服务器,放弃访问。
        };
}

2.3 SharpSvnUI绑定

SharpSvn.UI.dll 提供了一个默认的操做界面。例如上面的用户名和密码获取界面、证书确认界面。咱们只须要将下面这两行代码写入咱们程序中,SharpSvn 会自动挂载相对应的事件句柄。当须要用户名和密码获取或者证书确认时就会弹出相对应的界面。.net

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 的操做过程当中会有一些取消检测点。当操做执行到某个检测点时会判断一下用户是否设置了取消标志,若是没有,则继续操做;若是设置了取消标志,则终止当前操做。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
}

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 的探索就这么浅薄了,也懒得再继续深刻了。

相关文章
相关标签/搜索