Как получить список номеров последних версий для каждого файла в хранилище Mercurial? - PullRequest
7 голосов
/ 06 апреля 2010

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

hg log --template '{rev}\n' path-to-file

Выполнение hg для каждого файла действительно отнимает много времени. Существует ли быстрый способ перечисления всех файлов в хранилище с номером последней версии?

Ответы [ 3 ]

2 голосов
/ 06 апреля 2010

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

hg grep --all '.' | perl -na -F: -e 'next unless ($F[2] eq "+"); print "$F[0] $F[1]\n" unless ($prev eq $F[0]); $prev = $F[0]'

Пример:

that 3
file 1
2 голосов
/ 21 ноября 2012

Существует команда hg debug "hg debugdata -m REV", которая может вам помочь. Вот как это работает:

  1. Я фиксирую 3 файла a.txt / b.txt / c.txt в наборе изменений 0/1/2 / соответственно. И я изменяю a.txt в Rev 3. DAG выглядит так:

------- 0 -------> 1 --------> 2 -------> 3

a.txt b.txt c.txt a.txt

 So the newest rev for a/b/c should be 3/1/2;
  1. После этого записи журнала:

    рт.ст. -q

       3:31308f74291a
       2:8d438b01dfd4
       1:fcc0f041df56
       0:c53934933136
    
  2. a.txt имеет две версии, которые связаны с наборами изменений 0 и 3 соответственно. Для каждой версии a.txt Mercurial создаст для него уникальный хеш (nodeid). Эти nodeid относятся только к a.txt и отличаются от хеша changeset. Мы можем использовать другую команду отладки, чтобы увидеть, что это за версии:

    ~ / work / hg / a / .hg / store / data $ hg debugindex a.txt.i

rev     offset   length  base  linkrev   nodeid               p1            p2

 0         0       3      0     0        b789fdd96dc2    000000000000  000000000000
 1         3       6      1     3        a9ecbd92f818    b789fdd96dc2  000000000000

Мы можем видеть, что эти два "nodeid" (b789fdd96dc2 / a9ecbd92f818) соответствуют версии changeset (linkrev) 0/3 соответственно. Поскольку эти nodeid хэшируются на основе содержимого файла и родительской информации (p1 / p2), они являются «уникальными» в смысле хранилища. поэтому «b789fdd96dc2» идентифицирует a.txt@version-0, а a9ecbd92f818 идентифицирует a.txt@version-3.

  1. Наконец, давайте посмотрим, как работает "hg debugdata -m REV".

Эта команда выводит список "манифеста" версии REV. Манифест - это моментальный снимок каталога для всех файлов @ версии, существующих в конкретном наборе изменений REV. Давайте посмотрим, что такое манифест в версии 3:

~ / work / hg / a $ hg debugdata -m 3

a.txt^@a9ecbd92f8182efd8eeb5396468fd70884650395 b.txt^@1e88685f5ddec574a34c70af492f95b6debc8741 c.txt^@149da44f2a4e14f488b7bd4157945a9837408c00

Для a.txt вы можете видеть, что его nodeid - это "a9ecbd92f8182efd8eeb5396468fd70884650395", что соответствует короткому варианту nodeid, упомянутому на шаге 3. Такой nodeid должен хорошо служить вашему "URL перезаписи"

Теперь у вас есть текстовое имя и его идентификатор узла в ревизии 3. Для генерации всего, что вы хотите, требуется всего одна команда отладки. Я думаю, что это лучшее решение.

Если вас интересуют команды отладки, предоставляемые Mercurial, сделайте следующее:

hg debugcomplete debug (список всех команд отладки)

hg help debugdata

hg help debugindex


2 голосов
/ 06 апреля 2010

Кодирование такой команды в python путем синтаксического анализа hg annotate или расширения mercurial не должно быть слишком сложным. Следующее обсуждение списка рассылки mercurial, кажется, дает разумное решение, хотя я не пробовал его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...