文件不在客户端上

时间:2017-07-21 17:42:58

标签: python p4python

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

情况如下:

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

中连接

然后,我分别有以下几个类:

  • P4USER
  • P4Workspace
  • P4Changelist

P4Commands模块继承P4并调用其父级的“run”方法,同时还注入了我实现的一些自定义缓存,以加速大量调用。 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 时返回信息的文件时,我将“文件不在客户端上”视为错误,仅当我调用“编辑”命令时。其他所有命令(add,fstat,where等)似乎都能正常工作。这只发生在编辑命令上。

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

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

还有一件事要添加到古怪,在阅读本文时,你可能会想“哦,客户端没有正确设置”。我尝试记录客户端工作区,并且正确设置和取消设置。就像我说的,所有其他命令都有效,只是不是编辑

剩下的唯一情况是多个P4模块实例的连接正在干扰。我尝试将P4Commands设置为静态全局,每个模块只共享一个实例。这也没有结束。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

所以最终工作的结构是:

  • P4User - 名为FUNCS的类成员,它为非工作区特定的调用实例化连接。包含多个P4Workspace实例。
  • P4Workspace - 实例变量名为" connection"这将为实例上的perforce创建特定于工作空间的连接。