如何找出subversion工作目录是否被svn锁定?

时间:2008-10-13 08:29:20

标签: python svn

一个python脚本正在运行两个并行的python进程(通过os.fork()创建),每个进程最终都会尝试将一个subversion存储库叶子检出到同一个工作副本目录中。

在子进程中运行'svn co ...'命令之前(通过python子进程模块),父python代码检查工作副本目录是否已经存在。

  if os.path.isdir(checkout_dir):
     # working copy dir already exists
     return checkout_dir

所以,如果确实如此,那么不应该有任何'svn co'在运行,而是从父函数立即返回。

然而,发生了一些碰撞,其中一个python进程在'svn co ..'上失败,出现以下错误。

checked-out failed: svn: Working copy '/tmp/qm_23683' locked
svn: run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)**

所以第一个问题是为什么工作副本目录存在检查不起作用,第二个问题 - 有没有办法找出工作副本目录被svn锁定并循环直到它被解锁?

感谢。

2 个答案:

答案 0 :(得分:4)

在目录中,应该有一个名为“.svn”的目录。在此范围内,名为“locked”的文件表示该目录已被锁定。

答案 1 :(得分:2)

这听起来像是一种潜在的竞争条件,因为会发生以下情况:

  1. 进程A检查目录是否存在(它还没有)。
  2. 进程B检查目录是否存在(它还没有)。
  3. 进程A调用svn,创建目录。
  4. 进程B调用svn,随后失败。
  5. 避免这种情况的一种简单方法是让每个进程尝试创建目录,而不是检查它是否存在。如果其他进程已经创建了目录,则保证另一个进程在各种各样的平台和文件系统下获得定义良好的错误代码。例如,这是在许多NFS实现上进行同步的唯一可靠方法之一。幸运的是,svn不关心工作目录是否已经存在。

    Python代码看起来像这样:

    import os, errno
    
    # ...
    
    try:
      os.mkdir(dirName)
    except OSError, e:
      if e.errno != errno.EEXIST: raise # some other error
      print 'Directory already exists.'
    else:
      print 'Successfully created new directory.'
    

    这种技术易于实现,非常可靠,并且在各种情况下都很有用。