4

Microsoft.TeamFoundation.VersionControl.Client.Workspace.PendAdd

何らかの理由で、TFS API から PendAdd メソッドを呼び出すたびに、例外なく実行されますが、ワークスペースに追加されたファイルをマークすることはできません。ただし、PendEdit の呼び出しは一貫して期待どおりに機能します。使用されているアカウントには、TFS 内に追加する権限があり、問題のファイルに対するフル コントロールの Windows 権限があることを確認しました。

何か案は?

私のコード (デバッグ用に、PendAdd メソッドへの入力で 4 つのバリエーションを試しています):

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];
}
4

3 に答える 3

2

これは奇妙ですが、複数のユーザーが (ハードコードされた 1 人のユーザーではなく) このコントローラーを介してファイルを追加または編集できるように変更し、必要に応じてユーザーごとに新しいワークスペースを作成した結果、すべてが当初の意図どおりに機能するようになりました。これは、この動作に関連するはずのものが大幅に変更されていないことを考えると、かなり奇妙です。

これがバグではないこと、または以前にコードでエッジケースに遭遇したことがないことを完全に確信しているわけではありませんが、プロジェクトが機能している限り (現在は機能しています)、あまり心配していません。どちらにしても。

関連する Microsoft Connect スレッド(これが TFS の問題であることが判明し、後で解決される場合)。

于 2012-09-21T21:54:42.987 に答える
1

私は同じ問題を抱えていました (ここの MSDN サンプルでも) が、 Workstation.EnsureUpdateWorkspaceInfoCachePendAddを呼び出す前に呼び出すことで解決しました。

NonFatalErrorsをリッスンすると、このような問題について非常に役立つヒントを得ることができます。

于 2017-03-24T22:22:40.150 に答える
0

この奇妙な動作を再現しました。sourceControlに追加する前に、ファイルシステムにファイルを作成することで修正できました。

そうしないと、黙って失敗します。

于 2012-10-09T07:15:50.140 に答える