Как поменять 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