Создание временной названной ветви в Mercurial, затем удаление ее из существования - PullRequest
2 голосов
/ 17 ноября 2011

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

Начиная с v6.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, в итоге все оказалось очень просто. К сожалению, я не знаю, как отменить это изменение:)

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

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

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

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

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

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

1 голос
/ 22 ноября 2011

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

hg rebase -s B -d A --detach

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

[extensions]
rebase = 

РЕДАКТИРОВАТЬ: Кажется, я ответил на другой вопрос (как удалить локальную ветку)).Чтобы создать новую именованную ветвь и импортировать в нее ревизии 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
...