<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.gis-lab.info/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B9_QGIS_%D0%B8%D0%B7_SVN</id>
	<title>Автоматическое обновление репозитория расширений QGIS из SVN - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gis-lab.info/index.php?action=history&amp;feed=atom&amp;title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B9_QGIS_%D0%B8%D0%B7_SVN"/>
	<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B9_QGIS_%D0%B8%D0%B7_SVN&amp;action=history"/>
	<updated>2026-05-20T21:21:36Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.gis-lab.info/index.php?title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B9_QGIS_%D0%B8%D0%B7_SVN&amp;diff=6147&amp;oldid=prev</id>
		<title>Voltron: Новая страница: «{{Статья|Опубликована|qgis-repo-update}} {{Аннотация|Советы разработчикам расширений как автомат…»</title>
		<link rel="alternate" type="text/html" href="https://wiki.gis-lab.info/index.php?title=%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D0%B9_QGIS_%D0%B8%D0%B7_SVN&amp;diff=6147&amp;oldid=prev"/>
		<updated>2012-07-25T14:19:10Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «{{Статья|Опубликована|qgis-repo-update}} {{Аннотация|Советы разработчикам расширений как автомат…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Статья|Опубликована|qgis-repo-update}}&lt;br /&gt;
{{Аннотация|Советы разработчикам расширений как автоматически обновлять хранилище расширений QGIS прямо из SVN.}}&lt;br /&gt;
&lt;br /&gt;
Одно из достоинств QGIS для разработчика — наличие репозиториев расширений (пока только для Python). Так, в отличие от ArcScripts, где все хранится в едином хранилище, в QGIS такое хранилище может устроить каждый. Подключиться к нему может пользователь, знающий адрес этого репозитория. Помимо этого, так как к каждому плагину идет параметр «Version», менеджер расширений QGIS умеет проверять обновления плагинов ([http://gis-lab.info/qa/qgis-repo.html подробнее]). Т.е. разработчику расширения остается только изменять версию и периодически выкладывать новый архив с расширением в репозиторий. Все прекрасно, но допустим у вас есть еще и SVN, в котором хранится исходный код расширения. В этом случае процесс обновления расширения становится несколько избыточным, так как после отправки кода в SVN, нужно его пакетировать, положить в репозиторий расширений, обновить xml репозитория согласно новой версии, чтобы QGIS увидел, что расширение обновилось.&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы автоматизировать этот процесс, можно использовать возможность SVN запускать нужный скрипт после нужного события, в нашем случае после коммита кода (&amp;lt;tt&amp;gt;post-commit&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Примечание: здесь и далее под «репозиторием» имеется в виде не хранилище кода расширения в SVN, а специализированное хранилище плагинов QGIS.&lt;br /&gt;
&lt;br /&gt;
=== Подключение post-commit хука ===&lt;br /&gt;
&lt;br /&gt;
Допустим расширение разработано, проверенно и работает локально. Репозиторий расширений создан, код расширения регулярно обновляется в SVN.&lt;br /&gt;
&lt;br /&gt;
Создадим и сделаем исполняемым скрипт &amp;lt;tt&amp;gt;post-commit&amp;lt;/tt&amp;gt;, срабатывающий после успешного коммита в svn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd PATH_TO_REPOS/hooks          # Путь к папке hook&lt;br /&gt;
cp post-commit.tmpl post-commit # Включим хук, скопировав его из шаблона&lt;br /&gt;
chmod u+x post-commit           # Разрешим исполнять&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, отредактируем наш post-commit, заставив его выполнить все нужные нам действия. Наш post-commit будет выполнять следующие действия:&lt;br /&gt;
&lt;br /&gt;
# Получать обновленный код через веб (&amp;lt;tt&amp;gt;wget&amp;lt;/tt&amp;gt;)&lt;br /&gt;
# Архивировать его в папку с расширением (&amp;lt;tt&amp;gt;zip&amp;lt;/tt&amp;gt;)&lt;br /&gt;
# Запускать программу на Python, обновляющую XML репозитория (&amp;lt;tt&amp;gt;getsetversion.py&amp;lt;/tt&amp;gt;)&lt;br /&gt;
# Отправлять сообщение администратору об обновлении (&amp;lt;tt&amp;gt;mail&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
REPOS=&amp;quot;$1&amp;quot;&lt;br /&gt;
REV=&amp;quot;$2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
NAME=&amp;quot;testplugin&amp;quot;&lt;br /&gt;
NAMEP=&amp;quot;TestPlugin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cd /usr/local/www/programs/qgis&lt;br /&gt;
/usr/local/bin/wget -rnH http://svn.gis-lab.info/$NAME&lt;br /&gt;
cd $NAME&lt;br /&gt;
rm index.html&lt;br /&gt;
cd ..&lt;br /&gt;
/usr/local/bin/zip -mq9 $NAME.zip $NAME/*&lt;br /&gt;
rm -rf $NAME&lt;br /&gt;
/usr/local/bin/python getsetversion.py http://svn.gis-lab.info/$NAME/__init__.py $NAMEP&lt;br /&gt;
mail -s &amp;quot;$REPOS&amp;quot;&amp;quot;$REV&amp;quot; sim@gis-lab.info&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Приведенный выше код является bash-скриптом. Переменная &amp;lt;tt&amp;gt;$REPOS&amp;lt;/tt&amp;gt; содержит полный путь к svn-хранилищу, &amp;lt;tt&amp;gt;$REV&amp;lt;/tt&amp;gt; — последнюю ревизию кода, &amp;lt;tt&amp;gt;$NAME&amp;lt;/tt&amp;gt; — содержит имя папки, &amp;lt;tt&amp;gt;$NAMEP&amp;lt;/tt&amp;gt; — имя расширения как оно задано в XML репозитория.&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим как автоматически увеличивать версию расширения в XML репозитории.&lt;br /&gt;
&lt;br /&gt;
=== Обновление XML-описания репозитория ===&lt;br /&gt;
&lt;br /&gt;
Как уже разбиралась более подробно в статье «[http://gis-lab.info/qa/qgis-repo.html Организация репозитория расширений QGIS]», информация о расширениях хранится в XML файле. Фрагмент, отвечающий за одно расширение, выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pyqgis_plugin name=&amp;quot;TestPlugin&amp;quot; version=&amp;quot;0.1.29&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;description&amp;gt;This is the test plugin&amp;lt;/description&amp;gt;&lt;br /&gt;
  &amp;lt;homepage&amp;gt;http://gis-lab.info/qa/qgis-dev-python.html&amp;lt;/homepage&amp;gt;&lt;br /&gt;
  &amp;lt;qgis_minimum_version&amp;gt;1.0&amp;lt;/qgis_minimum_version&amp;gt;&lt;br /&gt;
  &amp;lt;file_name&amp;gt;testplugin.zip&amp;lt;/file_name&amp;gt;&lt;br /&gt;
  &amp;lt;author_name&amp;gt;GIS-Lab&amp;lt;/author_name&amp;gt;&lt;br /&gt;
  &amp;lt;download_url&amp;gt;http://gis-lab.info/programs/qgis/testplugin.zip&amp;lt;/download_url&amp;gt;&lt;br /&gt;
&amp;lt;/pyqgis_plugin&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как можно видеть, после обновления кода расширения нужно обновить только параметр version тэга pyqgis_plugin. Это и происходит при запуске этой строки из bash-скрипта, разобранного выше:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/usr/local/bin/python getsetversion.py http://svn.gis-lab.info/$NAME/__init__.py $NAMEP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разберем код установки версии в файл &amp;lt;tt&amp;gt;repo.xml&amp;lt;/tt&amp;gt; — &amp;lt;tt&amp;gt;getsetversion.py&amp;lt;/tt&amp;gt;, где хранится и должна обновляться информация о расширениях.&lt;br /&gt;
&lt;br /&gt;
В коде самого расширения версия хранится в файле &amp;lt;tt&amp;gt;__init__.py&amp;lt;/tt&amp;gt; в фрагменте следующего типа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def version():&lt;br /&gt;
  return &amp;quot;Version &amp;quot; + &amp;quot;0.1.32&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем извлекать ее оттуда, парсить XML описания репозитория и заменять в нем версию расширения на извлеченную.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import xml.dom.minidom,sys,urllib&lt;br /&gt;
from xml.dom.minidom import parse, parseString&lt;br /&gt;
&lt;br /&gt;
xmlfile = &amp;quot;/usr/local/www/programs/qgis/qgis-repo.xml&amp;quot;&lt;br /&gt;
initfile = urllib.urlopen(sys.argv[1])&lt;br /&gt;
pluginname = sys.argv[2]&lt;br /&gt;
&lt;br /&gt;
#in_file = open(initfile, 'rU')&lt;br /&gt;
text = initfile.readlines()&lt;br /&gt;
for line in text:&lt;br /&gt;
   if &amp;quot;Version&amp;quot; in line:&lt;br /&gt;
     if &amp;quot;return&amp;quot; in line:&lt;br /&gt;
       theline = line&lt;br /&gt;
&lt;br /&gt;
theline = theline.replace('\n','')&lt;br /&gt;
alist = theline.split('&amp;quot;')&lt;br /&gt;
cnt = len(alist)&lt;br /&gt;
version = alist[cnt-2]&lt;br /&gt;
version = version.replace(' ','')&lt;br /&gt;
&lt;br /&gt;
parsedoc = parse(xmlfile)&lt;br /&gt;
elems = parsedoc.getElementsByTagName(&amp;quot;pyqgis_plugin&amp;quot;)&lt;br /&gt;
for elem in elems:&lt;br /&gt;
   valname = elem.attributes[&amp;quot;name&amp;quot;].value&lt;br /&gt;
   if valname == pluginname:&lt;br /&gt;
     elem.attributes[&amp;quot;version&amp;quot;].value = version&lt;br /&gt;
&lt;br /&gt;
final = open(xmlfile,&amp;quot;w&amp;quot;)&lt;br /&gt;
final.writelines(parsedoc.toxml())&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким же способом можно делать резервные копии и много чего другого.&lt;br /&gt;
&lt;br /&gt;
Теперь разработчик расширения делает только &amp;lt;tt&amp;gt;svn commit&amp;lt;/tt&amp;gt; и никаких лишних действий вручную по сборке расширения для распространения. Пользователь же расширения, благодаря QGIS [http://gis-lab.info/qa/qgis-repo.html автоматически извещается] о доступном обновлении.&lt;br /&gt;
&lt;br /&gt;
=== Ссылки по теме ===&lt;br /&gt;
&lt;br /&gt;
* [http://gis-lab.info/qa/qgis-dev-python.html Разработка простого расширения для QGIS на Python]&lt;br /&gt;
* [http://gis-lab.info/qa/qgis-repo.html Организация и работа с репозиториями расширений QGIS]&lt;/div&gt;</summary>
		<author><name>Voltron</name></author>
	</entry>
</feed>