![Melhor string escapando para hg](https://rvso.com/image/31684/Melhor%20string%20escapando%20para%20hg.png)
Então, periodicamente, eu removo arquivos listados como ausentes pelo sistema de controle de versão hg. O que notei é que esse script (reconhecidamente feio) que tenho não escapa corretamente das strings:
hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove
Funciona em muitos casos, mas algumas strings estranhas recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf
fazem com que ele quebre. Aliás, hg me disse que essas strings não são "seguras para Windows"...seja lá o que isso signifique.
Alguém pode descobrir uma maneira melhor de remover os arquivos da lista hg como "!" ou faltando?
Responder1
Eu uso:
hg addremove
por issodepois de remover qualquer lixo do diretório verificado(ou depois de adicionar padrões ao .hgignore
arquivo).
hg addremove -h
diz lhe:
Add all new files and remove all missing files from the repository.
Mercurial reclama do *
nome do arquivo. Que é um caractere reservado que não pode ser usado em nomes de arquivos no Windows. No entanto, essa mensagem em si vai stderr
e não deve afetar o funcionamento dos tubos.
Uma alternativa é usar:
hg remove --after
que marca os arquivos que foram removidos, mas comenta todos os arquivos (aqueles que ainda estão lá e também os removidos) e não parece reagir à --quiet
opção.
Responder2
Quando xargs
vê \!\(\*-4.pdf
em sua entrada, ele entende !(*-4.pdf
. Se você usar xargs
, precisará produzir uma entrada que corresponda à sua sintaxe de entrada, que é diferente de tudo que existe por aí. Apenas adicionar uma barra invertida antes dos espaços só funciona com espaços.
No Linux, *BSD e OSX, xargs
suporta a opção -0
, que informa para atuar em registros separados por bytes nulos sem aspas. hg status -0
produz registros separados por bytes nulos. O que resta é adaptar o processamento intermediário para lidar com nulos em vez de novas linhas como separadores.
Com o GNU awk ou qualquer outro awk que suporte bytes nulos como separadores de registros (acho que o awk do BSD/OSX suporta), você pode mudar sua transformação para awk.
hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove