Microsoft.TeamFoundation.VersionControl.Client.Workspace.PendAdd
出于某种原因,每当我从TFS API调用PendAdd方法时,它都会执行,没有异常但却无法标记我工作区中添加的任何文件。但是,Calling PendEdit始终按预期工作。我已经验证了所使用的帐户都有权在TFS中添加,并且对相关文件具有完全控制Windows权限。
有什么想法吗?
我的代码(用于调试,我尝试对PendAdd方法的输入进行四种变化):
public bool AddFile( string filePath, out string status, bool isRecursive = false )
{
Workspace workspace = GetWorkspace( out status );
if( workspace == null )
{
return false;
}
workspace.PendAdd( filePath, isRecursive );
status = "Success";
return true;
}
public bool CheckOutFile( string filePath, out string status )
{
Workspace workspace = GetWorkspace( out status );
if( workspace == null )
{
return false;
}
workspace.PendEdit( filePath );
status = "Success";
return true;
}
...
string status;
// $/Solution/.../foo.cs (non-recursive)
if( TFS.AddFile("$/Solution" + Regex.Split(target, "Solution")[1].Replace('\\', '/'), out status) == false )
{
throw new Exception( "TFS Add failed: " + status );
}
// $/Solution/.../ (recursive)
if( TFS.AddFile("$/Solution" + Regex.Split(target.Substring(0, target.LastIndexOf('\\')), "Solution")[1].Replace('\\', '/'), out status, true) == false )
{
throw new Exception( "TFS Add failed: " + status );
}
// Calls PendEdit with C:\TFS\Solution\...\foo.cs; this works
if( TFS.CheckOutFile(target, out status) == false )
{
throw new Exception( "TFS Checkout failed: " + status );
}
// C:\TFS\Solution\...\foo.cs (non-recursive)
if( TFS.AddFile(target, out status) == false )
{
throw new Exception( "TFS Add failed: " + status );
}
// C:\TFS\Solution\...\ (recursive)
if( TFS.AddFile(target.Substring(0, target.LastIndexOf('\\')), out status, true) == false )
{
throw new Exception( "TFS Add failed: " + status );
}
...
private Workspace GetWorkspace( out string status )
{
Workspace[] workspaces = _versionControlServer.QueryWorkspaces( null, _versionControlServer.AuthorizedUser, Environment.MachineName );
if( workspaces.Length != 1 )
{
status = "You must have exactly 1 local workspace to promote code.";
return null;
}
else
{
status = "You have exactly 1 local workspace.";
}
return workspaces[0];
}
答案 0 :(得分:2)
嗯,这很奇怪,但我做了一个更改,允许多个用户通过此控制器(而不是一个硬编码用户)添加或编辑文件,并在必要时为每个用户创建一个新工作区,现在一切都按原来的方式工作意。考虑到任何与此行为无关的内容都以任何重要方式进行了修改,这是非常奇怪的。
我不完全相信这不是一个错误/我以前没有在代码中遇到过一些边缘情况,但只要我的项目有效(它现在就是这样)我就是不管怎样都不关心。
Relevant Microsoft Connect thread(如果这确实是TFS的问题,稍后会解决)。
答案 1 :(得分:0)
我已经复制了这种奇怪的行为。我可以通过在我的文件系统上创建文件 BEFORE 将其添加到sourceControl来修复它。
否则,它将无声地失败。
答案 2 :(得分:0)
我遇到了同样的问题(即使使用MSDN示例here),但在调用PendAdd之前调用Workstation.EnsureUpdateWorkspaceInfoCache
为我解决了这个问题。
倾听NonFatalErrors可以为您提供有关此类问题的非常有用的提示。