7

自从我开始实现工作区意识以来,我在 P4Python 上遇到了一个非常奇怪的问题。

情况如下:

我有一个“P4Commands”模块,它继承了 P4 并在__init__()

然后,我分别有以下课程:

  • P4用户
  • P4工作区
  • P4更改列表

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 模块实例。

我遇到的问题是,对于一个在我调用fstat时返回信息的文件,只有当我调用“edit”命令时,才会得到“file (s) not on client”作为错误。其他所有命令(add、fstat、where 等)似乎都可以正常工作。这只发生在编辑命令上。

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

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

更奇怪的是,在阅读本文时,您可能会想“哦,客户端设置不正确”。我尝试记录客户端工作区,并且它被正确设置和取消设置。就像我说的,所有其他命令都可以工作,只是不能编辑

唯一剩下的情况是多个 P4 模块实例的连接受到干扰。我尝试将 P4Commands 设为静态全局,每个模块仅共享一个实例。那也没有奏效。

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

4

1 回答 1

3

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

我将 P4 连接实例化为类成员,这与实例混淆,因为每个 P4Workspace 实例都共享相同的连接并试图获取所有权。尽管大多数命令都可以正常工作,但这似乎一直在弄乱连接,导致上面列出的问题。

我最终解决这个问题的方法是使 P4 继承的类实例成为 P4Workspace 类的实例变量。之前,它是一个班级成员。

所以最终工作的结构是:

  • P4User - 称为 FUNCS 的类成员,它为非工作区特定调用实例化连接。包含多个 P4Workspace 实例。
  • P4Workspace - 称为“连接”的实例变量,它创建一个特定于工作空间的连接以在实例上执行。
于 2017-07-24T09:29:00.797 回答