• 获取 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)

  • 相关阅读:
    Lesson 2 :
    Session 1 : 笔记
    SpringBoot 3 : 单元测试和开发环境调试
    SpringBoot 2 : 网络配置
    MS leetcode 题目
    研二上末
    时不我待
    Do, I do!
    LeetCode 精选 TOP 面试题
    基于attractor landscape研究疾病发展及药物研发
  • 原文地址:https://www.cnblogs.com/lienhua34/p/3943892.html
Copyright © 2020-2023  润新知