| 1 | #!/usr/bin/env bash
|
| 2 | #
|
| 3 | # xshar - Executable shell archive
|
| 4 | #
|
| 5 | # Usage:
|
| 6 | # devtools/xshar.sh <function name>
|
| 7 | #
|
| 8 | # devtools/
|
| 9 | # xshar.sh # this file
|
| 10 | # test-oils.sh # can run benchmarks
|
| 11 | #
|
| 12 | # Results in:
|
| 13 | #
|
| 14 | # _release/test-oils.xshar
|
| 15 | #
|
| 16 | # Runtime deps:
|
| 17 | #
|
| 18 | # /bin/sh
|
| 19 | # tar, gzip -d
|
| 20 | # base64
|
| 21 |
|
| 22 | set -o nounset
|
| 23 | set -o pipefail
|
| 24 | set -o errexit
|
| 25 |
|
| 26 | source devtools/run-task.sh # run-task
|
| 27 |
|
| 28 | print-shell() {
|
| 29 | local tar=$1
|
| 30 | local main=$2
|
| 31 |
|
| 32 | cat <<'EOF'
|
| 33 | #!/bin/sh
|
| 34 |
|
| 35 | change_dir() {
|
| 36 | local name
|
| 37 | name=$(basename $0) # e.g. hello-xshar.xshar
|
| 38 |
|
| 39 | local dir=/tmp/$name.$$
|
| 40 | mkdir -p "$dir"
|
| 41 | cd "$dir"
|
| 42 | }
|
| 43 |
|
| 44 | extract_data() {
|
| 45 | base64 -d >tmp.tar.gz <<'XSHAR_DATA'
|
| 46 | EOF
|
| 47 |
|
| 48 | # Print code that extracts here doc
|
| 49 | base64 < $tar
|
| 50 |
|
| 51 | cat <<EOF
|
| 52 | XSHAR_DATA
|
| 53 |
|
| 54 | tar -x -z < tmp.tar.gz
|
| 55 | }
|
| 56 |
|
| 57 | change_dir
|
| 58 | extract_data
|
| 59 | EOF
|
| 60 | echo "$main" '"$@"'
|
| 61 |
|
| 62 | # We don't bother to clean up after, it's in /tmp
|
| 63 | }
|
| 64 |
|
| 65 | create() {
|
| 66 | local main=${1:-devtools/test-oils.sh}
|
| 67 | # Include the main file
|
| 68 | #shift
|
| 69 |
|
| 70 | local name
|
| 71 | name=$(basename $main .sh)
|
| 72 |
|
| 73 | local tar=_tmp/$name.tar.gz
|
| 74 |
|
| 75 | tar --create --gzip --file $tar "$main" "$@"
|
| 76 | ls -l $tar
|
| 77 |
|
| 78 | local out=_release/$name.xshar
|
| 79 |
|
| 80 | print-shell $tar $main > $out
|
| 81 | chmod +x $out
|
| 82 | ls -l $out
|
| 83 | }
|
| 84 |
|
| 85 | demo() {
|
| 86 | find yaks/ -name '*.py' | xargs -- $0 create devtools/hello-xshar.sh
|
| 87 | ls -l _release
|
| 88 |
|
| 89 | _release/hello-xshar.xshar main a b c
|
| 90 | }
|
| 91 |
|
| 92 | run-task "$@"
|