Проверьте, находится ли файл под контролем версий в pysvn (подрывная деятельность python)

Как в pysvn проверить, находится ли файл под контролем версий?


person Colonel Panic    schedule 16.05.2012    source источник
comment
Здесь есть два случая. Файла нет ни в одной рабочей копии, или файл есть в рабочей копии, но не добавлен.   -  person Colonel Panic    schedule 28.05.2012


Ответы (1)


Используйте client.status() и проверьте атрибут text_status возвращаемого объекта состояния. Пример:

>>> import pysvn
>>> c = pysvn.Client()
>>> out = c.status("versioned.cpp")[0]  # .status() returns a list
>>> out.text_status
<wc_status_kind.normal>

Это показывает, что файл имеет версию и не изменен.

>>> c.status("added.cpp")[0].text_status  # added file
<wc_status_kind.added>
>>> c.status("unversioned.cpp")[0].text_status  # unversioned file
<wc_status_kind.unversioned>

Вы можете изучить другие возможные статусы, используя dir (pysvn.wc_status_kind)

Поэтому вы можете обернуть это чем-то вроде:

def under_version_control(filename):
    "returns true if file is unversioned"
    c = pysvn.Client()
    s = c.status(filename)[0].text_status
    return s not in (
        pysvn.wc_status_kind.added, 
        pysvn.wc_status_kind.unversioned,
        pysvn.wc_status_kind.ignored)

Если вы хотите также обращаться к файлам за пределами рабочего каталога svn, вам нужно перехватить и обработать ClientError. Например.

def under_version_control(filename):
    "returns true if file is unversioned"
    c = pysvn.Client()
    try:
        s = c.status(filename)[0].text_status
    catch pysvn.ClientError:
        return False
    else:
        return s not in (
            pysvn.wc_status_kind.added, 
            pysvn.wc_status_kind.unversioned,
            pysvn.wc_status_kind.ignored)
person Shawn Chin    schedule 28.05.2012
comment
@MattHickford Как и стандартная команда svn, она предназначена для использования с файлами, находящимися в рабочей копии. Если вы хотите также обрабатывать файлы вне рабочих копий, поместите вызов .status в блок try/except. Будет обновляться с примером. - person Shawn Chin; 29.05.2012