From 22b04566231c007a1687f4816bd0e9841ce432de Mon Sep 17 00:00:00 2001 From: johnl Date: Sat, 26 Jan 2019 21:38:23 +0100 Subject: [PATCH 1/3] Add missing word (and reflow text) --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 82efc54c..a47f6e23 100644 --- a/README.md +++ b/README.md @@ -111,9 +111,9 @@ filesystem until sync or close is called on the file. ## Other notes -All littlefs have the potential to return a negative error code. The errors -can be either one of those found in the `enum lfs_error` in [lfs.h](lfs.h), -or an error returned by the user's block device operations. +All littlefs calls have the potential to return a negative error code. The +errors can be either one of those found in the `enum lfs_error` in +[lfs.h](lfs.h), or an error returned by the user's block device operations. In the configuration struct, the `prog` and `erase` function provided by the user may return a `LFS_ERR_CORRUPT` error if the implementation already can From 7f7b7332e3a356587b814ceebf23a8e68f06da9e Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Fri, 25 Jan 2019 17:07:17 -0600 Subject: [PATCH 2/3] Added scripts/prefix.py for automatically prefixing version numbers Example: ./scripts/prefix.py lfs2 Will convert the following: lfs_* -> lfs2_* LFS_* -> LFS2_* -DLFS_* -> -DLFS2_* --- scripts/prefix.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 scripts/prefix.py diff --git a/scripts/prefix.py b/scripts/prefix.py new file mode 100755 index 00000000..ca547b69 --- /dev/null +++ b/scripts/prefix.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +# This script replaces prefixes of files, and symbols in that file. +# Useful for creating different versions of the codebase that don't +# conflict at compile time. +# +# example: +# $ ./scripts/prefix.py lfs2 + +import os +import os.path +import re +import glob +import itertools +import tempfile +import shutil +import subprocess + +DEFAULT_PREFIX = "lfs" + +def subn(from_prefix, to_prefix, name): + name, count1 = re.subn('\\b'+from_prefix, to_prefix, name) + name, count2 = re.subn('\\b'+from_prefix.upper(), to_prefix.upper(), name) + name, count3 = re.subn('\\B-D'+from_prefix.upper(), + '-D'+to_prefix.upper(), name) + return name, count1+count2+count3 + +def main(from_prefix, to_prefix=None, files=None): + if not to_prefix: + from_prefix, to_prefix = DEFAULT_PREFIX, from_prefix + + if not files: + files = subprocess.check_output([ + 'git', 'ls-tree', '-r', '--name-only', 'HEAD']).split() + + for oldname in files: + # Rename any matching file names + newname, namecount = subn(from_prefix, to_prefix, oldname) + if namecount: + subprocess.check_call(['git', 'mv', oldname, newname]) + + # Rename any prefixes in file + count = 0 + with open(newname+'~', 'w') as tempf: + with open(newname) as newf: + for line in newf: + line, n = subn(from_prefix, to_prefix, line) + count += n + tempf.write(line) + shutil.copystat(newname, newname+'~') + os.rename(newname+'~', newname) + subprocess.check_call(['git', 'add', newname]) + + # Summary + print '%s: %d replacements' % ( + '%s -> %s' % (oldname, newname) if namecount else oldname, + count) + +if __name__ == "__main__": + import sys + sys.exit(main(*sys.argv[1:])) From 7e110b44c0e796dc56e2fe86587762d685653029 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Wed, 27 Feb 2019 01:26:27 -0600 Subject: [PATCH 3/3] Added automatic version prefixing to releases The script itself is a part of .travis.yml, using ./scripts/prefix.py for applying prefixes to the source code. This purpose of the automatic job is to provide a branch containing version prefixes, to avoid name conflicts in binaries containing different major versions of littlefs with only a git clone. As a part of each release, two branches and a tag are created: - vN - moving branch - vN-prefix - moving branch - vN.N.N - immutable tag The major version branch (vM) is created on major releases, but updated every patch release. The patch version tag (vM.M.P) is created every patch release. Patch releases occur every time a commit is merged into master, though multiple merges may be coalesced. The major prefix branch (vM-prefix) is modified with the ./scripts/prefix.py script. Note that this branch is updated as a synthetic merge commit with the previous history of vM-prefix. The reason for this is to allow users to easily update vM-prefix with a `git pull` as they would for other branches. A---B---C---D---E master, v1, v1.7.3 \ \ \ F-------G---H v1-prefix --- .travis.yml | 125 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 53 deletions(-) diff --git a/.travis.yml b/.travis.yml index b28ec1d0..f8306b19 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,7 @@ script: 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 \ + 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 (?[0-9]+)\").size" \ @@ -100,6 +100,7 @@ jobs: 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 @@ -128,70 +129,88 @@ jobs: - ls - make -B test_dirs test_files QUIET=1 - # Automatically update releases + # Automatically create releases - stage: deploy env: - STAGE=deploy - NAME=deploy script: - # Find 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))) - # 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$LFS_VERSION_MAJOR.$LFS_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) - - LFS_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 - - LFS_VERSION="v$LFS_VERSION_MAJOR.$LFS_VERSION_MINOR.$LFS_VERSION_PATCH" - - echo "VERSION $LFS_VERSION" - | + bash << 'SCRIPT' + set -ev + # Find 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))) + # 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$LFS_VERSION_MAJOR.$LFS_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) + LFS_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 + LFS_VERSION="v$LFS_VERSION_MAJOR.$LFS_VERSION_MINOR.$LFS_VERSION_PATCH" + echo "VERSION $LFS_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') - if [ "$TRAVIS_COMMIT" == "$CURRENT_COMMIT" ] + 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$LFS_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$LFS_VERSION_MAJOR-prefix || true + ./scripts/prefix.py lfs$LFS_VERSION_MAJOR + git branch v$LFS_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$LFS_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$LFS_VERSION_MAJOR \ + v$LFS_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/$LFS_VERSION\", + \"sha\": \"$TRAVIS_COMMIT\" + }" + # Create minor release? + [[ "$LFS_VERSION" == *.0 ]] || exit 0 + # Build release notes + PREV=$(git tag --sort=-v:refname -l "v*.0" | head -1) + if [ ! -z "$PREV" ] then - # Create a simple tag - curl -f -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\" - }" - # Minor release? - if [[ "$LFS_VERSION" == *.0 ]] - then - # 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\": \"$LFS_VERSION\", - \"name\": \"${LFS_VERSION%.0}\", - \"draft\": true, - \"body\": $(jq -sR '.' <<< "$CHANGES") - }" - fi + 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\": \"$LFS_VERSION\", + \"name\": \"${LFS_VERSION%.0}\", + \"draft\": true, + \"body\": $(jq -sR '.' <<< "$CHANGES") + }" #" + SCRIPT # Manage statuses before_install: - | - curl -u $GEKY_BOT_STATUSES -X POST \ + 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\", @@ -202,7 +221,7 @@ before_install: after_failure: - | - curl -u $GEKY_BOT_STATUSES -X POST \ + 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\", @@ -213,7 +232,7 @@ after_failure: after_success: - | - curl -u $GEKY_BOT_STATUSES -X POST \ + 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\",