2010-01-13 1 views
1

나는 저장소 목록에서 소스 코드를 다운로드하는 파이썬 스크립트가 있는데, 그 중 일부는 크다.다른 프로세스 (svn)를 지켜보기

때로는 svn이 체크 아웃 중에 중단됩니다. svn 프로세스를 감시 할 수있는 방법이 있습니까? 그래서 정지 상태인지 여부를 알 수 있습니까?

+0

SVN은 한 번에 너무 많은 업데이트를 좋아하지 않습니다. (필자는 추측하고 있습니다.) 이 비동기를 실행하고 있습니까? 그것들을 동기식으로 실행할 수 있습니까? –

+0

나는 그들을 다른 단어 하나 하나씩 동기화하고있다. – Purui

+0

푸 루이 : 흠. SVN lib를 사용하거나 svn.exe를 직접 호출하고 있습니까? 라이브러리를 사용하여 각 파일을 그런 식으로 연결하고 진행 상황을 관찰 할 수는 있지만 작업량은 적을 것입니다 (별로는 아니지만 현재 수행중인 작업보다 많음). –

답변

1

PySVN을 사용할 수 있으며 각 "이벤트"프로세스마다 콜백을 등록 할 수 있습니다. PySVN은 "취소"콜백을 폴링 할 수도 있습니다. 첫 번째 콜백은 타이머를 시작할 수 있으며 타이머가 만료되면 "취소"콜백에 False를 반환하여 체크 아웃을 취소 할 수 있습니다.

#!/usr/bin/python 

url = "svn://server/path/to/repo" 
path = "/path/to/local/wc" 

import pysvn 
import threading 

# Set to something reasonable 
SVN_TIMEOUT = 1000 

svn_timer = None 
stop_svn = False 

def timer_expired(): 
    # Too long since last SVN event, so do something sensible... 
    print "SVN took too long!" 
    global stop_svn 
    stop_svn = True 

def svn_cancel(): 
    return stop_svn 

def notify(event_dict): 
    global svn_timer 
    if svn_timer: 
     svn_timer.cancel() 
    svn_timer = threading.Timer(SVN_TIMEOUT, timer_expired) 
    svn_timer.start() 

svn_client = pysvn.Client() 
svn_client.callback_notify = notify 
svn_client.callback_cancel = svn_cancel 

svn_timer = threading.Timer(SVN_TIMEOUT, timer_expired) 
svn_timer.start() 

revision = svn_client.checkout(url,path) 

if svn_timer: 
    svn_timer.cancel() 
+0

감사합니다. 그것이 내가 원하는 것입니다. – Purui

+0

좋아요, 아마도 PySVN이 실제로 리콜하는 방식으로 작동하지 않습니다. 실제로 시간 초과를 트리거 할 수 없기 때문에 ... – detly

+0

Duh, 타이머를 시작하는 것을 잊었습니다. – detly

0

svn 프로세스의 표준 출력을 폴링하고 새 파일을 얼마나 자주 가져올 지 테스트 할 수 있습니다. x 초 이내에 새 파일을 가져 오지 않으면 프로세스를 반송하십시오.

마스터 스크립트에서 subprocess를 사용하여 svn을 시작하고 프로세스 완료를 기다리는 동안 stdout을 폴링하십시오.

관련 문제