Melhor string escapando para hg

Melhor string escapando para hg

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.pdffazem 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 .hgignorearquivo).
hg addremove -hdiz 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 stderre 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 à --quietopção.

Responder2

Quando xargs\!\(\*-4.pdfem 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, xargssuporta a opção -0, que informa para atuar em registros separados por bytes nulos sem aspas. hg status -0produz 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

informação relacionada