2008-10-13 56 views
2

python腳本正在運行兩個並行的python進程(通過os.fork()創建),每個進程最終都會嘗試檢出一個Subversion存儲庫樹葉到同一個工作副本目錄中。如何找出subversion工作目錄是否被svn鎖定?

在子進程(通過python subprocess模塊​​)中運行'svn co ...'命令之前,父代碼會檢查工作副本是否已經存在。

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

所以,如果它不應該有任何的「svn合作」運行,但是從父功能,而立即返回。

儘管如此,一些碰撞發生,其中一個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

這聽起來像一個潛在的競爭條件,在像會出現以下情況:

  1. 過程檢查自身是否該目錄存在(它尚未)。
  2. 進程B檢查目錄是否存在(它尚未)。
  3. 進程A調用svn,它創建目錄。
  4. 過程B調用svn,隨後失敗。

一個簡單的方法來避免這種情況是讓每個進程試圖創建的目錄,而不是檢查它的存在。如果另一個進程已經創建了該目錄,另一個進程將保證在各種平臺和文件系統下獲得定義良好的錯誤代碼。例如,這是在許多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.' 

這種技術很容易實現,非常可靠,有用的在各種各樣的情況。

4

在該目錄內,應該有一個名爲'.svn'的目錄。在此範圍內,名爲'locked'的文件表示該目錄已被鎖定。