Создание временной именованной ветки в Mercurial, а затем удаление ее из существования

Я обдумываю идею добавления возможности «удаленного запуска (персональная сборка) для Mercurial» в плагине TeamCity Visual Stuio.

Начиная с версии 6.5, TeamCity поддерживает «триггер ветки удаленного запуска», когда при нажатии именованной ветки, соответствующей триггеру в TeamCity, TeamCity запустит личную сборку этой ветки.

Идея состоит в том, чтобы взять текущие исходящие наборы изменений из текущей ветки (скажем, default) и переместить их во временную именованную ветку с именем remote-run. Затем это передается в CI, поэтому персональная сборка запускается, и, если персональная сборка прошла успешно, изменения переносятся обратно в исходную ветку, а ветка remote-run удаляется.

У меня есть несколько вопросов по этому поводу:

  1. Это вообще имеет смысл?
  2. Какое расширение я должен использовать для этого? Я считаю, что MqExtension делает все, что мне нужно, но есть ли альтернативы?
  3. Что произойдет, если пользователь внесет дополнительные изменения во время удаленного запуска? Как наборы изменений «временной ветки» сливаются обратно в исходную ветку?

Сценарий, на который я сейчас ориентируюсь, выглядит следующим образом: при работе с веткой по умолчанию пользователь добавляет 3 новые ревизии. Затем он хочет запустить эти изменения как личную сборку в TeamCity, но забыл зафиксировать эти изменения в ветке со специальным именем. Вместо этого моя надстройка возьмет эти исходящие изменения и поместит их в именованную ветку. После успешного завершения личной сборки эти изменения помещаются обратно в исходную (по умолчанию) ветку и отправляются в удаленный репозиторий.

Что-то вроде этого:

[default] A---B---C---D

Предполагая, что B, C и D являются новыми версиями, я хочу, чтобы инструмент выполнял:

[default] A
           \
            [remote-run] B---C---D

И после того, как это будет сделано, верните его в исходное состояние, т.е.:

[default] A---B---C---D

EDIT: мне удалось перенести изменения в другую ветку с помощью Mq, это оказалось очень просто. К сожалению, я понятия не имею, как отменить это изменение :)

Надеюсь, это имеет смысл!


person Igal Tabachnik    schedule 17.11.2011    source источник


Ответы (2)


Это именно то, для чего нужна команда «hg rebase». В вашем случае используйте

hg rebase -s B -d A --detach

Убедитесь, что вы используете последнюю версию (последняя ночная сборка). Недавно была исправлена ​​ошибка, которая может повлиять на указанную ситуацию. Кроме того, для этого должно быть включено расширение «rebase». Убедитесь, что в файле ~/.hgrc (или mercurial.ini) есть следующая строка:

[extensions]
rebase = 

EDIT: Кажется, я ответил на противоположный вопрос (как удалить локальную ветку). Чтобы создать новую именованную ветку и импортировать в нее ревизии B,C,D, вам потребуется следующая последовательность команд:

hg qimport -r tip:B       #Revisions B,C,D will be imported into mq
                          #(here B is revision id of the "B" commit)
hg qpop --all             #Unapply all patches
hg branch remote-run      #Create a new branch
hg qpush --all            #Push patches into the new branch
hg qfinish -a             #Transform applied patches to regular commits
person Ruslan Yushchenko    schedule 22.11.2011
comment
Примечания: 1. hg branch -f необходимо использовать для 2-го и последующих запусков. 2. Я не уверен, что просто qpush создаст настоящую ветку - person Lazy Badger; 23.11.2011

Вы можете сделать так, чтобы TeamCity пометила ваш корень VCS после успешной сборки. Может быть, не имеет смысла просто помечать каждую успешную сборку по умолчанию, без отдельной ветки?

В противном случае я не уверен в мотивах вашей миссии, какой конкретный рабочий процесс вы хотите извлечь выгоду?

Что касается пункта 3, то нет никакого способа гарантировать автоматическое слияние со значением по умолчанию. Если есть конфликты слияния, любой командный сценарий, который вы поместите в свою конфигурацию сборки для «личной сборки», потребует, чтобы он держал вас за руку, чтобы вернуть вас в стабильное состояние - не особенно «CI».

Извините, я не могу помочь больше на первом проходе.

person Alex Norcliffe    schedule 17.11.2011