Mercurial: проверить, содержит ли ветвь набор изменений

Интересно, есть ли команда или расширение mercurial, которая просто проверяет, находится ли данный набор изменений в ветке. Команда будет выглядеть примерно так:

hg contains [-r branch] changeset_id

и должен проверить, находится ли данный набор изменений в текущей/заданной ветке, возвращая только "Да" или "Нет".

Я знаю о команде "debugancestor", но ответ "Да/Нет" легче читать.

И если есть, можно ли также проверять наличие пересаженных наборов изменений?

EDIT: сценарий расположен в репо, где названные ветки имеют несколько глав. Допустим, что ветвь называется "dev-X" , имеющая более 1 главы и более длинную историю, слишком долго, чтобы отслеживать ее с помощью различных графических визуализаций. Я хочу выяснить, был ли набор изменений X в ветке "dev-X" объединен с другим главой "dev-X" . Поэтому я не могу использовать имена ветвей, но только номера наборов изменений/хэшей для указания ветки.

И, прежде всего, я пытаюсь выяснить, был ли там пересажен набор изменений X, возможно, взяв более 1 шаг трансплантации. Я знаю, что необходимая информация хранится в mercurial (я видел ее при вмешательстве в меркуриальную внутренность), она просто недоступна через интерфейс командной строки.

Ответ 2

Как насчет этого:

hg log -r changeset_id -b branchname

Это даст некоторый вывод, если changeid_id содержит изменения в ветке branchname, в противном случае вывод не возвращается.

Вы можете обернуть его в bash, если хотите:

function contains() {
    if [ "$(hg log -r $1 -b $2)" == "" ]
    then
        echo no
    else
        echo yes
    fi
}

который делает это:

$ contains 0 default
yes
$ contains 0 other   
no

Ответ 3

с использованием 1.6 и более поздних версий с возможностями набора ревизий все, что вам нужно, это

hg log --rev "ancestors(.) and <revNum>"

например,

hg log --rev "ancestors(.) and 1234"

blank означает нет, выход означает "да", это в вашей истории. Некоторые из других решений, размещенных здесь, не будут работать, если набор изменений был создан в именованной ветке, даже если он был позже скомпонован.

Ответ 4

Довольно легко преобразовать результаты debugancestor в да или нет (но там определенно нет встроенного способа сделать это, напишите script уже!). Имейте в виду, что ответ может быть неправильным, если ветка имеет более одной ветки головки.

(Написание расширения для добавления команды для этого также должно быть почти тривиальным, BTW.)

Ответ 5

Вы всегда можете просто распечатать имя ветки для этой версии (оно будет пустым, если оно по умолчанию), а затем проверить это на все, что вы хотите (в bash или на каком-то языке скриптов):

hg log --template '{branches}' -r <revision name/number>

Ответ 6

Я тестировал большинство вышеперечисленных подходов, не работал. Расширение "содержит" каким-то образом принимает неверную ревизию (я думаю, что это ошибка), hg log --rev "предки (.) И 1234" работают, но я нашел еще более простой подход для этого:

hg merge -P <changeset>

Покажет вам, останется ли что-нибудь несвязанное (оно также будет включать в себя изменения, которые не объединены родителями соответствующего набора изменений)