文件不在客户端

File (s) not on client

自从我开始实施工作区感知以来,我遇到了一个非常奇怪的 P4Python 问题。

情况如下:

我有一个 "P4Commands" 模块,它继承了 P4 并连接到 __init__()

那么,我分别有以下类:

P4Commands 模块继承了 P4 并调用其父类的 "run" 方法,同时还注入了一些我实现的自定义缓存以加速大量调用。 运行 方法被这样调用:

result = super(P4Commands, self).run(*args, **kwargs)

这将被记录并返回。

当我对文件调用操作时,我首先通过 P4User 找出文件所在的工作区。然后,我在找到匹配的工作区实例上执行以下操作:

def run(self, *args, **kwargs):
    # run whatever commands have to be run, with client temporarily set 
    # to this instance's client setting.
    with self.FUNCS.saved_context(client=self.client) as _:
        return self.FUNCS.run(*args, **kwargs)

其中 FUNCS 是 P4Commands 模块实例。

我遇到的问题是,对于 returns 信息的文件,当我对其调用 fstat 时,我得到 "file (s) not on client" 作为错误,仅当我调用"edit"命令时。其他所有命令(add、fstat、where 等)似乎都运行良好。这只发生在编辑命令上。

奇怪的是,当我 运行 具有完全相同参数但在工作区上下文管理器之外(直接在 P4User 模块上)的方法时,我没有收到错误).

它变得更奇怪了:我尝试禁用上下文管理器,仍然没有快乐。

还有一点更奇怪,当你读到这里时,你可能会想 "oh, the client is not being set properly"。我尝试记录客户端工作区,它已正确设置和取消设置。正如我所说,所有其他命令都有效,只是 edit.

无效

剩下的唯一情况是多个 P4 模块实例的连接受到干扰。我尝试使 P4Commands 成为一个静态全局变量,每个模块只共享一个实例。那也没有成功。

我尝试了各种方法,但在这一点上我有点卡住了。有人知道如何解决这个问题吗?

经过大量搜索,我设法解决了这个问题:

我将 P4 连接实例化为 class 成员,这会扰乱实例,因为每个 P4Workspace 实例都共享相同的连接并试图取得所有权。尽管大多数命令都有效,但这似乎导致了上面列出的问题的连接混乱。

我最终解决这个问题的方法是使 P4 继承的 class 实例成为 P4Workspace class 的实例变量。之前是class会员

所以最终起作用的结构是:

  • P4User - class 名为 FUNCS 的成员,它为非工作区特定调用实例化连接。包含多个 P4Workspace 实例。
  • P4Workspace - 名为 "connection" 的实例变量,它创建特定于工作区的连接以在实例上执行。