mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			302 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			302 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| # 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+="-DLFS2_READ_SIZE=1      -DLFS2_CACHE_SIZE=4"
 | |
|   - make test QUIET=1 CFLAGS+="-DLFS2_READ_SIZE=512    -DLFS2_CACHE_SIZE=512 -DLFS2_BLOCK_CYCLES=16"
 | |
|   - make test QUIET=1 CFLAGS+="-DLFS2_BLOCK_COUNT=1023 -DLFS2_LOOKAHEAD_SIZE=256"
 | |
| 
 | |
|   - make clean test QUIET=1 CFLAGS+="-DLFS2_INLINE_MAX=0"
 | |
|   - make clean test QUIET=1 CFLAGS+="-DLFS2_NO_INTRINSICS"
 | |
| 
 | |
|   # compile and find the code size with the smallest configuration
 | |
|   - make clean size
 | |
|         OBJ="$(ls lfs2*.o | tr '\n' ' ')"
 | |
|         CFLAGS+="-DLFS2_NO_ASSERT -DLFS2_NO_DEBUG -DLFS2_NO_WARN -DLFS2_NO_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 -u "$GEKY_BOT_STATUSES" 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
 | |
|       if: branch !~ -prefix$
 | |
|       install:
 | |
|         - sudo apt-get install libfuse-dev
 | |
|         - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2-alpha
 | |
|         - 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=4096 of=disk
 | |
|         - losetup /dev/loop0 disk
 | |
|       script:
 | |
|         # self-host test
 | |
|         - make -C littlefs-fuse
 | |
| 
 | |
|         - littlefs-fuse/lfs2 --format /dev/loop0
 | |
|         - littlefs-fuse/lfs2 /dev/loop0 mount
 | |
| 
 | |
|         - ls mount
 | |
|         - mkdir mount/littlefs
 | |
|         - cp -r $(git ls-tree --name-only HEAD) mount/littlefs
 | |
|         - cd mount/littlefs
 | |
|         - stat .
 | |
|         - ls -flh
 | |
|         - make -B test_dirs test_files QUIET=1
 | |
| 
 | |
|     # self-host with littlefs-fuse for fuzz test
 | |
|     - stage: test
 | |
|       env:
 | |
|         - STAGE=test
 | |
|         - NAME=littlefs-migration
 | |
|       install:
 | |
|         - sudo apt-get install libfuse-dev
 | |
|         - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v2-alpha v2
 | |
|         - git clone --depth 1 https://github.com/geky/littlefs-fuse -b v1 v1
 | |
|         - fusermount -V
 | |
|         - gcc --version
 | |
|       before_script:
 | |
|         # setup disk for littlefs-fuse
 | |
