使用SharpSvn检查目录是否在外部

时间:2017-08-14 09:24:55

标签: c# svn sharpsvn

我目前正在尝试确定工作副本中的目录是否为外部目录或不使用SharpSvn。对于文件来说这很容易,因为IsFileExternal中有选项SvnStatusEventArgs,但对于目录来说,这似乎并不容易。

在目录上运行svn status命令不返回任何信息,这是有意义的,因为外部定义附加到父目录。但是在父目录上运行svn status,由于外部定义而发出包含目录的信号。

在SharpSvn中做同样的事情也无济于事。没有迹象表明任何子目录都是外部的。

我的第一个想法是检查父目录是否有任何外部定义,但如果存在文件和外部目录的定义,则可能会出现问题。

有没有人有解决方案或想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

似乎我的第一个想法得以实现。要检查是否有任何项目是外部的,以下内容将有所帮助:

private bool CheckIfItemIsExternal(string itemPath)
    {
        List<SvnStatusEventArgs> svnStates = new List<SvnStatusEventArgs>();
        using (SvnClient svnClient = new SvnClient())
        {
            // use throw on error to avoid exception in case the item is not versioned
            // use retrieve all entries option to secure that all status properties are retrieved
            SvnStatusArgs svnStatusArgs = new SvnStatusArgs()
            {
                ThrowOnError = false,
                RetrieveAllEntries = true,
            };
            Collection<SvnStatusEventArgs> svnStatusResults;
            if (svnClient.GetStatus(itemPath, svnStatusArgs, out svnStatusResults))
                svnStates = new List<SvnStatusEventArgs>(svnStatusResults);
        }

        foreach (var status in svnStates)
        {
            if (status.IsFileExternal)
                return true;
            else if (status.NodeKind == SvnNodeKind.Directory)
            {
                string parentDirectory = Directory.GetParent(itemPath).ToString();
                List<SvnPropertyListEventArgs> svnProperties = RetrieveSvnProperties(parentDirectory);
                foreach (var itemProperties in svnProperties)
                {
                    foreach (var property in itemProperties.Properties)
                    {
                        if (property.Key == "svn:externals" && property.StringValue.Contains(new DirectoryInfo(itemPath).Name))
                            return true;
                    }
                }
            }
        }
        return false;
    }