如何通过TFS 2012 API在本地工作空间下锁定文件

时间:2017-01-18 15:12:43

标签: c# api tfs locking workspace

我正在尝试通过workspace.PendEdit使用排他锁LockLevel.CheckOut签出单个文件。以下函数成功(没有错误),但它似乎对TFS中的文件没有影响(没有签出,也没有锁定)。

public static void Lock(string filePath)
    {
        var workspace = GetWorkspace(filePath);
        workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.CheckOut);
    }

我怀疑这与我的TFS工作区是本地的有关。但是,Visual Studio 2015似乎没有问题通过[Source Control Explorer]->[Right Click Selected File]->[Advanced]->[Lock]建立对文件的锁定。我在做什么与VS的做法有什么不同?我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

您应该使用RecursionType.Full而不是RecursionType.None。

{{1}}

PendEdit()方法返回为您指定的filePath签出/锁定的文件数。 RecursionType.Full将递归到路径的最后一个子节点。

更新: 请尝试为您的API项目安装此TFS nuget包(Expected),并测试此问题是否仍然存在。如果它有效,无论您使用何种版本的VS,都不会出现此问题。

答案 1 :(得分:0)

经过多次试验和错误后,我最终实现了NonFatalError的事件处理程序,如下所示:

private static void VersionControlServer_NonFatalError(object sender, ExceptionEventArgs e)
    {
        if (e.Failure != null && e.Failure.Severity == SeverityType.Error)
            throw new ApplicationException("An internal TFS error occurred. See failure message for details:\r\n"+e.Failure.Message);
    }

一旦事件处理程序通过versionControlServer连接到versionControlServer.NonFatalError += VersionControlServer_NonFatalError;对象,我就可以看到我的独家结账时发生了什么。事实证明,TFS失败默默,并出现以下错误:

TF400022: The item $/Fake/Server/Path/project.config cannot be locked for checkout in workspace MYWORKSPACE;Dan Lastname. Checkout locks are not supported in local workspaces.

解决方案是将LockLevelLockLevel.CheckOut更改为LockLevel.Checkin。它是一种稍微不同类型的锁,但它足以满足我的需求,这是当你试图在本地工作区中锁定文件时VS正在使用的锁类型。所以这是我的原始函数,LockLevel中的微小变化使得一切变得不同。

public static void Lock(string filePath)
{
    var workspace = GetWorkspace(filePath);
    workspace.PendEdit(new[] {filePath}, RecursionType.None, null, LockLevel.Checkin);
}