Лучшее экранирование строк для hg

Лучшее экранирование строк для hg

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

hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove

Это работает во многих случаях, но некоторые странные строки, такие как , recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdfзаставляют его ломаться. Кстати, hg говорит мне, что эти строки не являются "безопасными для Windows"... что бы это ни значило.

Может ли кто-нибудь придумать лучший способ удалить файлы, которые hg перечисляет как "!" или отсутствующие?

решение1

Я использую:

hg addremove

для этогопосле того, как я удалил весь хлам из извлеченного каталога(или после того, как я добавил шаблоны в .hgignoreфайл).
hg addremove -hсообщает вам:

Add all new files and remove all missing files from the repository.

Mercurial жалуется на *в имени файла. Это зарезервированный символ, который нельзя использовать в именах файлов в Windows. Однако само это сообщение идет stderrи не должно влиять на функционирование каналов.

Альтернативой является использование:

hg remove --after

который отмечает файлы, которые удаляются, но комментирует все файлы (как те, которые все еще там, так и те, которые удалены) и, похоже, не реагирует на опцию --quiet.

решение2

Когда xargsвидит \!\(\*-4.pdfв своем вводе, он понимает !(*-4.pdf. Если вы используете xargs, вам нужно создать ввод, который соответствует его синтаксису ввода, что не похоже ни на что другое. Простое добавление обратной косой черты перед пробелами справляется только с пробелами.

В Linux, *BSD и OSX xargsподдерживает опцию -0, которая сообщает ему, что нужно действовать с записями, разделенными нулевыми байтами без кавычек. hg status -0создает записи, разделенные нулевыми байтами. Остается только адаптировать промежуточную обработку для работы с нулями вместо новых строк в качестве разделителей.

С помощью GNU awk или любого другого awk, который поддерживает нулевые байты в качестве разделителей записей (я думаю, что BSD/OSX awk поддерживает), вы можете переключить свое преобразование на awk.

hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove

Связанный контент