Como inverter o código de erro no Makefile

2

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.

    
por jcubic 28.05.2018 / 18:57

3 respostas

2

Que tal isso?

skipped_tests:
    @! grep -E 'iit|ddescribe' spec/terminalSpec.js
    
por 28.05.2018 / 20:21
0

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.

    
por 28.05.2018 / 19:34
0

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).

    
por 28.05.2018 / 19:38