使用 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 就会去调用相对应的句柄。我们只需要将我们需要执行的鉴权操作挂载到相对应的句柄上即可。下面各提供用户名和密码获取、证书确认的例子。
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 = ;
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 的探索就这么浅薄了,也懒得再继续深入了。
使用 SharpSvn 执行 svn 操作的Demo的更多相关文章
- 获取 SharpSvn 执行 svn 操作的实时日志
1 获取 SharpSvn 操作日志的方式 之前一篇随笔(使用 SharpSvn 执行 svn 操作)讲到可以通过声称一个绑定到一个 SvnClient 对象的 SvnClientReport 对象. ...
- svn执行update操作后出现:Error : Previous operation has not finished; run 'cleanup' if it was interrupted.
svn执行update操作后出现: Error : Previous operation has not finished; run 'cleanup' if it was interrup ...
- mybatis(二)执行CRUD操作的两种方式配置和注解
一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...
- kaldi使用thchs30数据进行训练并执行识别操作
操作系统 : Ubutu18.04_x64 gcc版本 :7.4.0 数据准备及训练 数据地址: http://www.openslr.org/18/ 在 egs/thchs30/s5 建立 thch ...
- spring boot, 容器启动后执行某操作
常有在spring容器启动后执行某些操作的需求,现做了一个demo的实现,做一下记录,也希望可以给需要的同学提供参考. 1.spring启动后,以新线程执行后续需要的操作,所以执行类实现Runnabl ...
- SVN操作出现locked错误解决办法
SVN操作出现locked错误解决办法:在SVN中执行 commit 操作时,在更新过程中,中断过,或者因为其他原因导致SVN 出现 locked 异常. 解决办法:1. 选中出现异常的文件,右键 - ...
- 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9 关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...
- SQL Server 存储过程遇到“表 '#TT' 没有标识属性。无法执行 SET 操作”错误
创建临时表,往临时表插入数据的时候报的错误. 一开始提示没有打开主键,后来打开主键就提示上述错误异常. 从网上查找资料没有找到,然后又到群里问各位大牛,一位大牛告诉我是没有设置主键. 我又仔细看看提示 ...
- ThinkPHP 表单提交操作成功后执行JS操作如何刷新父页面或关闭当前页等操作
ThinkPHP 表单提交操作成功后执行JS操作如何刷新父页面或关闭当前页等操作 .操作成功后刷新父页面 $this->assign('jumpUrl', "javascript:wi ...
随机推荐
- JAVA-JSP内置对象之out对象求得缓冲区使用大小
相关资料:<21天学通Java Web开发> out对象 out对象求得缓冲区使用大小1.通过out对象的getBufferSize()方法可以获得缓冲区的大小.2.通过getRemain ...
- android 阿里云oss上传
购买了阿里云的oss空间,于是用它来存储图片,不过中间的使用算是出了些问题,导致很长的才成功. 不得不说,阿里云文档真的是无力吐槽...乱七八糟的.我完全是东拼西凑,才完成的图片上传功能. 走了很多的 ...
- Swift is Now Open Source
https://developer.apple.com/news/?id=12032015a Swift is Now Open Source December 3, 2015 Join the op ...
- Html模板渲染引擎Hogan
Github:https://github.com/twitter/hogan.js 最简单的使用教程:http://www.imooc.com/article/18493
- <黑天鹅>读书笔记
书在这里 不要关注可能性,而要关注结果 不要迷信那些估值和行业发展研究文字,因为所有大家看得到的模型和研究报告都是有关白天鹅的,而你的命运或许实际掌握在黑天鹅那里 你不知道的事比你知道的事有意义 你可 ...
- 【异常】IOException parsing XML document from class path resource [xxx.xml]
1.IDEA导入项目运行出现异常 org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing ...
- 三篇文章了解 TiDB 技术内幕——说计算
在这我们将关系模型简单理解为 Table 和 SQL 语句,那么问题变为如何在 KV 结构上保存 Table 以及如何在 KV 结构上运行 SQL 语句. 假设我们有这样一个表的定义: CREATE ...
- headfirst 07
WEB 不论你在web上做什么, 都离不开请求和响应. web请求作为某个用户交互的结果由web浏览器发送到web服务器. 在web服务器上会生成web响应并发回到web浏览器.整个过程可以总结为5步 ...
- 引入css少引入了rel="stylesheet" 这行代码。导致整个页面空白、
忘记引入rel="stylesheet" 如下: <link href="css/swiper-3.3.1.min.css" /> 这样使得整个页 ...
- 关于Unity中的光照(三)
法线贴图 次时代游戏用的比较多 1:法线贴图是凹凸贴图技术上 的一种应用,有时也称为Dot3(仿立体)凹凸纹理贴图;2: 法线贴图是不增加多边形的情况下,增强模型的细节;3: 法线贴图是高精度模型导出 ...