2010-06-18 7 views
2

У меня есть проект, где я вынужден использовать ftp как средство для развертывания файлов на реальном сервере. Я развиваюсь на Linux, поэтому я взломал сценарий bash, который создает резервную копию содержимого сервера ftp, удаляет все файлы на ftp и загружает все свежие файлы из ртутного хранилища. (и позаботиться о загруженных пользователем файлах и папках, а также о внесении изменений после развертывания и т. Д.)Инкрементное развертывание из сценария оболочки

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

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

Я использую mercurial как VCS, поэтому моя идея - как-то запросить измененные файлы между двумя ревизиями, перебрать измененные файлы, и загрузить каждую измененную файл и удалить каждый удаленный файл.

Я могу использовать hg log -vr rev1:rev2, и с выхода я могу вырезать измененные файлы с помощью grep/sed/etc.

две проблемы:

Я слышал страшные истории, которые разборе вывод логинсервера приводит к безумию, поэтому я думаю, что то же самое относится и к здесь, если я пытаюсь разобрать вывод hg log, то переменные будут претерпевать расщепление слов и всевозможные преобразования.

hg log не сообщает мне, что файл изменен/добавлен/удален. Дифференциация между измененными и удаленными файлами будет наименьшей.

Итак, каков был бы правильный способ сделать это? Я использую yafc как ftp-клиент, если он нужен, но готов переключиться.

+0

rq имеет ваш ответ ниже, используя 'hg status' (not log). Не беспокойтесь о разборе вывода с помощью mercurial - авторы очень осторожны в изменении вывода команд с версии на версию. Это было я, я бы не стал отказываться от собственного инкрементного обновления. Просто отправьте все в новый каталог на сервере и переименуйте новое временное имя поверх старого, видимого в Интернете. –

ответ

3

Вы можете использовать пользовательский стиль, который выполняет синтаксический анализ для вас.

hg log --rev rev1:rev2 --style mystyle 

Затем труба это sort -u, чтобы получить уникальный список файлов. Файл «mystyle» будет выглядеть так:

changeset = '{file_mods}{file_adds}\n' 
file_mod = '{file_mod}\n' 
file_add = '{file_add}\n' 

Моды и добавления шаблонов являются файлами, которые были изменены или добавлены. Существует аналогичный file_dels и file_del шаблон для удаленных файлов.

В качестве альтернативы, вы можете использовать hg status -ma --rev rev1-1:rev2 который добавляет M или A перед модифицирована/добавлены файлы. Вам нужно передать другой диапазон изменений, на один меньше, чем rev1, так как это статус с этого «базового уровня». Удаленные файлы схожи - вам нужен флаг -d, а перед каждым удаленным файлом добавляется D.

+1

Ваше решение о статусе hg намного лучше, поскольку оно объединяет списки из всех наборов изменений в диапазоне, а не перечисляет их отдельно. –

+0

Но если я использую вывод hg st, те же проблемы не возникнут? Как смотреть на пробелы в именах файлов? –

+0

'hg st -ma --rev a: b | cut -c3- | при чтении файла; делать вещи с «$ file»; done' не даст вам проблем с пробелами в именах файлов, поскольку вы не раскалываетесь на пробелы, только на новых линиях. – richq

Смежные вопросы