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 "$@"
|