| # Environment variables |
| env: |
| global: |
| - CFLAGS=-Werror |
| |
| # Common test script |
| script: |
| # make sure example can at least compile |
| - sed -n '/``` c/,/```/{/```/d; p;}' README.md > test.c && |
| make all CFLAGS+=" |
| -Duser_provided_block_device_read=NULL |
| -Duser_provided_block_device_prog=NULL |
| -Duser_provided_block_device_erase=NULL |
| -Duser_provided_block_device_sync=NULL |
| -include stdio.h" |
| |
| # run tests |
| - make test QUIET=1 |
| |
| # run tests with a few different configurations |
| - make test QUIET=1 CFLAGS+="-DLFS_READ_SIZE=1 -DLFS_PROG_SIZE=1" |
| - make test QUIET=1 CFLAGS+="-DLFS_READ_SIZE=512 -DLFS_PROG_SIZE=512" |
| - make test QUIET=1 CFLAGS+="-DLFS_BLOCK_COUNT=1023 -DLFS_LOOKAHEAD=2048" |
| |
| - make clean test QUIET=1 CFLAGS+="-DLFS_NO_INTRINSICS" |
| |
| # compile and find the code size with the smallest configuration |
| - make clean size |
| OBJ="$(ls lfs*.o | tr '\n' ' ')" |
| CFLAGS+="-DLFS_NO{ASSERT,DEBUG,WARN,ERROR}" |
| | tee sizes |
| |
| # update status if we succeeded, compare with master if possible |
| - | |
| if [ "$TRAVIS_TEST_RESULT" -eq 0 ] |
| then |
| CURR=$(tail -n1 sizes | awk '{print $1}') |
| PREV=$(curl https://api.github.com/repos/$TRAVIS_REPO_SLUG/status/master \ |
| | jq -re "select(.sha != \"$TRAVIS_COMMIT\") |
| | .statuses[] | select(.context == \"$STAGE/$NAME\").description |
| | capture(\"code size is (?<size>[0-9]+)\").size" \ |
| || echo 0) |
| |
| STATUS="Passed, code size is ${CURR}B" |
| if [ "$PREV" -ne 0 ] |
| then |
| STATUS="$STATUS ($(python -c "print '%+.2f' % (100*($CURR-$PREV)/$PREV.0)")%)" |
| fi |
| fi |
| |
| # CI matrix |
| jobs: |
| include: |
| # native testing |
| - stage: test |
| env: |
| - STAGE=test |
| - NAME=littlefs-x86 |
| |
| # cross-compile with ARM (thumb mode) |
| - stage: test |
| env: |
| - STAGE=test |
| - NAME=littlefs-arm |
| - CC="arm-linux-gnueabi-gcc --static -mthumb" |
| - EXEC="qemu-arm" |
| install: |
| - sudo apt-get install gcc-arm-linux-gnueabi qemu-user |
| - arm-linux-gnueabi-gcc --version |
| - qemu-arm -version |
| |
| # cross-compile with PowerPC |
| - stage: test |
| env: |
| - STAGE=test |
| - NAME=littlefs-powerpc |
| - CC="powerpc-linux-gnu-gcc --static" |
| - EXEC="qemu-ppc" |
| install: |
| - sudo apt-get install gcc-powerpc-linux-gnu qemu-user |
| - powerpc-linux-gnu-gcc --version |
| - qemu-ppc -version |
| |
| # cross-compile with MIPS |
| - stage: test |
| env: |
| - STAGE=test |
| - NAME=littlefs-mips |
| - CC="mips-linux-gnu-gcc --static" |
| - EXEC="qemu-mips" |
| install: |
| - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu/ xenial main universe" |
| - sudo apt-get -qq update |
| - sudo apt-get install gcc-mips-linux-gnu qemu-user |
| - mips-linux-gnu-gcc --version |
| - qemu-mips -version |
| |
| # self-host with littlefs-fuse for fuzz test |
| - stage: test |
| env: |
| - STAGE=test |
| - NAME=littlefs-fuse |
| install: |
| - sudo apt-get install libfuse-dev |
| - git clone --depth 1 https://github.com/geky/littlefs-fuse |
| - fusermount -V |
| - gcc --version |
| before_script: |
| # setup disk for littlefs-fuse |
| - rm -rf littlefs-fuse/littlefs/* |
| - cp -r $(git ls-tree --name-only HEAD) littlefs-fuse/littlefs |
| |
| - mkdir mount |
| - sudo chmod a+rw /dev/loop0 |
| - dd if=/dev/zero bs=512 count=2048 of=disk |
| - losetup /dev/loop0 disk |
| script: |
| # self-host test |
| - make -C littlefs-fuse |
| |
| - littlefs-fuse/lfs --format /dev/loop0 |
| - littlefs-fuse/lfs /dev/loop0 mount |
| |
| - ls mount |
| - mkdir mount/littlefs |
| - cp -r $(git ls-tree --name-only HEAD) mount/littlefs |
| - cd mount/littlefs |
| - ls |
| - make -B test_dirs test_files QUIET=1 |
| |
| # Automatically update releases |
| - stage: deploy |
| env: |
| - STAGE=deploy |
| - NAME=deploy |
| script: |
| # Update tag for version defined in lfs.h |
| - LFS_VERSION=$(grep -ox '#define LFS_VERSION .*' lfs.h | cut -d ' ' -f3) |
| - LFS_VERSION_MAJOR=$((0xffff & ($LFS_VERSION >> 16))) |
| - LFS_VERSION_MINOR=$((0xffff & ($LFS_VERSION >> 0))) |
| - LFS_VERSION="v$LFS_VERSION_MAJOR.$LFS_VERSION_MINOR" |
| - echo "littlefs version $LFS_VERSION" |
| - | |
| curl -u $GEKY_BOT_RELEASES -X POST \ |
| https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs \ |
| -d "{ |
| \"ref\": \"refs/tags/$LFS_VERSION\", |
| \"sha\": \"$TRAVIS_COMMIT\" |
| }" |
| - | |
| curl -f -u $GEKY_BOT_RELEASES -X PATCH \ |
| https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs/tags/$LFS_VERSION \ |
| -d "{ |
| \"sha\": \"$TRAVIS_COMMIT\" |
| }" |
| # Create release notes from commits |
| - LFS_PREV_VERSION="v$LFS_VERSION_MAJOR.$(($LFS_VERSION_MINOR-1))" |
| - | |
| if [ $(git tag -l "$LFS_PREV_VERSION") ] |
| then |
| curl -u $GEKY_BOT_RELEASES -X POST \ |
| https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases \ |
| -d "{ |
| \"tag_name\": \"$LFS_VERSION\", |
| \"name\": \"$LFS_VERSION\" |
| }" |
| RELEASE=$( |
| curl -f https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases/tags/$LFS_VERSION |
| ) |
| CHANGES=$( |
| git log --oneline $LFS_PREV_VERSION.. --grep='^Merge' --invert-grep |
| ) |
| curl -f -u $GEKY_BOT_RELEASES -X PATCH \ |
| https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases/$( |
| jq -r '.id' <<< "$RELEASE" |
| ) \ |
| -d "$( |
| jq -s '{ |
| "body": ((.[0] // "" | sub("(?<=\n)#+ Changes.*"; ""; "mi")) |
| + "### Changes\n\n" + .[1]) |
| }' <(jq '.body' <<< "$RELEASE") <(jq -sR '.' <<< "$CHANGES") |
| )" |
| fi |
| |
| # Manage statuses |
| before_install: |
| - | |
| curl -u $GEKY_BOT_STATUSES -X POST \ |
| https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \ |
| -d "{ |
| \"context\": \"$STAGE/$NAME\", |
| \"state\": \"pending\", |
| \"description\": \"${STATUS:-In progress}\", |
| \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\" |
| }" |
| |
| after_failure: |
| - | |
| curl -u $GEKY_BOT_STATUSES -X POST \ |
| https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \ |
| -d "{ |
| \"context\": \"$STAGE/$NAME\", |
| \"state\": \"failure\", |
| \"description\": \"${STATUS:-Failed}\", |
| \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\" |
| }" |
| |
| after_success: |
| - | |
| curl -u $GEKY_BOT_STATUSES -X POST \ |
| https://api.github.com/repos/$TRAVIS_REPO_SLUG/statuses/${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT} \ |
| -d "{ |
| \"context\": \"$STAGE/$NAME\", |
| \"state\": \"success\", |
| \"description\": \"${STATUS:-Passed}\", |
| \"target_url\": \"https://travis-ci.org/$TRAVIS_REPO_SLUG/jobs/$TRAVIS_JOB_ID\" |
| }" |
| |
| # Job control |
| stages: |
| - name: test |
| - name: deploy |
| if: branch = master AND type = push |