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

Igor Vlasenko vlasenko на imath.kiev.ua
Ср Июн 18 02:59:05 MSK 2014


Господа,

переношу вопросы автоматизации работы с gear репозиториями,
которые обновляются из удаленнного VCS, в отдельную тему.

Здесь хотел бы обсудить, какие утилиты должны быть добавлены
извне к gear и какие изменения должны быть в самом gear сделаны,
чтобы сделать совместную работу с gear репозиториями,
которые обновляются из удаленнного VCS, 
1) удобной для стороннего человека
2) удобной для робота.

Постараюсь на примерах обрисовать проблему и то,
как должно выглядеть ее решение.

Итак, представим себя в роли члена qa на . Все майнтайнеры на море,
а в это время как раз обнаружена страшная увязвимость headbleed.
Апстримы оперативно выпустили исправления,
майнтайнеров нет, и нужно вместо них обновить их пакеты,
абсолютно чужие, т.е. их gear репозиторий будем видеть в
первый раз.

Что должно быть:
клонируем с git.alt: последнюю собранную версию.

запускаем волшебную команду gear-fetch.
волшебная команда gear-fetch (в gear)
* выкачивает обновление через git (и в идеале, может и git-svn)

над ней может быть моя волшебная надстройка (сакжем,
gear-vcs-update), которая
* (опционально) расставляет при необходимости теги в формате,
который вписан в .gear/rules (например, v на version@).
* (опционально) мержит обновления в ветки с патчами и в master,
вносит изменения в spec.

qa-инженеру остатется только просмотреть изменения и отправить пакет в Сизиф.

но и без волшебной надстройки после gear-fetch все тривиально:
руками мержим, руками add_changelog и послали в Сизиф.

Таперь приземлимся и посмотрим, на что, что есть.

клонируем репозиторий с git.alt и пытаемся руками проэмулировать
волшебную команду gear-fetch, поскольку она еще не существует.

и здесь нас ждет ряд засад. забудем о git-svn, то сплошной ужас.
для простоты пусть будет git. хотим сделать git fetch.

Засада1.  А откуда?

Эта информация есть локально у майнтайнера, но у нас она утеряна --
в нашем клоне репозитория информации о его remotes нет.
Майнтайнер в отпуске на море, слишком далеко, чтобы использовать телепатию.

Пока роемся по сайтам, приходим к выводу, что в репозитории
нужна запись, откуда делать git fetch.

И эта запись должна быть понятной для утилит.
к примеру, запись в спеке
# VCS: ...
может помочь для репозитория Андрея, а в остальных 9 из 10 случаев
означает только, что пакет был основан на Fedor'овском пакете. 
Возможно, роботом дернут, возможно, руками взят.

Т.е. нужен файл в недрах .gear,
.gear/upstream/откуда.

далее, * Засада2 *.

Узнали <Где>, можем написать git getch <Где>. 
но что брать?
git getch <Где> <что>.

Есть commit с исправлениями. и в master, и cherry-pick'ed в ветвях.
Пока думаем и гадаем, приходим к выводу, что нужна запись в недрах .gear,
.gear/upstream[что].

Альтернативно, можно подождать месяц, когда будет <релиз>, а с ним <тег>,
на который можно будет ориентироваться вместо удаленного бранча.

И тут же плавно проваливаемся в *Засаду 3*.

* Засада3 *. куда? 

напомню, полная команда имеет вид 
git fetch <Где> <что>:<куда>

> IV>> поэтому желательно иметь указание, в какие ветви что куда должно идти.
> AF> честно говоря не понял, зачем это ? вижу всё так-же как и в случае с
> тарболлом и исходниками в отдельном бранче. Ну совсем никакой разницы
> -просто вместо gear update будет git pull. остальные этапы точно такие-же.

Для некоторых репозиториев действительно прокатит,
назвать ее как-то устрашающе gearobersturmbannbranch
и сделать fetch в branch gearobersturmbannbranch:

git fetch <Где> <что>:gearobersturmbannbranch

но, во первых, не все .gear/rules основаны на tags,
к примеру, в virt-viewer
$ cat virt-viewer.git/.gear/rules
tar: upstream:.
и волшебная команда gear-fetch должна поддерживать
и такие rules.

Во вторых, для NMU с одноразовым репозиторием это еще 
прокатит, сделали NMU, а репозиторий выбросили.

Но волшебная команда gear-fetch должна быть
в первую очередь удобна для основного майнтайнера.
У него и так есть волшебная команда git fetch origin,
основанная на тайном знании remotes.
Если там записано, что fetch делается в ветку upstream,
то он делается в ветку upstream.

Приходим к выводу, что нужна запись в недрах .gear,
.gear/upstream[куда].

С ней волшебная команда gear-fetch отработает точно так, как 
git fetch origin.

Иначе она просто намусорит: за ней придется прибрать руками,
ветку upstream передвинуть руками, мусор gearobersturmbannbranch
удалить.

далее, ветка(ветки), записанные в .gear/upstream[куда],
должн(ы) отражаться и в .gear/tags.
т.е. gear-update-tag должна поддерживать .gear/upstream[куда],
т.е. записывать в .gear/tags/list текущие позиции этих 
ветвей, чтобы их можно было восстановить, просто
склонировав репозиторий с git.alt и запустив
волшебную команду gear-fetch.

Так я представляю функциональность базовой
волшебной команды gear-fetch.

Функциональность волшебных надстроек над gear-fetch
можно будет обсудить позже, обсуждение лучше начать
с базовых вещей.

-- 

I V


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