Команда Mercurial для определения файлов, которые соответствуют спецификациям файлов и изменились с момента последнего обновления - PullRequest
1 голос
/ 12 мая 2011

В идеале я ищу способ сделать это без сохранения состояния, поскольку я использую командный файл.

Сценарий состоит в том, что у меня есть хранилище на сервере, который получает запросы от пользователей. Репозиторий также является рабочей копией, которая является источником для вики-страниц (dokuwiki), которые представляют собой просто текстовые файлы в репозитории, по одному на каждую страницу вики.

Поскольку он находится на веб-сервере, рабочая копия никем не используется в интерактивном режиме. Скорее, пакетный файл запускается периодически и выдает соответствующие команды для обновления рабочей копии с последними изменениями, которые были переданы в репозиторий. Как примечание к реализации, он также принимает изменения рабочей копии из вики и пытается объединить и зафиксировать их одним и тем же ходом.

Пакетный файл выглядит так:

@echo off
cd \dokuwiki\data\directory
start /wait cmd.exe /c hg update
start /wait cmd.exe /c hg resolve -m -a
start /wait cmd.exe /c hg resolve -a
start /wait cmd.exe /c hg commit -A -m "Automated commit"
for /r %%x in (*.jpg *.png *.gif) do copy /y "%%x" ..\..\media\directory

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

Обратите внимание, что я не заинтересован в улучшении скрипта до этого момента. Это проверено как наш желаемый способ обновления в этой среде.

Проблема с копией в конце заключается в том, что она копирует все графические объекты независимо от того, изменились они или нет. Очевидно, что было бы лучше копировать только графики, которые изменились. Поскольку со времени последнего обновления в этот репозиторий могло быть несколько нажатий, я хочу идентифицировать и скопировать только те графические объекты, которые изменились с момента последнего обновления этой рабочей копии, то есть в последний раз, когда этот скрипт выполнялся hg update.

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

Ответы [ 2 ]

4 голосов
/ 12 мая 2011

Я понятия не имею о синтаксисе пакетных файлов Windows, но, вероятно, вы ищете hg status --rev REV Mercurial:

@echo off
cd \dokuwiki\data\directory

ORIG_REV = hg log --rev . --template="{node}"

start /wait cmd.exe /c hg update
start /wait cmd.exe /c hg resolve -m -a
start /wait cmd.exe /c hg resolve -a
start /wait cmd.exe /c hg commit -A -m "Automated commit"

CHANGED_FILES = hg status --no-status --added --modified --rev ORIG_REV -I '*.jpg' -I '*.png' -I '*.gif'

for /r %%x in (CHANGED_FILES) do copy /y "%%x" ..\..\media\directory
0 голосов
/ 12 мая 2011

Возможно, вам удастся обойтись без использования xcopy и его переключателя /D, который копирует только исходные файлы, более новые, чем файлы в месте назначения.

...