[devel] Gear и внешние VCS.

Igor Vlasenko vlasenko на imath.kiev.ua
Чт Июн 19 15:08:16 MSK 2014


На примере netxms расскажу планы по автоматизации работы 
с VCS - обновляемыми gear репозиториями.

Итак, если у нас один VCS - обновляемый gear репозиторий,
то проверить, есть ли обновление, тривиально. заходим,
запускаем git fetch <upstream>, глазами смотрим, что приехало.

Если же у нас 100 gear репозиториев, то, тратя по 20 секунд
на репозиторий, их ручная проверка заберет у нас больше, чем пол часа.

Хотелось бы в духе unix-way напустить на нашу коллекцию
gear репозиториев какой-нибудь умный скрипт, скажем,
будущий rpm-uscan, который меньше чем за минуту
проверил бы все репозитории, съэкономив бы нам полчаса,
и даже эту минуту, пока он работал, можно было бы потратить с пользой,
сделав новую чашку кофе.

С tarball обновляемыми gear репозиториями справляется 
и старый rpm-uscan, осталось научиться работать 
с VCS - обновляемыми gear репозиториями.
Там тоже простой алгоритм - руками мы 
запускаем git fetch <upstream>, глазами смотрим, что приехало.

Просмотр робот будет делать так: запускает git tags, фильтрует
(по умолчанию будет фильтр ^ v?([0-9\.]+[0-9]) $,
если апстрим любит теги в другом формате, к примеру,
1.2-release, то для них надо будет создать специальный
файл, скажем, .gear/upstream/tag-filter, формат и опции 
будут похожи на debian/watch),
сравнивает версии из отфильтрованных тегов с текущей,
и если найдет бОльшую, то приехало обновление.

но, перед просмотром, робот должен знать remote <upstream>.
просто просмотреть теги ему достаточно будет git ls-remote --tags <upstream>
а для обновления ему понадобится сделать git fetch <upstream>.

Соответственно, нужно указать роботу, какой remote использовать.
для этого нужен будет специальный файл, скажем, .gear/upstream/remotes.

Формат этого файла, думаю, формат git-config(1).
в нем должен находиться фрагмент .git/config,
который отвечает за текущие используемые remotes.

Для netxms .gear/upstream/remotes будет иметь вид:
==== .gear/upstream/remotes =========================
[remote "upstream"]
        url = git://git.netxms.org/public/netxms.git
        fetch = +refs/heads/*:refs/remotes/upstream/*
=====================================================
если бы использовался мерж в локальную ветвь upstream, 
то там могло бы быть что-то вроде
==== .gear/upstream/remotes =========================
[remote "upstream"]
        url = git://git.netxms.org/public/netxms.git
        fetch = +refs/heads/*:refs/remotes/upstream/*
 [branch "upstream"]
        remote = upstream
        merge = refs/heads/upstream
=====================================================
его можно легко создать руками, скопировав туда нужный 
кусок из .git/config.
Обратно восстановить рабочий .git/config в клоне из
неполноценной копии на git.alt тоже тривиально:
cat .gear/upstream/remotes >> .git/config.

Но, конечно, лучше иметь специализированные утилиты
gear-store-remotes / gear-restore-remotes.
так, gear-restore-remotes сделает backup .git/config,
проверит, нет ли уже там тех ключей, и не 
запустится, если найдет.

gear-store-remotes проверит сначала, есть ли .git/remotes/*.
если найдется .git/remotes/foo, не указывающий на git.alt,
gear-store-remotes посоветует сначала сконвертировать его
в новый формат (в .git/config) командой
git remote rename foo foo
и с таким сообщением завершится.
Далее, в случае .git/config для netxms внизу,
gear-store-remotes проигнорирует [remote "origin"],
так как он указывает на git.alt.
Для netxms останется 2 remote:
[svn-remote "svn"] и [remote "upstream"].
если бы остался только один,
gear-store-remotes его бы молча и выбрал,
а также, если есть, связанные с этим remotes бранчи.

Поскольку найдено 2 remote, то утилита спросит у майнтайнера, 
какие из них сохранить. можно ей указать опциями, --all-remotes, 
или --remotes=upstream, или же она выведет dialog(1)
чтобы майнтайнер отметил, какие remotes он светит наружу,
для того, чтобы другие майнтайнеры и роботы могли пользоваться
его gear репозиторием.
Затем утилита записывает выбранный фрагмент конфига
 в .gear/upstream/remotes и вызывает 
git add .gear/upstream/remotes.

Теперь репозиторий, в котором есть .gear/upstream/remotes,
становится полноценным с точки зрения возможности совместной рааботы.

Работа с ним выглядит приблизительно так:

$ girar-clone-build-commit foo
$ cd foo.git
$ gear-restore-remotes
$ gear-fetch
$ fix bugs (например, оформляем апстримный коммит с исправлением как патч)
$ srpmnmu -i *.spec
$ girar-nmu-helper-git-push-build -c -T
$ cd ..
$ rm -rf foo.git

Соответственно, когда такие утилиты будут готовы,
надо будет просить всех майнтайнеров, использующих
VCS - обновляемые gear репозитории, создать и опубликовать
в этих репозиториях .gear/upstream/remotes,
а если есть желание ограничить доступ к своему репозиторию,
то делать это с помощью acl, а не сокрытием его служебной
информации.


On Thu, Jun 19, 2014 at 12:00:08PM +0400, Eugene Prokopiev wrote:
> 19 июня 2014 г., 11:52 Igor Vlasenko написал:
> > Прошу прощения, пришлите, пожалуйста, из netxms.git еще для опытов
> > .git/config и, если есть что-то в .git/remotes/ (в старом формате),
> > то и их.
> Пожалуйста:
> 
> $ cat git/netxms/.git/config
> [core]
>         repositoryformatversion = 0
>         filemode = true
>         bare = false
>         logallrefupdates = true
> [svn-remote "svn"]
>         url = https://svn.netxms.org/public/netxms
>         fetch = trunk:refs/remotes/trunk
>         branches = branches/*:refs/remotes/*
>         tags = tags/*:refs/remotes/tags/*
> [remote "origin"]
>         url = git.alt:packages/netxms
>         fetch = +refs/heads/*:refs/remotes/origin/*
> [branch "master"]
>         remote = origin
>         merge = refs/heads/master
> [remote "upstream"]
>         url = git://git.netxms.org/public/netxms.git
>         fetch = +refs/heads/*:refs/remotes/upstream/*
> 
> $ ls git/netxms/.git/remotes
> ls: невозможно получить доступ к git/netxms/.git/remotes: Нет такого
> файла или каталога
> 
> Апстрим переехал с svn на git некоторое время назад

-- 

I V


Подробная информация о списке рассылки Devel