| 1 | #!/usr/bin/env bash
 | 
| 2 | #
 | 
| 3 | # Usage:
 | 
| 4 | #   ./regtest.sh <function name>
 | 
| 5 | 
 | 
| 6 | set -o nounset
 | 
| 7 | set -o pipefail
 | 
| 8 | set -o errexit
 | 
| 9 | 
 | 
| 10 | readonly THIS_DIR=$(cd $(dirname $0) && pwd)
 | 
| 11 | source $THIS_DIR/common.sh
 | 
| 12 | 
 | 
| 13 | readonly REPO_ROOT=$(cd $THIS_DIR/.. && pwd)
 | 
| 14 | 
 | 
| 15 | # Everything we care about compiling:
 | 
| 16 | _all-py-files() {
 | 
| 17 |   local fmt=$1
 | 
| 18 | 
 | 
| 19 |   # Python files (including build scripts and unit tests, which aren't in the
 | 
| 20 |   # binary).
 | 
| 21 |   oil-python-sources $REPO_ROOT "$fmt"
 | 
| 22 | 
 | 
| 23 |   # - stdlib deps of bin.oil and bin.opy_
 | 
| 24 |   # NOTE: These end with .pyc
 | 
| 25 |   cat \
 | 
| 26 |     $REPO_ROOT/_build/py-to-compile.txt \
 | 
| 27 |     $REPO_ROOT/_build/{oil,opy}/py-to-compile.txt
 | 
| 28 | }
 | 
| 29 | 
 | 
| 30 | # Only compile unique
 | 
| 31 | all-py-files() {
 | 
| 32 |   _all-py-files "$@" | sort | uniq
 | 
| 33 | }
 | 
| 34 | 
 | 
| 35 | _copy() {
 | 
| 36 |   local dest_dir=$1
 | 
| 37 |   local src_path=$2
 | 
| 38 |   local dest_rel_path=$3
 | 
| 39 | 
 | 
| 40 |   local dest=$dest_dir/$dest_rel_path
 | 
| 41 | 
 | 
| 42 |   dest=${dest%c}  # .pyc -> py
 | 
| 43 | 
 | 
| 44 |   mkdir -p $(dirname $dest)
 | 
| 45 |   cp -v --no-target-directory $src_path $dest
 | 
| 46 | }
 | 
| 47 | 
 | 
| 48 | import() {
 | 
| 49 |   local dest=_regtest/src
 | 
| 50 |   mkdir -p $dest
 | 
| 51 | 
 | 
| 52 |   all-py-files '%p %P\n' | xargs -n 2 -- $0 _copy $dest
 | 
| 53 | }
 | 
| 54 | 
 | 
| 55 | #
 | 
| 56 | # Now compiled the files imported
 | 
| 57 | #
 | 
| 58 | 
 | 
| 59 | manifest() {
 | 
| 60 |   # add .pyc at the end
 | 
| 61 |   find _regtest/src -type f -a -printf '%p %Pc\n'
 | 
| 62 | }
 | 
| 63 | 
 | 
| 64 | # 19 seconds on lisa.  This should be a benchmark.
 | 
| 65 | 
 | 
| 66 | # TODO: Parallelize with xargs.  compile-manifest in build.sh is serial.  Just
 | 
| 67 | # needs a mkdir.
 | 
| 68 | 
 | 
| 69 | # NOTE: This is like './build.sh compile-manifest', except we don't exclude
 | 
| 70 | # docstrings, etc.
 | 
| 71 | _compile-manifest() {
 | 
| 72 |   local dest_dir=$1
 | 
| 73 |   while read full_src_path rel_dest_path; do
 | 
| 74 |     local dest=$dest_dir/$rel_dest_path
 | 
| 75 |     mkdir -p $(dirname $dest)
 | 
| 76 | 
 | 
| 77 |     # stdout is saved and linked on /release/$VERSION/index.html
 | 
| 78 |     echo "$full_src_path"
 | 
| 79 | 
 | 
| 80 |     $THIS_DIR/../bin/opyc compile $full_src_path $dest
 | 
| 81 |   done
 | 
| 82 | }
 | 
| 83 | 
 | 
| 84 | compile-all() {
 | 
| 85 |   local pat=${1:-}
 | 
| 86 |   local dest_dir=_tmp/regtest
 | 
| 87 |   mkdir -p $dest_dir
 | 
| 88 |   time manifest | egrep "$pat" | _compile-manifest $dest_dir
 | 
| 89 | }
 | 
| 90 | 
 | 
| 91 | checksum() {
 | 
| 92 |   find _tmp/regtest -type f | xargs $THIS_DIR/../bin/opyc dis-md5 | sort -n
 | 
| 93 | }
 | 
| 94 | 
 | 
| 95 | lines() {
 | 
| 96 |   find _regtest/src -type f | xargs wc -l | sort -n
 | 
| 97 | }
 | 
| 98 | 
 | 
| 99 | # For debugging golden differences.  We want it to be the same on multiple
 | 
| 100 | # machines.
 | 
| 101 | compare-other-machine() {
 | 
| 102 |   local rel_path=${1:-'opy/compiler2/transformer.pyc'}
 | 
| 103 |   # TODO: Copy zip from flanders?
 | 
| 104 |   local zip=_tmp/flanders/bytecode-opy.zip 
 | 
| 105 | 
 | 
| 106 |   ls -l _tmp/regtest/$rel_path
 | 
| 107 | 
 | 
| 108 |   unzip -p $rel_path $zip | od -c
 | 
| 109 | }
 | 
| 110 | 
 | 
| 111 | # One-off debugging
 | 
| 112 | compare-flanders() {
 | 
| 113 |   #local rel_path=${1:-'core/word_test.pyc'}
 | 
| 114 |   #local rel_path=${1:-'core/word_compile.pyc'}
 | 
| 115 |   local rel_path=${1:-'_devbuild/gen/osh_asdl.pyc'}
 | 
| 116 | 
 | 
| 117 |   local mine=_tmp/regtest/$rel_path 
 | 
| 118 |   local flanders=_tmp/flanders-regtest/$rel_path 
 | 
| 119 | 
 | 
| 120 |   # Not accurate because of timestamps
 | 
| 121 |   #md5sum $mine $flanders
 | 
| 122 | 
 | 
| 123 |   # Hm somehow these checksums are different, but the 'dis' dumps are the same.
 | 
| 124 |   # I guess an ordering issue that goes awa when you print?
 | 
| 125 |   ../bin/opyc dis-md5 $mine $flanders
 | 
| 126 | 
 | 
| 127 |   ../bin/opyc dis $mine > _tmp/mine.txt
 | 
| 128 |   ../bin/opyc dis $flanders > _tmp/flanders.txt
 | 
| 129 | 
 | 
| 130 |   diff -u _tmp/{mine,flanders}.txt
 | 
| 131 | }
 | 
| 132 | 
 | 
| 133 | smoke-three-modes() {
 | 
| 134 |   compile oil
 | 
| 135 |   $THIS_DIR/../bin/opyc eval '1+2*3'
 | 
| 136 |   echo '4+5*6' | $THIS_DIR/../bin/opyc repl
 | 
| 137 | }
 | 
| 138 | 
 | 
| 139 | "$@"
 |