Книга: Написание скриптов для Blender 2.49

Отправка (commit) файла в хранилище

Отправка (commit) файла в хранилище

Отправка текстового буфера в хранилище - процесс из двух шагов. Сначала мы должны сохранить содержимое текстового буфера в файл, и затем мы отправляем этот файл в хранилище. Мы должны проверить, имеет ли текстовый блок связанное с ним имя файла, и предложить пользователю сначала сохранить файл, если такого файла пока ещё нет. Пользователь должен сохранить файл в подтверждённый каталог для того, чтобы отправить файл в хранилище.

Так же как и расширение, позволившее нам производить поиск с помощью регулярных выражений, этот скрипт начинается с подходящего заголовка, чтобы идентифицировать его как плугин текстового редактора, и чтобы назначить клавиатурное сокращение. Мы определяем мнемосхему Ctrl + Alt + C для отправки (выделено), так же как мы определим Ctrl + Alt + U для обновления в своем сопровождающем скрипте. Мы также импортируем необходимые модули, особенно модуль pysvn:

#!BPY
"""
Name: 'SVNCommit'
Blender: 249
Group: 'TextPlugin'
Shortcut: 'Ctrl+Alt+C'
Tooltip: 'Commit current textbuffer to svn'
"""
from Blender import Draw,Text,Registry
import bpy
import pysvn
def popup(msg):
   Draw.PupMenu(msg+'%t|Ok')
   return

Функция run() сначала пытается получить активный текстовый буфер и возвращается без брюзжания, если там его нет. Затем она проверяет, существует ли имя файла, определённое для этого текстового буфера (выделено). Если нет, она напоминает пользователю, что надо сначала сохранить файл (таким образом, определяя имя файла и располагая файл в подтвержденном каталоге), и возвращается.

def run():
   txt = bpy.data.texts.active
   if not txt: return
   fn = txt.getFilename()
   if fn == None or len(fn) == 0:
      popup('No filename defined: save it first')
      return

Следующим шагом нужно создать объект клиента pysvn, который позволит нам взаимодействовать с хранилищем. Метод info() извлекает информацию о статусе файла в хранилище (выделено). Если нет никакой информации, значит файл пока не был добавлен к хранилищу - ситуация, которую мы исправляем, вызывая метод add():

   svn = pysvn.Client()
   info = svn.info(fn)
   if info == None:
      popup('not yet added to repository, '+
            'will do that now')
      svn.add(fn)

Затем, мы сводим текущее содержимое текстового буфера, соединяя все строки в нём в единственный блок данных, и записываем его в файловый объект, который мы открыли для файла, связанного с буфером:

   file=open(fn,'wb')
   file.write('n'.join(txt.asLines()))
   file.close()

Этот файл будет отправлен в хранилище с помощью метода checkin(), которому мы передаем довольно неинформативное сообщение отправки. Было бы хорошей идеей предложить пользователю создать более заметное сообщение. Наконец, мы сообщаем пользователю результат отправки.


Заметьте, что номера версии в Subversion (Subversion revision) связаны не с файлом, а с хранилищем, так что это число может отличаться больше, чем на единицу от предыдущего переданного файла, если за это время была совершена передача других файлов.

   version = svn.checkin(fn,'Blender commit')
   popup('updated to rev. '+str(version))
if __name__ == '__main__':
   run()

Полный код доступен как textplugin_commit в файле svn.blend, но должен быть установлен в каталоге скриптов Блендера.

Оглавление книги


Генерация: 2.147. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз