Stow não usa a opção “ignorar” dada no arquivo rc

3

Resumo

--ignore=<regex> linhas que eu coloquei no meu .stowrc não funciona. Ao executar o Stow, ele diz "Carregando padrões de .stowrc", mas não tem efeito. Mas passar as linhas --ignore=<regex> para o comando funciona diretamente.

Problema

Assuma este diretório:

user@user-machine:~/test-stow/stow$ tree -a
.
├── a
│   └── car
└── .stowrc

1 directory, 2 files

Conteúdo de ./.stowrc :

--ignore='car'

Portanto, minha expectativa é que executar o comando stow --verbose=3 a/ nesse diretório seja equivalente a executar stow --ignore='car' --verbose=3 a/ se o arquivo ./.stowrc não estivesse lá.

Agora corro:

user@user-machine:~/test-stow/stow$ stow --verbose=3 a
Loading defaults from .stowrc
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package a...
Stowing contents of stow/a (cwd=~/test-stow)
Stowing stow/a/car
LINK: car => stow/a/car
Planning stow of package a... done
cwd restored to /home/user/test-stow/stow
Processing tasks...
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
Processing tasks... done

Observe que isso faz criar o link simbólico para ./car , apesar da linha ignore em ./.stowrc .

Agora eu desfaz a operação executando stow -D --verbose=3 a/ :

user@user-machine:~/test-stow/stow$ stow -D --verbose=3 a/
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
Planning unstow of package a...
Unstowing from . (cwd=~/test-stow, stow dir=stow)
Unstowing stow/a/car
car did not exist to be unstowed
Planning unstow of package a... done
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
Processing tasks...

Se eu excluir tudo em ./.stowrc e executar stow --verbose=3 --ignore='car' a/ , obtenho um resultado diferente:

user@user-machine:~/test-stow/stow$ stow --verbose=3 --ignore='car' a/
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package a...
Stowing contents of stow/a (cwd=~/test-stow)
Planning stow of package a... done
cwd restored to /home/user/test-stow/stow
Processing tasks...

Agora, um link simbólico para ./car foi não criado, conforme esperado e desejado.

Que tal $HOME/.stowrc ?

Colocar o arquivo .stowrc no diretório inicial em vez de $HOME/test-stow/stow tem o mesmo efeito; um symlink para o arquivo car ainda é feito.

Ignorar listas

Ter um arquivo $HOME/test-stow/stow/.stow-local-ignore com o conteúdo "carro" em vez do arquivo .stowrc também não funciona. O link simbólico para o arquivo chamado car ainda é criado.

Versão do GNU Stow : 2.2.0
Versão do Perl : perl 5, versão 18

Atualizar

Aqui está minha resposta à resposta de Adam Spiers.

    
por Guildenstern 21.08.2016 / 19:54

1 resposta

1

Obrigado pelo excelente relatório de erros! Eu posso responder às suas perguntas, e como o mantenedor do Stow, eu também posso consertar os problemas, mas eu apreciaria seu feedback de uma perspectiva de UX para que possamos descobrir a melhor solução.

Primeiramente, vale a pena notar que --verbose=5 lhe dará muito mais detalhes sobre o funcionamento do mecanismo de ignorar, embora neste caso não seja suficiente explicar por que as coisas não estão se comportando da maneira esperada.

Existem dois motivos pelos quais nenhum dos seus arquivos .stowrc funcionou:

  1. O .stowrc parser divide pares (opção, valor) com base no caractere de espaço, não em = . Portanto, uma linha para uma opção de ignorar nesse arquivo deve iniciar --ignore não --ignore= .
  2. O analisador .stowrc não tira aspas automaticamente. Quando a opção --ignore (ou qualquer outra opção) for passada pela CLI, o shell removerá as aspas antes que Stow as visualize. É por isso que funciona lá.

Portanto, a combinação desses dois significa que seu .stowrc deve conter:

--ignore car

Eu testei isso e, de fato, funciona.

Agora, provavelmente existem argumentos válidos dizendo que um ou ambos os pontos são realmente erros de UX. Eu certamente concordo que eles não fornecem uma interface intuitiva. A questão é se o comportamento deve ser alterado ou se é melhor simplesmente esclarecer isso nos documentos.

Meu pensamento atual é baseado na Lei de Postel , o analisador deve aceitar divisão no espaço e = , mas não deve retirar aspas porque e se o usuário realmente quisesse ignorar 'car' em vez de apenas car ? Além disso, há um relatório de erros existente e relacionado que as opções com espaços quebram em stowrc

Eu gostaria de receber suas opiniões sobre isso.

Por fim, acredito que seu .stow-local-ignore não funcionou porque você o colocou no diretório stow em vez de no diretório a/ package. A documentação sobre isso parece clara para mim, então eu acho que é justo escrever isso como erro do piloto. No entanto, se você tiver alguma sugestão sobre como tornar os documentos mais claros do que eu sou todo ouvidos.

Obrigado novamente! BTW no futuro você pode querer considerar o envio de relatórios de erros para a lista de discussão bug-stow (ou para < href="http://savannah.gnu.org/bugs/?group=stow"> o rastreador de bug do Savannah horrível, mas eticamente correto ou para o menos ético, mas mais utilizável no rastreador de problemas do github ) e pedidos de ajuda para o help-stow mailing list . Sim, sei que essas são opções demais para um projeto tão pequeno e silencioso; isso é um TODO para outro dia ...

    
por 23.08.2016 / 12:04

Tags