|         - rm -rf v2/littlefs/*
 | |
|         - cp -r $(git ls-tree --name-only HEAD) v2/littlefs
 | |
| 
 | |
|         - mkdir mount
 | |
|         - sudo chmod a+rw /dev/loop0
 | |
|         - dd if=/dev/zero bs=512 count=4096 of=disk
 | |
|         - losetup /dev/loop0 disk
 | |
|       script:
 | |
|         # compile v1 and v2
 | |
|         - make -C v1
 | |
|         - make -C v2
 | |
| 
 | |
|         # run self-host test with v1
 | |
|         - v1/lfs2 --format /dev/loop0
 | |
|         - v1/lfs2 /dev/loop0 mount
 | |
| 
 | |
|         - ls mount
 | |
|         - mkdir mount/littlefs
 | |
|         - cp -r $(git ls-tree --name-only HEAD) mount/littlefs
 | |
|         - cd mount/littlefs
 | |
|         - stat .
 | |
|         - ls -flh
 | |
|         - make -B test_dirs test_files QUIET=1
 | |
| 
 | |
|         # attempt to migrate
 | |
|         - cd ../..
 | |
|         - fusermount -u mount
 | |
| 
 | |
|         - v2/lfs2 --migrate /dev/loop0
 | |
|         - v2/lfs2 /dev/loop0 mount
 | |
| 
 | |
|         # run self-host test with v2 right where we left off
 | |
|         - ls mount
 | |
|         - cd mount/littlefs
 | |
|         - stat .
 | |
|         - ls -flh
 | |
|         - make -B test_dirs test_files QUIET=1
 | |
| 
 | |
|     # Automatically create releases
 | |
|     - stage: deploy
 | |
|       env:
 | |
|         - STAGE=deploy
 | |
|         - NAME=deploy
 | |
|       script:
 | |
|         - |
 | |
|           bash << 'SCRIPT'
 | |
|           set -ev
 | |
|           # Find version defined in lfs2.h
 | |
|           LFS2_VERSION=$(grep -ox '#define LFS2_VERSION .*' lfs2.h | cut -d ' ' -f3)
 | |
|           LFS2_VERSION_MAJOR=$((0xffff & ($LFS2_VERSION >> 16)))
 | |
|           LFS2_VERSION_MINOR=$((0xffff & ($LFS2_VERSION >>  0)))
 | |
|           # Grab latests patch from repo tags, default to 0, needs finagling
 | |
|           # to get past github's pagination api
 | |
|           PREV_URL=https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs/tags/v$LFS2_VERSION_MAJOR.$LFS2_VERSION_MINOR.
 | |
|           PREV_URL=$(curl -u "$GEKY_BOT_RELEASES" "$PREV_URL" -I \
 | |
|               | sed -n '/^Link/{s/.*<\(.*\)>; rel="last"/\1/;p;q0};$q1' \
 | |
|               || echo $PREV_URL)
 | |
|           LFS2_VERSION_PATCH=$(curl -u "$GEKY_BOT_RELEASES" "$PREV_URL" \
 | |
|               | jq 'map(.ref | match("\\bv.*\\..*\\.(.*)$";"g")
 | |
|                   .captures[].string | tonumber) | max + 1' \
 | |
|               || echo 0)
 | |
|           # We have our new version
 | |
|           LFS2_VERSION="v$LFS2_VERSION_MAJOR.$LFS2_VERSION_MINOR.$LFS2_VERSION_PATCH"
 | |
|           echo "VERSION $LFS2_VERSION"
 | |
|           # Check that we're the most recent commit
 | |
|           CURRENT_COMMIT=$(curl -f -u "$GEKY_BOT_RELEASES" \
 | |
|               https://api.github.com/repos/$TRAVIS_REPO_SLUG/commits/master \
 | |
|               | jq -re '.sha')
 | |
|           [ "$TRAVIS_COMMIT" == "$CURRENT_COMMIT" ] || exit 0
 | |
|           # Create major branch
 | |
|           git branch v$LFS2_VERSION_MAJOR HEAD
 | |
|           # Create major prefix branch
 | |
|           git config user.name "geky bot"
 | |
|           git config user.email "bot@geky.net"
 | |
|           git fetch https://github.com/$TRAVIS_REPO_SLUG.git \
 | |
|               --depth=50 v$LFS2_VERSION_MAJOR-prefix || true
 | |
|           ./scripts/prefix.py lfs2$LFS2_VERSION_MAJOR
 | |
|           git branch v$LFS2_VERSION_MAJOR-prefix $( \
 | |
|               git commit-tree $(git write-tree) \
 | |
|                   $(git rev-parse --verify -q FETCH_HEAD | sed -e 's/^/-p /') \
 | |
|                   -p HEAD \
 | |
|                   -m "Generated v$LFS2_VERSION_MAJOR prefixes")
 | |
|           git reset --hard
 | |
|           # Update major version branches (vN and vN-prefix)
 | |
|           git push https://$GEKY_BOT_RELEASES@github.com/$TRAVIS_REPO_SLUG.git \
 | |
|               v$LFS2_VERSION_MAJOR \
 | |
|               v$LFS2_VERSION_MAJOR-prefix
 | |
|           # Create patch version tag (vN.N.N)
 | |
|           curl -f -u "$GEKY_BOT_RELEASES" -X POST \
 | |
|               https://api.github.com/repos/$TRAVIS_REPO_SLUG/git/refs \
 | |
|               -d "{
 | |
|                   \"ref\": \"refs/tags/$LFS2_VERSION\",
 | |
|                   \"sha\": \"$TRAVIS_COMMIT\"
 | |
|               }"
 | |
|           # Create minor release?
 | |
|           [[ "$LFS2_VERSION" == *.0 ]] || exit 0
 | |
|           # Build release notes
 | |
|           PREV=$(git tag --sort=-v:refname -l "v*.0" | head -1)
 | |
|           if [ ! -z "$PREV" ]
 | |
|           then
 | |
|               echo "PREV $PREV"
 | |
|               CHANGES=$'### Changes\n\n'$( \
 | |
|                   git log --oneline $PREV.. --grep='^Merge' --invert-grep)
 | |
|               printf "CHANGES\n%s\n\n" "$CHANGES"
 | |
|           fi
 | |
|           # Create the release
 | |
|           curl -f -u "$GEKY_BOT_RELEASES" -X POST \
 | |
|               https://api.github.com/repos/$TRAVIS_REPO_SLUG/releases \
 | |
|               -d "{
 | |
|                   \"tag_name\": \"$LFS2_VERSION\",
 | |
|                   \"name\": \"${LFS2_VERSION%.0}\",
 | |
|                   \"draft\": true,
 | |
|                   \"body\": $(jq -sR '.' <<< "$CHANGES")
 | |
|               }" #"
 | |
|           SCRIPT
 | |
| 
 | |
| # 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
 |