Как поменять Mercurial Queues в репозитории и обратно

У меня есть платформенно-нейтральный ртутный код репо под названием "Симулятор"

и хотите применить исправления, предназначенные для оптимизации конкретной платформы, перед сборкой.

Согласно руководству, мы можем сделать это с помощью патчей с охраной.

  • Windows Experimental.patch + windows
  • Unix Experimental.patch + unix
  • Mac Experimental.patch + mac

Однако это начинает становиться громоздким, потому что наша очередь исправлений содержит более 100 патчей, названных как windows-memory-оптимизация.patch +windows, unix-memory-оптимизация.patch +unix, windows-io-экспериментальный-bug-fix.patch +windows, и т. д. и т. д. Мы организовали его как группы в файле серии, но файл становится огромным, а использование qseries / qapplied становится неуправляемым

Вместо этого мы хотели бы иметь очередь для Windows, Unix и Mac.

Так что патчи могут быть организованы как:

  • Стек исправлений Windows: memory-opt.patch, io-opt.patch и т. Д.
  • Стек исправлений Unix: disk.patch, graphics.patch и т. Д.
  • Пакет исправлений для Mac: io-fix.patch, io-opt.patch, экспериментальный. Патч и т. Д.

Затем поменяйте местами патчи для каждой платформы и из репозитория симулятора. Так что я могу работать со стеком патчей Windows и извлекать / выгружать различные патчи оптимизации подсистемы и работать с ними независимо от стеков патчей Unix или Mac.

Не похоже, что я могу это сделать, кроме как сделать 3 разных репозитория, специфичных для каждой платформы, и таким образом поддерживать патчи в стеке.

Есть ли способ, кроме ручного копирования каталога.hg/patches в репо и из него, выполнить "обмен" стеками патчей?

3 ответа

Решение

Интересное использование Mercurial Queues:)

Я предполагаю, что вы уже где-то управляете своими ртутными очередями. Если вы не / для тех, кто не знает, как это сделать, взгляните на соответствующий раздел hgbook: это отличный способ для постепенного сотрудничества / сохранения вашей работы без применения исправлений.

Три названные ветви

Должно быть возможно поддерживать три разных именованных ветви, по одной для каждой платформы, в вашем хранилище MQ.

Для переключения платформы просто переключите активную ветку.

alias mq='hg -R $(hg root)/.hg/patches')

Сначала создайте ветку windows:

$ mq branch windows
marked working directory as branch windows

создано, но еще не совершено.

Сделайте что-нибудь, добавьте патчи:

$ hg qnew windowspatch
... do some stuff

Обновите, поп и зафиксируйте:

$ hg qref
$ hg qpop -a
$ mq ci -m 'new windows branch'

Теперь у вас есть ветка по умолчанию и новая ветка windows:

$ mq branches
windows                       65:5fd4ef0b96c9
default                       64:06c1a56a3c08 (inactive)

Теперь создайте ветку Unix.

Сначала переключитесь на базовую ветку по умолчанию:

$ mq up default
1 files updated, 0 files merged, 1 files removed, 0 files unresolved

Создайте новую ветку Unix и добавьте специфический для Unix патч:

$ mq branch unix
marked working directory as branch unix
$ hg qnew unixpatch
... blahblah
$ hg qref
$ hg qpop -a
$ mq ci -m 'adding unix branch'
$ mq branches
unix                          66:c51bb2c7b413
windows                       65:5fd4ef0b96c9
default                       64:06c1a56a3c08 (inactive)

использование

Не забудь qpop -a прежде чем работать на репозитории MQ...

Нажмите на все окна патчи

$ mq up windows
xx files updated, yy files merged, zz files removed, ww files unresolved
$ hg qpush -a

Три физических репо

Поддержание трех отдельных ветвей (Mercurial Queue) может выглядеть немного страшно. Если это так, вы можете просто использовать три разных MQ-репозитория: по одному для каждой платформы, каждый из которых имеет свои версии в разных местах.

Например:

$ cd mqs
$ hg qclone mq-windows windows
$ hg qclone mq-unix unix
$ hg qclone mq-mac mac

Для работы на разных платформах просто переключайте папки (репо). Концепция похожа на первый подход. Но вместо трех внутренних веток в одном MQ-репо вы используете три отдельных MQ-репо.

Чтобы сделать эквивалентный псевдоним Windows для "mq", создайте пакетный файл в том же каталоге, что и "hg.exe" (например, "C:\Program Files\TortoiseHg"), назовите его "mq.cmd" и вставьте этот код:

@echo off
FOR /F "tokens=1 delims=" %%A in ('hg root') do SET hgRoot=%%A
hg -R %hgRoot%/.hg/patches %1 %2 %3 %4 %5 %6 %7 %8 %9

Я знаю, что этот вопрос старый, но может быть кому-то будет интересно узнать, что есть другое решение. Я думаю, что это было невозможно в то время, когда был задан вопрос, но здесь есть больше информации об этой ситуации: несколько очередей исправлений на MQ

Другие вопросы по тегам