summaryrefslogtreecommitdiff
path: root/bash/SOURCES.bash
diff options
context:
space:
mode:
Diffstat (limited to 'bash/SOURCES.bash')
-rw-r--r--bash/SOURCES.bash113
1 files changed, 113 insertions, 0 deletions
diff --git a/bash/SOURCES.bash b/bash/SOURCES.bash
new file mode 100644
index 0000000..a274223
--- /dev/null
+++ b/bash/SOURCES.bash
@@ -0,0 +1,113 @@
1#!/bin/bash
2source()
3{
4 if [[ $1 != */* ]] &&
5 (
6 command -v base64_embedded_source__"$1" ||
7 command -v src/"$1"
8 ) >&2 # >/dev/null
9 then
10 rewrite_self \
11 "$1" \
12 src/"$1" \
13 base64_embedded_source__"$1" \
14 "${@:2}"
15 else
16 builtin source "$@"
17 fi
18}
19
20rewrite_self()
21{
22 # TODO: Check if version in src/ updates this version
23 # by checking for its hash in a record kept in the source
24 # file in src/
25 if command -v "$3" >/dev/null
26 then
27 (
28 set +e
29 sha256sum <("$3") >&2
30 sha256sum <(builtin source "$2" "${@:4}" && "$3") >&2
31 )
32 builtin source \
33 <("$3") \
34 "${@:4}"
35 return
36 fi
37 [ -f "$2" -a -r "$2" ] || return
38 declare -n tmpfile=tmpfile${RANDOM}
39 tmpfile=$(mktemp) || return
40 if embed "$1" "$2" > "$tmpfile" &&
41 builtin source "$tmpfile" &&
42 command -v "$3" >/dev/null &&
43 builtin source <("$3") "${@:4}" &&
44 [ -w "$0" ] &&
45 sed \
46 -i~"$(date -Ins)" \
47 -e "1 { r ${tmpfile}"$'\n'" }" \
48 "$0"
49 then
50 local r=0
51 else
52 local r=$?
53 fi
54 rm "$tmpfile"
55 return $r
56}
57
58embed()
59{
60 cat <<.
61base64_embedded_source__${1}()
62{
63 base64 -d <<.
64$(base64 < "$2" && echo .)
65}
66.
67}
68
69print_test_script_for_SOURCES.bash()
70{
71 cat <<.
72#!/bin/bash
73source SOURCES.bash
74source SOURCES.bash
75source rpc.bash
76: base64_embedded_source__rpc.bash
77: base64_embedded_source__dependencies.bash
78BASH_RPC_REMOTE_DEST=localhost \\
79 remote_run_function \\
80 source rpc.bash
81.
82}
83
84setup_test_dir()
85{
86 (
87 set -e
88 mkdir -p test_SOURCES.bash
89 cd test_SOURCES.bash
90 mkdir -p src
91 ln -sf -t src \
92 ../../SOURCES.bash \
93 ../../src/{rpc,dependencies}.bash
94 print_test_script_for_SOURCES.bash > test-SOURCES.bash
95 )
96}
97
98run_test()
99{
100 (
101 set -ex
102 cd test_SOURCES.bash
103 PATH=$PWD/src:$PATH bash test-SOURCES.bash || true
104 PATH=$PWD/src:$PATH bash test-SOURCES.bash
105 )
106}
107
108bootstrap_SOURCES.bash()
109{
110 setup_test_dir && run_test
111}
112
113[ "$0" = 'bootstrap_SOURCES.bash' ] && bootstrap_SOURCES.bash