Que tal isso?
skipped_tests:
@! grep -E 'iit|ddescribe' spec/terminalSpec.js
Eu quero testar se o arquivo contém um padrão (testes de jasmim ignorados que devem fazer com que minha construção falhe, quando executado a travis).
Eu tenho código assim:
skipped_tests:
$(if $(shell grep -E 'iit|ddescribe' spec/terminalSpec.js), @false, @true)
o problema é que eu não recebo saída de grep
, quando ele encontra as linhas que correspondem ao padrão. Eu quero isso para que eu possa ver qual linha causou o problema no log de construção travis. Existe uma maneira de reverter um código de erro de comando (retornar 0 quando não 0 é retornado e vice-versa)?
Eu também tentei isso:
skipped_tests:
grep -E 'iit|ddescribe' spec/terminalSpec.js
@test $$? -eq 0 # should it be -ne
mas isto ecoa uma linha que tem iit
e não falha, e se não encontrar a linha, então falha no grep.
Eu resolvi o problema ligando para o grep duas vezes
skipped_tests:
@grep -E 'iit|ddescribe' spec/terminalSpec.js || true
$(if $(shell grep -E 'iit|ddescribe' spec/terminalSpec.js), @false, @true)
existe uma maneira melhor?
Eu tentei algumas outras coisas, mas parece que o make está operando em strings (use str.replace no Makefile ou algo assim) porque se a saída do grep é uma linha de código-fonte, dá erro de sintaxe de outras possíveis soluções.
Possível solução:
Defina a variável na parte superior de Makefile
e use ifeq
. Por exemplo:
RESULT = $(shell grep ... 2>/dev/null && echo 0 || echo 1)
. . .
skipped_tests:
ifeq ($(RESULT),0)
. . .
endif
Mas o grep
será executado em todas as chamadas de make
, mesmo que o skipped_tests não esteja chamando. Se esse alvo for chamado toda vez, então também é solução.
Considerando seus desejos. Se você quiser usar grep
result no destino várias vezes, poderá usar a expressão multilinha. Suponha que eu tenha o próximo Makefile
:
all: target
target:
@res='grep -E 'test|pttern' test.js' || { res="" ; : ; } ; \
[ ! -z "$$res" ] && echo "Grep result: $$res" ; \
ls ; \
[ ! -z "$$res" ] && echo "Grep result: $$res" ; \
:
.PHONY: target
e eu tenho o próximo test.js
no mesmo diretório:
$ cat test.js
pattern
Se o padrão não for compatível, haverá o próximo resultado:
$ make
Makefile test.js
Se o padrão existir, haverá o próximo resultado:
$ make
Grep result: pattern
Makefile test.js
Grep result: pattern
Para facilitar a leitura, você pode alterar ''
com res=$$(grep -E ...) || ...
.
É claro que não é muito conveniente fazer comandos multilinha em uma chamada ao sistema (essa multilinha é uma sessão do intérprete), mas às vezes pode ser útil nos casos em que você precisa operar uma variável (também variável de ambiente).
Tags grep make return-status