如何新增自定义的svn比对工具

这个需求不常见,但是通常在svn管理的项目中,如果需要对比两个文件不为文本文件时,svn则无法提供比对。

这两个文件可能为二进制,可能为自定义加密的内容,也可能是unity对序列化后的.prefab或.unity二进制文件。

我们知道,可以在svn的设置里,选择第三方的比对工具来进行比较;那么如果我们可以对特定的,svn无法解析的文件进行解析,并转成文本文件后,是否就可以再使用svn比对工具进行比较了呢?

我们初学C#开发时,都使用过控制台程序,如下

static void Main(string[] args)
{
    // args是通过外部打开控制台程序时,传入的参数
    if (args.Length > 0)
    {
        Console.WriteLine(args[0]);
    }

}

如果是通过拖拽某个文件到控制台.exe上时,args则是长度为1的数组,args[0]为文件路径。

通常比较工具,都是可以接受参数的可执行程序,svn在比较2个文件时,会将两个文件路径都传给目标比较工具,使其可以直接打开两个文件进行比较。

在此,我们可以首先接受svn传入的两个路径参数,优先一步对其进行尝试解析,如果为我们特定的加密后文件,则执行解密转文本后,再将一个长度为2的字符串数组传递给svn的比较工具,则可以使得svn能够比较之前无法解析的文件了。

static void Main(string[] args)
{
    if (args.Length != 2)
    {
        // 由svn传过来的必定是为2的长度
        return;
    }
    var results = new string[2];
    // 就长度为2, 没必要遍历了
    results[0] = TryDecode(args[0]);
    results[1] = TryDecode(args[1]);
    DoSVNCompareCommand($"\"{results[0]}\" \"{results[1]}\"");
}

private static string TryDecode(string path)
{
    // 读取文件内容后, 判断是否为指定可解读的内容
    // 如是 则 通过自定义或指定的解读方法进行解析, 返回解析后的字符串
    // 如否 则直接返回原路径
    ...
    return result;
}

private static void DoSVNCompareCommand(string cmd)
{
    // 使用指定的文件执行svn比较工具, 需要知道TortoiseMerge.exe的位置
}

private static string TortoiseMergePath
{
    get
    {
        if (_tortoiseMergePath == "null")
        {
            // 从系统变量里读取svn的bin目录
            
        }
        return _tortoiseMergePath;
    }
}
private static string _tortoiseMergePath = "null";

 这里 DoSVNCompareCommand(string cmd) 是一个使用Process打开指定文件,并传入参数的方法。

我们知道svn通常在安装后,会在系统变量的Path里写入自身bin目录的位置。

因此只需要取得Path变量后,使用";"进行分割得到数组,遍历数组得到Svn的bin路径则可以得到TortoiseMerge.exe的路径了。

猜你喜欢

转载自blog.csdn.net/DoyoFish/article/details/129784224