使用 SharpSvn 检查目录是否为外部目录
Check if directory is external using SharpSvn
我目前正在尝试使用 SharpSvn 确定工作副本中的目录是否为外部目录。对于文件来说很容易,因为 SvnStatusEventArgs
中有选项 IsFileExternal
,但是对于目录来说似乎并不那么容易。
运行 目录上的 svn status
命令没有 return 任何信息,这是有道理的,因为外部定义附加到父目录。但是父目录上的 运行 svn status
表示由于外部定义而包含的目录在那里。
在 SharpSvn 中做同样的事情没有帮助。没有迹象表明任何子目录是外部的。
我的第一个想法是检查父目录是否有任何外部定义,但如果有文件和目录的外部定义,这可能是个问题。
有没有人知道如何解决这个问题?
看来我的第一个想法实现了。要检查任何项目是否为外部项目,以下内容会有所帮助:
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;
}
我目前正在尝试使用 SharpSvn 确定工作副本中的目录是否为外部目录。对于文件来说很容易,因为 SvnStatusEventArgs
中有选项 IsFileExternal
,但是对于目录来说似乎并不那么容易。
运行 目录上的 svn status
命令没有 return 任何信息,这是有道理的,因为外部定义附加到父目录。但是父目录上的 运行 svn status
表示由于外部定义而包含的目录在那里。
在 SharpSvn 中做同样的事情没有帮助。没有迹象表明任何子目录是外部的。
我的第一个想法是检查父目录是否有任何外部定义,但如果有文件和目录的外部定义,这可能是个问题。
有没有人知道如何解决这个问题?
看来我的第一个想法实现了。要检查任何项目是否为外部项目,以下内容会有所帮助:
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;
}