summaryrefslogtreecommitdiff
path: root/bash/SOURCES.bash
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