Melhor string escapando por hg

1

Então, periodicamente, eu removo os arquivos que estão listados como ausentes pelo sistema de controle de versão hg. O que eu notei é que esse script (reconhecidamente feio) que eu tenho não escapa corretamente de strings:

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

Funciona em muitos casos, mas algumas strings estranhas como recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf fazem com que ele quebre. Aliás hg me diz que essas seqüências de caracteres não são "Windows safe" ... o que diabos isso significa.

Alguém pode trabalhar uma maneira melhor para remover os arquivos hg listas como "!" ou faltando?

    
por speciousfool 05.05.2013 / 12:57

2 respostas

2

Eu uso:

hg addremove

para isso depois que eu removi qualquer sujeira do diretório de check-out (ou depois que adicionei padrões ao arquivo .hgignore ).
hg addremove -h diz a você:

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

O Mercurial reclama do * no nome do arquivo. Qual é um caractere reservado que não pode ser usado em nomes de arquivos no Windows. No entanto, essa mensagem em si vai para stderr e não deve afetar o funcionamento dos pipes.

Uma alternativa é usar:

hg remove --after

que marca os arquivos removidos, mas com comentários sobre todos os arquivos (aqueles que ainda estão lá e os removidos) e não parece reagir à opção --quiet .

    
por 05.05.2013 / 14:43
1

Quando xargs\!\(\*-4.pdf em sua entrada, entende !(*-4.pdf . Se você usar xargs , precisará produzir uma entrada que corresponda à sua sintaxe de entrada, o que é diferente de qualquer outra coisa lá fora. Apenas adicionando uma barra invertida antes dos espaços apenas lidarem com espaços.

No Linux, * BSD e OSX, xargs suporta a opção -0 , que diz para atuar em registros separados por bytes nulos sem citar. hg status -0 produz registros separados por bytes nulos. O que resta é processar 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), você pode mudar sua transformação para o awk.

hg status -0 |
awk -v RS='
hg status -0 |
awk -v RS='%pre%' -v ORS='%pre%' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove
' -v ORS='%pre%' '/^!/ {print substr($0, 3)}' | xargs -0 hg remove
    
por 06.05.2013 / 01:29