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

 Обновление (updating) файла из хранилища

 Обновление (updating) файла из хранилища

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

Кроме проверки, сохранен ли текстовый буфер, и добавлен ли уже файл к хранилищу, мы должны также проверить, является ли наша текущая версия - новой или измененной по сравнению с версией в хранилище. Если это так, мы предлагаем пользователю выбор: отвергнуть эти изменения и вернуться к версии в хранилище, или подтвердить и отправить версию, находящуюся в текстовом буфере. (Третий вариант, объединение различий, у нас не предусмотрен; хотя Subversion, несомненно, способно сделать это, по крайней мере для текстовых файлов, но лучше это предоставить более универсальным инструментам, таким как TortoiseSVN.)

Первая часть скрипта очень похожа на скрипт отправки. Основное различие - это другое клавиатурное сокращение:

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

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

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
   svn = pysvn.Client()
   info = svn.info(fn)
   if info == None:
      popup('not yet added to repository, '+
            'will do that now')
      svn.add(fn)

После сохранения содержимого текстового буфера в связанный с ним файл, функция вызывает метод status(), чтобы убедиться, что файл, который мы сохранили (и, следовательно, содержание текстового буфера), изменён по сравнению с версией в хранилище (выделено). В метод status() можно также передавать список имён файлов, и он всегда возвращает список результатов, даже когда мы передали ему простое одиночное имя файла - поэтому применяется индекс [0]. Если наш текстовый буфер изменён, мы сообщаем об этом пользователю, и предлагаем выбор: или отвергнуть изменения и извлечь версию, сохранённую в хранилище, или отправить текущую версию. Также возможно отменить оба действия, щелкнув за пределами меню, в этом случае PupMenu() возвращает -1:

   file=open(fn,'wb')
   file.write('n'.join(txt.asLines()))
   file.close()
   if svn.status(fn)[0].text_status ==
pysvn.wc_status_kind.modified:
      c=Draw.PupMenu('file probably newer than '+
         'version in repository%t|Commit|Discard changes')
      if c==1:
         svn.checkin(fn,'Blender')
         return
      elif c==2:
         svn.revert(fn)

После извлечения версии из хранилища мы обновляем содержание нашего текстового буфера:

   txt.clear()
   file=open(fn)
   txt.write(file.read())
   file.close()

Наконец, мы сообщаем пользователю с помощью всплывающего окна, какой номер версии содержится в текстовом буфере, снова вызывая метод status() и получая значение поля commit_revision:

   popup('updated to rev. '
          +str(svn.status(fn)[0].entry.commit_revision))
if __name__ == '__main__':
   run()

Полный код доступен как textplugin_svnupdate в файле svn.blend, и, подобно сопряженному с ним скриптом для отправки, он должен быть размещён в каталоге скриптов Блендера.

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


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