sudo: false

language: c

stages:
    -   name: test

    -   name: build
        # Don't run build stage for pull requests to save time and resources.
        if: type != pull_request


jobs:
    include:
        # Build with gcc and run tests on Ubuntu.
        -   &test-ubuntu
            stage: test
            os: linux
            compiler: gcc
            python: 3.6

            addons:
                apt:
                    packages:
                        - valgrind
                        - bison
                        - automake

            before_install:
                - uname -s
                - pyenv install -s 3.6.7
                - rm src/{lexer,parser}.{c,h}
                - sed -i.bak '/^AM_INIT_AUTOMAKE(\[-Wno-portability 1\.14\])$/s/14/11/' modules/oniguruma/configure.ac

            install:
                - pyenv global 3.6.7
                - pip3 install pipenv
                - pushd docs && pipenv sync && popd
                - wget http://ftp.debian.org/debian/pool/main/b/bison/bison_3.0.2.dfsg-2_amd64.deb
                - ar p bison_3.0.2.dfsg-2_amd64.deb data.tar.xz | tar xJ
                - if [ -n "$COVERAGE" ]; then pip install --user cpp-coveralls; fi

            before_script:
                # If this is OS X we'll get bison from brew, else we'll get bison
                # from the .deb unpacked above in the install section.
                - PATH=/usr/local/opt/bison/bin:$PWD/usr/bin:$PATH
                - echo SHELL=$SHELL
                - echo PATH=$PATH
                - which bison
                - bison --version
                - autoreconf -if
                - ./configure --with-oniguruma=builtin YACC="$(which bison) -y" $COVERAGE

            script:
                # When using the bison from Debian we need to tell that bison where
                # to find its data.  Yay non-relocatable code.  Not.
                - echo PATH=$PATH
                - which bison
                - make BISON_PKGDATADIR=$PWD/usr/share/bison src/parser.c || make src/parser.c
                # Make dist!
                #
                # Make it first to fail the build early, before we test with
                # valgrind.
                - make dist
                # Build and test the dist (without valgrind)
                - |
                    (
                    tar xvf jq-`scripts/version`.tar.gz &&
                    cd jq-`scripts/version` &&
                    pwd &&
                    ./configure --disable-valgrind --with-oniguruma=builtin YACC="$(which bison) -y" $COVERAGE &&
                    make BISON_PKGDATADIR=$PWD/usr/share/bison src/parser.c || make src/parser.c &&
                    make -j4 &&
                    make check -j4 || true
                    )
                # Build and test the HEAD
                - make -j4
                - make check -j4

            after_failure:
                - cat test-suite.log
                - cat tests/*.log


        # Build with clang and run tests on Ubuntu.
        -   <<: *test-ubuntu
            compiler: clang


        # Build with gcc and run tests with gcov on Ubuntu.
        -   <<: *test-ubuntu
            env: COVERAGE="--disable-valgrind --enable-gcov"

            after_script:
                - rm -rf src/.libs # don't care about coverage for libjq
                - coveralls --gcov-options '\-lp'
                    -e src/lexer.c -e src/parser.c -e src/jv_dtoa.c


        # Build with gcc and run tests on macOS.
        -   &test-osx
            <<: *test-ubuntu
            os: osx

            before_install:
                - uname -s
                - brew update
                - brew install flex bison
                - brew upgrade pyenv
                - pyenv install -s 3.6.7
                - rm src/{lexer,parser}.{c,h}
                - sed -i.bak '/^AM_INIT_AUTOMAKE(\[-Wno-portability 1\.14\])$/s/14/11/' modules/oniguruma/configure.ac

            install:
                - pyenv global 3.6.7
                - pip3 install pipenv
                - pushd docs && pipenv sync && popd
                - if [ -n "$COVERAGE" ]; then pip install --user cpp-coveralls; fi


        # Build with clang and run tests on macOS.
        -   <<: *test-osx
            compiler: clang


        # Build with gcc and run tests on Alpine Linux v3.7 (inside chroot).
        # Note: Alpine uses musl libc.
        -   &test-alpine
            stage: test
            os: linux
            language: minimal
            compiler: gcc
            sudo: true

            before_install:
                - "wget 'https://raw.githubusercontent.com/alpinelinux/alpine-chroot-install/v0.7.0/alpine-chroot-install' \
                    && echo '090d323d887ef3a2fd4e752428553f22a52b87bb  alpine-chroot-install' | sha1sum -c || travis_terminate 1"
                - alpine() { /alpine/enter-chroot -u "$USER" "$@"; }

            install:
                - sudo sh alpine-chroot-install -b v3.7 -a "$ARCH"
                    -p 'build-base automake autoconf bison git libtool oniguruma-dev python3 python3-dev libxml2-dev libxslt-dev'
                - /alpine/enter-chroot pip3 install pipenv
                - alpine sh -c 'cd docs && pipenv sync'

            before_script:
                - autoreconf -if

            script:
                - alpine ./configure --disable-docs
                - alpine make
                - alpine make check

            after_failure:
                - cat test-suite.log
                - cat tests/*.log

        # Build release binary statically linked with musl libc on Alpine Linux
        # (inside chroot). If building a tagged commit, then deploy release
        # tarball to GitHub Releases.
        -   &build-alpine
            <<: *test-alpine
            stage: build
            env: ARCH=x86_64

            script:
                - alpine ./configure --disable-docs --enable-all-static
                    CFLAGS='-Os -static -no-pie' CXXFLAGS='-Os -static -no-pie'
                - alpine make
                - alpine strip jq

                - jq -V
                - ls -lah jq
                - file jq
                # Ensure that the built executable is really statically linked.
                - file jq | grep -Fw 'statically linked'

            before_deploy:
                - PKGNAME="jq-$TRAVIS_TAG-$ARCH-linux"
                - mkdir $PKGNAME && mv jq $PKGNAME/
                - tar -czf $PKGNAME.tar.gz $PKGNAME/
                - sha256sum $PKGNAME.tar.gz > $PKGNAME.tar.gz.sha256

            deploy:
                provider: releases
                api_key:
                    secure:  # TODO: put encrypted GitHub token here!
                file: jq-$TRAVIS_TAG-*.tar.gz*
                file_glob: true
                skip_cleanup: true
                on:
                    tags: true

        # Build binaries for other architectures using QEMU user-mode emulation.
        -   <<: *build-alpine
            env: ARCH=x86

        -   <<: *build-alpine
            env: ARCH=aarch64

        -   <<: *build-alpine
            env: ARCH=armhf

        -   <<: *build-alpine
            env: ARCH=ppc64le


notifications:
    email: false

