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

Я ищу команду, которая выведет список последовательных исправлений, которые применялись бы корректно, если бы репозиторий находился в определенном ранее известном состоянии. Вот hg glog репозитория, который содержит некоторые проблемы, с которыми я столкнулся (также доступен на https://bitbucket.org/dusty/funny_repo/, если вы хотите поиграть с ним в свой собственный клон):

@  changeset:   8:ffd749c92f3b
|  tag:         tip
|  summary:     h
|
o    changeset:   7:bc959885f6aa
|\   parent:      6:dfe021fa52a4
| |  parent:      5:4d8bc738f0ab
| |  summary:     MERGE
| |
| o  changeset:   6:dfe021fa52a4
| |  parent:      3:1374ea53e7b7
| |  summary:     e
| |
o |  changeset:   5:4d8bc738f0ab
| |  branch:      branch2
| |  summary:     g
| |
o |  changeset:   4:e46fa4632d36
|/   branch:      branch2
|    summary:     f
|
o  changeset:   3:1374ea53e7b7
|  summary:     d
|
o  changeset:   2:59712a781f0c
|  branch:      branch1
|  summary:     c
|
o  changeset:   1:ff7f8724ad17
|  branch:      branch1
|  summary:     b
|
o  changeset:   0:a3b3a87aa422
   summary:     a

По сути, я хочу знать, какой набор изменений передать hg export, чтобы вывести наборы изменений 0, 1, 2, 3, 6, 7 и 8. Мне не нужны наборы изменений 4 и 5, потому что «эффект» этих наборов изменений применяется в коммите слияния в наборе изменений 6.

ancestors(default) выводит все наборы изменений, но branch('default') игнорирует наборы изменений 1 и 2, которые, хотя и находятся в другой ветке, необходимы для корректного применения исправлений.

Очевидно, что для этого случая я мог бы использовать hg log -r "0..default and not branch(branch2)", но я ищу более общий набор команд, который будет работать во всех случаях.

Для тестирования я использую команду hg export -r "0..default and not branch(branch2)" -o ../%R.patch и следующий цикл for для применения полученных патчей:

cd ../
mkdir patched
cd patched
for n in ../*.patch ; do
    patch -p1 <$n
done

person Dusty Phillips    schedule 18.12.2012    source источник
comment
Вам нужно, чтобы патчи применялись отдельно? Или вы могли бы экспортировать один патч, показывающий совокупные различия между первым и последним набором изменений?   -  person icabod    schedule 18.12.2012
comment
Я бы хотел, чтобы они были перечислены отдельно. Я уже знаю, как получить разницу между любыми двумя состояниями репо.   -  person Dusty Phillips    schedule 18.12.2012
comment
У меня была игра, и я не могу найти способ, который работал бы, кроме как специально исключить branch2. Проблема, которую я вижу, заключается в том, что если бы вы могли найти решение (всегда выбирая ветку default), оно бы не сработало, если бы у вас было две безымянных ветки, что весьма вероятно (вероятно, больше, чем именованные ветки, в зависимости от вашего рабочий процесс?). В этих случаях вы хотели бы выбрать ветку default, но это может быть и то, и другое.   -  person icabod    schedule 19.12.2012


Ответы (1)


Более общая попытка:

  • по-прежнему требуется одна предварительная проверка вручную и настройка;
  • будет работать только с относительно новым Mercurial, где p(1|2) функции добавлены в revsets

Предварительная проверка: для репозитория с набором слияний вы должны определить, какую родительскую строку набора слияния вы хотите использовать, p1(MERGESET) и p2(MERGESET) покажут «Кто есть кто»; и помните revsion на mergeset. Для вас тест-кейс

hg log -r "p1(7)"
changeset:   6:dfe021fa52a4
parent:      3:1374ea53e7b7
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:54:01 2012 -0700
summary:     e

hg log -r "p2(7)"
changeset:   5:4d8bc738f0ab
branch:      branch2
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:53:55 2012 -0700
summary:     g

и просто обратите внимание: линия p1 должна выжить.

  • Исключение чего-то - это "x - y" (или "x и ! y", но первая форма просто читаема)

  • x в нашем случае это полная история

(0:tip),

y - все непрямые родственники p1(7)

! (ancestors(p1(7)) | descendants(p1(7)))

  • Окончательный revset становится "0:tip - ! (ancestors(p1(7)) | descendants(p1(7)))"

Тестовый запуск revset в вашем репозитории

hg log -r "0:tip - ! (ancestors(p1(7)) | descendants(p1(7)))"
changeset:   0:a3b3a87aa422
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:51:43 2012 -0700
summary:     a

changeset:   1:ff7f8724ad17
branch:      branch1
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:52:25 2012 -0700
summary:     b

changeset:   2:59712a781f0c
branch:      branch1
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:52:27 2012 -0700
summary:     c

changeset:   3:1374ea53e7b7
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:52:36 2012 -0700
summary:     d

changeset:   6:dfe021fa52a4
parent:      3:1374ea53e7b7
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:54:01 2012 -0700
summary:     e

changeset:   7:bc959885f6aa
parent:      6:dfe021fa52a4
parent:      5:4d8bc738f0ab
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:54:20 2012 -0700
summary:     MERGE

changeset:   8:ffd749c92f3b
tag:         tip
user:        Dusty Phillips <[email protected]>
date:        Mon Dec 17 17:54:25 2012 -0700
summary:     h

Окончательное редактирование

Вспоминаю уроки формальной логики: у меня двойное отрицание в выражении "x - !SET" (в x, а не в not set) есть просто SET. Очищенный revset простой и чистый

"ancestors(p1(7)) | descendants(p1(7))"

(изначально он также завершал | p1(7), но теперь /Mercurial Distributed SCM (version 2.4.2)/, по непонятным мне причинам, набор изменений является предком и потомком самого себя: hg log -r "ancestors(p1(7)) & descendants(p1(7))" возвращает набор изменений 6)

person Lazy Badger    schedule 11.01.2013