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