From b28aefe28c183b307b162cea1536f3027a780952 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 22 Mar 2017 20:18:20 +0100 Subject: Use "nightly" version string for all CI built binaries. --- .travis.yml | 2 ++ scripts/build_emscripten.sh | 6 ------ scripts/create_source_tarball.sh | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 61fe0cc3..35c9e840 100644 --- a/.travis.yml +++ b/.travis.yml @@ -113,6 +113,7 @@ matrix: - SOLC_INSTALL_DEPS_TRAVIS=Off - SOLC_RELEASE=Off - SOLC_TESTS=Off + - ZIP_SUFFIX=emscripten # OS X Mavericks (10.9) # https://en.wikipedia.org/wiki/OS_X_Mavericks @@ -175,6 +176,7 @@ cache: install: - test $SOLC_INSTALL_DEPS_TRAVIS != On || (scripts/install_deps.sh) - test "$TRAVIS_OS_NAME" != "linux" || (scripts/install_cmake.sh) + - if [ "$TRAVIS_BRANCH" = release ]; then echo -n > prerelease.txt; else date -u +"nightly.%Y.%-m.%-d" > prerelease.txt; fi - echo -n "$TRAVIS_COMMIT" > commit_hash.txt before_script: diff --git a/scripts/build_emscripten.sh b/scripts/build_emscripten.sh index 9b432e95..6046978e 100755 --- a/scripts/build_emscripten.sh +++ b/scripts/build_emscripten.sh @@ -29,12 +29,6 @@ set -e if [[ "$OSTYPE" != "darwin"* ]]; then - if [ "$TRAVIS_BRANCH" = release ] - then - echo -n > prerelease.txt - else - date -u +"nightly.%Y.%-m.%-d" > prerelease.txt - fi ./scripts/travis-emscripten/install_deps.sh docker run -v $(pwd):/src trzeci/emscripten:sdk-tag-1.35.4-64bit ./scripts/travis-emscripten/build_emscripten.sh fi diff --git a/scripts/create_source_tarball.sh b/scripts/create_source_tarball.sh index bf8a336b..9ca72c31 100755 --- a/scripts/create_source_tarball.sh +++ b/scripts/create_source_tarball.sh @@ -15,7 +15,7 @@ REPO_ROOT="$(dirname "$0")"/.. then versionstring="$version" else - versionstring="$version-develop-$commitdate-$commithash" + versionstring="$version-nightly-$commitdate-$commithash" fi TEMPDIR=$(mktemp -d) -- cgit From b18aea315d2e5c12ff6aa7cbf24d559e0523e778 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 22 Mar 2017 20:19:20 +0100 Subject: Isolate test cases from all tests and store under hash. --- scripts/isolate_tests.py | 24 ++++++++++++------------ test/cmdlineTests.sh | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/scripts/isolate_tests.py b/scripts/isolate_tests.py index 9bb52f4c..a1d1c75c 100755 --- a/scripts/isolate_tests.py +++ b/scripts/isolate_tests.py @@ -8,10 +8,12 @@ import sys import re - +import os +import hashlib +from os.path import join def extract_cases(path): - lines = open(path).read().splitlines() + lines = open(path, 'rb').read().splitlines() inside = False delimiter = '' @@ -33,16 +35,14 @@ def extract_cases(path): return tests -def write_cases(tests, start=0): - for i, test in enumerate(tests, start=start): - open('test%d.sol' % i, 'w').write(test) - +def write_cases(tests): + for test in tests: + open('test_%s.sol' % hashlib.sha256(test).hexdigest(), 'wb').write(test) if __name__ == '__main__': - files = sys.argv[1:] + path = sys.argv[1] - i = 0 - for path in files: - cases = extract_cases(path) - write_cases(cases, start=i) - i += len(cases) + for root, dir, files in os.walk(path): + for f in files: + cases = extract_cases(join(root, f)) + write_cases(cases) diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index e2ee6a5e..99cac346 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -73,7 +73,7 @@ TMPDIR=$(mktemp -d) cd "$REPO_ROOT" REPO_ROOT=$(pwd) # make it absolute cd "$TMPDIR" - "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/contracts/* "$REPO_ROOT"/test/libsolidity/*EndToEnd* + "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ for f in *.sol do "$REPO_ROOT"/build/test/solfuzzer < "$f" -- cgit From bbe3557a2fda2f4a09b63b1f3e501d4c8625bfe1 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 22 Mar 2017 20:19:57 +0100 Subject: Create bytecode for all tests and push to remote repo. --- .travis.yml | 5 ++ appveyor.yml | 12 ++++ scripts/bytecodecompare/deploy_key.enc | Bin 0 -> 1680 bytes scripts/bytecodecompare/prepare_report.py | 20 ++++++ scripts/bytecodecompare/storebytecode.bat | 41 +++++++++++++ scripts/bytecodecompare/storebytecode.sh | 98 ++++++++++++++++++++++++++++++ 6 files changed, 176 insertions(+) create mode 100644 scripts/bytecodecompare/deploy_key.enc create mode 100755 scripts/bytecodecompare/prepare_report.py create mode 100644 scripts/bytecodecompare/storebytecode.bat create mode 100755 scripts/bytecodecompare/storebytecode.sh diff --git a/.travis.yml b/.travis.yml index 35c9e840..d947707c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,6 +44,7 @@ env: - SOLC_INSTALL_DEPS_TRAVIS=On - SOLC_RELEASE=On - SOLC_TESTS=On + - SOLC_STOREBYTECODE=Off - SOLC_DOCKER=Off matrix: @@ -61,6 +62,7 @@ matrix: compiler: gcc env: - ZIP_SUFFIX=ubuntu-trusty + - SOLC_STOREBYTECODE=On - os: linux dist: trusty @@ -68,6 +70,7 @@ matrix: compiler: clang env: - ZIP_SUFFIX=ubuntu-trusty-clang + - SOLC_STOREBYTECODE=On # Documentation target, which generates documentation using Phoenix / ReadTheDocs. - os: linux @@ -114,6 +117,7 @@ matrix: - SOLC_RELEASE=Off - SOLC_TESTS=Off - ZIP_SUFFIX=emscripten + - SOLC_STOREBYTECODE=On # OS X Mavericks (10.9) # https://en.wikipedia.org/wiki/OS_X_Mavericks @@ -189,6 +193,7 @@ before_script: script: - test $SOLC_DOCS != On || (scripts/docs.sh) - test $SOLC_TESTS != On || (cd $TRAVIS_BUILD_DIR && scripts/tests.sh) + - test $SOLC_STOREBYTECODE != On || (cd $TRAVIS_BUILD_DIR && scripts/bytecodecompare/storebytecode.sh) deploy: # This is the deploy target for the Emscripten build. diff --git a/appveyor.yml b/appveyor.yml index 86a689a7..8d9424f0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -34,6 +34,10 @@ branches: os: Visual Studio 2015 configuration: - RelWithDebInfo +environment: + # This is used for pushing to solidity-test-bytecodes + priv_key: + secure: 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 # NB: Appveyor cache is disabled, because it is proving very unreliable. # We can re-enable it when we find a way to mitigate the unreliability # issues. Have automated builds be reliable is the more important thing. @@ -43,7 +47,14 @@ configuration: #init: # - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) install: + - ps: $fileContent = "-----BEGIN RSA PRIVATE KEY-----`n" + - ps: $fileContent += $env:priv_key.Replace(' ', "`n") + - ps: $fileContent += "`n-----END RSA PRIVATE KEY-----`n" + - ps: Set-Content c:\users\appveyor\.ssh\id_rsa $fileContent - git submodule update --init --recursive + - ps: $prerelease = "nightly." + - ps: $prerelease += Get-Date -format "yyyy.M.d" + - ps: Set-Content prerelease.txt $prerelease - scripts/install_deps.bat - set ETHEREUM_DEPS_PATH=%APPVEYOR_BUILD_FOLDER%\deps\install before_build: @@ -54,6 +65,7 @@ build_script: - msbuild solidity.sln /p:Configuration=%CONFIGURATION% /m:%NUMBER_OF_PROCESSORS% /v:minimal - cd %APPVEYOR_BUILD_FOLDER% - scripts\release.bat %CONFIGURATION% + - scripts\bytecodecompare\storebytecode.bat %CONFIGURATION% %APPVEYOR_REPO_COMMIT% test_script: - cd %APPVEYOR_BUILD_FOLDER% diff --git a/scripts/bytecodecompare/deploy_key.enc b/scripts/bytecodecompare/deploy_key.enc new file mode 100644 index 00000000..acab2a27 Binary files /dev/null and b/scripts/bytecodecompare/deploy_key.enc differ diff --git a/scripts/bytecodecompare/prepare_report.py b/scripts/bytecodecompare/prepare_report.py new file mode 100755 index 00000000..68793927 --- /dev/null +++ b/scripts/bytecodecompare/prepare_report.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import sys +import glob +import subprocess +import json + +solc = sys.argv[1] +report = open("report.txt", "w") + +for f in sorted(glob.glob("*.sol")): + proc = subprocess.Popen([solc, '--combined-json', 'bin,metadata', f], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (out, err) = proc.communicate() + try: + result = json.loads(out.strip()) + for contractName in sorted(result['contracts'].keys()): + report.write(contractName + ' ' + result['contracts'][contractName]['bin'] + '\n') + report.write(contractName + ' ' + result['contracts'][contractName]['metadata'] + '\n') + except: + report.write(f + ": ERROR\n") diff --git a/scripts/bytecodecompare/storebytecode.bat b/scripts/bytecodecompare/storebytecode.bat new file mode 100644 index 00000000..969a42a4 --- /dev/null +++ b/scripts/bytecodecompare/storebytecode.bat @@ -0,0 +1,41 @@ +@ECHO OFF + +REM --------------------------------------------------------------------------- +REM This file is part of solidity. +REM +REM solidity is free software: you can redistribute it and/or modify +REM it under the terms of the GNU General Public License as published by +REM the Free Software Foundation, either version 3 of the License, or +REM (at your option) any later version. +REM +REM solidity is distributed in the hope that it will be useful, +REM but WITHOUT ANY WARRANTY; without even the implied warranty of +REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +REM GNU General Public License for more details. +REM +REM You should have received a copy of the GNU General Public License +REM along with solidity. If not, see +REM +REM Copyright (c) 2017 solidity contributors. +REM --------------------------------------------------------------------------- + +set CONFIGURATION=%1 +set COMMIT=%2 + +mkdir bytecode +cd bytecode +..\scripts\isolate_tests.py ..\test\ +..\scripts\bytecodecompare\prepare_report.py ..\build\solc\%CONFIGURATION%\solc.exe + +git clone --depth 2 git@github.com:ethereum/solidity-test-bytecode.git +cd solidity-test-bytecode +git config user.name "travis" +git config user.email "chris@ethereum.org" +git clean -f -d -x + +mkdir %COMMIT% +set REPORT=%COMMIT%/windows.txt +cp ../report.txt %REPORT% +git add %REPORT% +git commit -a -m "Added report." +git push origin diff --git a/scripts/bytecodecompare/storebytecode.sh b/scripts/bytecodecompare/storebytecode.sh new file mode 100755 index 00000000..8a3953c3 --- /dev/null +++ b/scripts/bytecodecompare/storebytecode.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +#------------------------------------------------------------------------------ +# Script used for cross-platform comparison as part of the travis automation. +# Splits all test source code into multiple files, generates bytecode and +# uploads the bytecode into github.com/ethereum/solidity-test-bytecode where +# another travis job is triggered to do the actual comparison. +# +# ------------------------------------------------------------------------------ +# This file is part of solidity. +# +# solidity is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# solidity is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with solidity. If not, see +# +# (c) 2017 solidity contributors. +#------------------------------------------------------------------------------ + +set -e + +REPO_ROOT="$(dirname "$0")"/../.. + +echo "Compiling all test contracts into bytecode..." +TMPDIR=$(mktemp -d) +( + cd "$REPO_ROOT" + REPO_ROOT=$(pwd) # make it absolute + cd "$TMPDIR" + + "$REPO_ROOT"/scripts/isolate_tests.py "$REPO_ROOT"/test/ + + if [[ "$SOLC_EMSCRIPTEN" = "On" ]] + then + cp "$REPO_ROOT/build/solc/soljson.js" . + npm install solc + cat > solc < report.txt + else + $REPO_ROOT/scripts/bytecodecompare/prepare_report.py $REPO_ROOT/build/solc/solc + fi + + openssl aes-256-cbc -K $encrypted_60701c962b9c_key -iv $encrypted_60701c962b9c_iv -in "$REPO_ROOT"/scripts/bytecodecompare/deploy_key.enc -out deploy_key -d + chmod 600 deploy_key + eval `ssh-agent -s` + ssh-add deploy_key + + git clone --depth 2 git@github.com:ethereum/solidity-test-bytecode.git + cd solidity-test-bytecode + git config user.name "travis" + git config user.email "chris@ethereum.org" + git clean -f -d -x + + mkdir -p "$TRAVIS_COMMIT" + REPORT="$TRAVIS_COMMIT/$ZIP_SUFFIX.txt" + cp ../report.txt "$REPORT" + git add "$REPORT" + git commit -a -m "Added report $REPORT" + git push origin +) +rm -rf "$TMPDIR" \ No newline at end of file -- cgit From 5c3a80ab5bac2dd5faf19416a640990af3da0a31 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 22 Mar 2017 20:56:44 +0100 Subject: Also generate optimized code. --- scripts/bytecodecompare/prepare_report.py | 24 ++++++++++++++---------- scripts/bytecodecompare/storebytecode.sh | 29 ++++++++++++++++------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/scripts/bytecodecompare/prepare_report.py b/scripts/bytecodecompare/prepare_report.py index 68793927..5a770981 100755 --- a/scripts/bytecodecompare/prepare_report.py +++ b/scripts/bytecodecompare/prepare_report.py @@ -8,13 +8,17 @@ import json solc = sys.argv[1] report = open("report.txt", "w") -for f in sorted(glob.glob("*.sol")): - proc = subprocess.Popen([solc, '--combined-json', 'bin,metadata', f], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (out, err) = proc.communicate() - try: - result = json.loads(out.strip()) - for contractName in sorted(result['contracts'].keys()): - report.write(contractName + ' ' + result['contracts'][contractName]['bin'] + '\n') - report.write(contractName + ' ' + result['contracts'][contractName]['metadata'] + '\n') - except: - report.write(f + ": ERROR\n") +for optimize in [False, True]: + for f in sorted(glob.glob("*.sol")): + args = [solc, '--combined-json', 'bin,metadata', f] + if optimize: + args += ['--optimize'] + proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (out, err) = proc.communicate() + try: + result = json.loads(out.strip()) + for contractName in sorted(result['contracts'].keys()): + report.write(contractName + ' ' + result['contracts'][contractName]['bin'] + '\n') + report.write(contractName + ' ' + result['contracts'][contractName]['metadata'] + '\n') + except: + report.write(f + ": ERROR\n") diff --git a/scripts/bytecodecompare/storebytecode.sh b/scripts/bytecodecompare/storebytecode.sh index 8a3953c3..cdf376a6 100755 --- a/scripts/bytecodecompare/storebytecode.sh +++ b/scripts/bytecodecompare/storebytecode.sh @@ -49,23 +49,26 @@ var fs = require('fs') var compiler = require('solc/wrapper.js')(require('./soljson.js')) -for (var filename of process.argv.slice(2)) +for (var optimize of [false, true]) { - if (filename !== undefined) + for (var filename of process.argv.slice(2)) { - var inputs = {} - inputs[filename] = fs.readFileSync(filename).toString() - var result = compiler.compile({sources: inputs}) - if (!('contracts' in result) || Object.keys(result['contracts']).length === 0) + if (filename !== undefined) { - console.log(filename + ': ERROR') - } - else - { - for (var contractName in result['contracts']) + var inputs = {} + inputs[filename] = fs.readFileSync(filename).toString() + var result = compiler.compile({sources: inputs}, optimize) + if (!('contracts' in result) || Object.keys(result['contracts']).length === 0) + { + console.log(filename + ': ERROR') + } + else { - console.log(contractName + ' ' + result['contracts'][contractName].bytecode) - console.log(contractName + ' ' + result['contracts'][contractName].metadata) + for (var contractName in result['contracts']) + { + console.log(contractName + ' ' + result['contracts'][contractName].bytecode) + console.log(contractName + ' ' + result['contracts'][contractName].metadata) + } } } } -- cgit