你的位置:首页 > ASP.net教程

[ASP.net教程]获取 SharpSvn 执行 svn 操作的实时日志


1 获取 SharpSvn 操作日志的方式

之前一篇随笔(使用 SharpSvn 执行 svn 操作)讲到可以通过声称一个绑定到一个 SvnClient 对象的 SvnClientReport 对象。为了说明方便,将对应的程序片段再次写在下面,

using (SvnClient client = new SvnClient()){  StringBuilder strBuilder = new StringBuilder();  SvnClientReporter reporter = new SvnClientReporter(client, strBuilder);}

该程序片段使用一个 StringBuilder 对象来声称 SvnClientReport 对象。这样子,我们只能等到执行 svn 操作之后才能从 StringBuilder 对象中获取所有操作日志。如果执行的 svn 操作比较耗时(例如 commit 上千个文件),我们不能够实时地获取 SharpSvn 执行 svn 操作的日志,我们会以为程序卡住了。那么,如何实时获取 SharpSvn 操作的日志?

2 实时获取 SharpSvn 操作日志

首先, 获取 SharpSvn 执行 svn 操作日志只能通过声明 SvnClientReport 对象。这是我们的出现点,那么怎样声明一个实时获取操作日志的 SvnClientReport 对象?先看一下 SvnClientReport 类的构造函数(参考http://docs.sharpsvn.net/current/),

SvnClientReporter(SvnClient, TextWriter);

SvnClientReporter(SvnClient, StringBuilder);

SvnClientReporter(SvnClientArgs, TextWriter);

SvnClientReporter(SvnClientArgs, StringBuilder);

SvnClientReporter(SvnClient, StringBuilder, IFormatProvider);

SvnClientReporter(SvnClientArgs, StringBuilder, IFormatProvider);

通过 SvnClientReport 类的构造函数,我们可以看出我们只能使用一个 StringBuilder 或者 TextWriter 对象来声明一个 SvnClientReport 对象。上一节我们已经看到通过 StringBuilder 对象是无法实时获取 SharpSvn 操作日志的了,那我们只能从 TextWriter 下手了。

通过http://msdn.microsoft.com/zh-cn/library/ywxh2328%28VS.80%29.aspx,我们看到 TextWriter 是一个抽象类,那么我们是不是就可以通过定义一个TextWriter 派生类来实现我们实时获取 SharpSvn 操作日志呢?!

下面实现的 MyRealTimeTextWriter 类继承了抽象类 TextWriter,实现了属性 Encoding(必须实现),并且覆盖实现了 void Write(string) 和void WriteLine(string value) 两个方法,这两个方法通过触发 DataReceived事件告知外界其接收到的数据。

class MyRealTimeTextWriter : TextWriter{  //TextWriter派生类必须实现  public Encoding Encoding  {    get { return Encoding.UTF8; }  }    //接收到数据,就触发该事件  public event Action<string> DataReceived;  private void OnDataReceived(string value)  {    if (DataReceived != null)    {      DataReceived(value);    }  }   public override void Write(string value)  {    OnDataReceived(value);  }  public override void WriteLine(string value)  {    OnDataReceived(value);  }}

有了 MyRealTimeTextWriter 类之后,我们就可实现下面的程序来实时获取 SharpSvn 操作的日志。

using (SvnClient client = new SvnClient()){  MyRealTimeTextWriter realtimeTextWriter = new MyRealTimeTextWriter();  realtimeTextWriter.DataReceived += new Action<string>(    delegate (string value)    {      /* do on the sharpsvn operation logs */    });  SvnClientReporter reporter = new SvnClientReporter(client, realtimeTextWriter);  /* do svn operations */}

上面程序通过一个 MyRealTimeTextWriter 对象来生成 SvnClientReport 对象。每当 SharpSvn 操作产生一条日志信息时就会调用 MyRealTimeTextWriter 对象的 Write(string) 或 WriteLine(string) 方法,而这两个方法立即触发 DataReceived 事件告知外面有日志生成了,于是便达到了实时获取 SharpSvn 操作日志的目的。

(done)