summaryrefslogtreecommitdiff
path: root/standalone/linux/skel/runshell
blob: fff0f70822ddf2d1b6421b540872f86be39d3c5e (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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/bin/sh
# Runs a shell command (or interactive shell) using the binaries and
# libraries bundled with this app.

set -e

base="$(dirname "$0")"

if [ ! -d "$base" ]; then
	echo "** cannot find base directory (I seem to be $0)" >&2
	exit 1
fi

if [ ! -e "$base/bin/git-annex" ]; then
	echo "** base directory $base does not contain bin/git-annex" >&2
	exit 1
fi
if [ ! -e "$base/bin/git" ]; then
	echo "** base directory $base does not contain bin/git" >&2
	exit 1
fi

# Get absolute path to base, to avoid breakage when things change directories.
orig="$(pwd)"
cd "$base"
base="$(pwd)"
cd "$orig"

# --library-path won't work if $base contains : or ;
# Detect this problem, and work around it by using a temp directory.
if echo "$base" | grep -q '[:;]'; then
	tbase=$(mktemp -d -p /tmp annexshimXXXXXXXXX 2>/dev/null || true)
	if [ -z "$tbase" ]; then
		tbase="/tmp/annexshim.$$"
		mkdir "$tbase"
	fi
	ln -s "$base" "$tbase/link"
	base="$tbase/link"
	cleanuptbase () {
		rm -rf "$tbase"
	}
	trap cleanuptbase EXIT
fi

# Set this variable when using this script inside a package of git-annex,
# which arranges for git-annex, git-annex-shell, and git to all be in the
# standard PATH.
GIT_ANNEX_PACKAGE_INSTALL=
if [ -z "$GIT_ANNEX_PACKAGE_INSTALL" ]; then
	# Install shim that's used to run git-annex-shell from ssh authorized
	# keys. The assistant also does this when run, but the user may not
	# be using the assistant.
	if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then
		mkdir "$HOME/.ssh" >/dev/null 2>&1 || true
		if [ -e "$HOME/.ssh" ]; then
			(
				echo "#!/bin/sh"
				echo "set -e"
				echo "if [ \"x\$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then"
				echo "exec '$base/runshell' git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\""
				echo "else"
				echo "exec '$base/runshell' git-annex-shell -c \"\$@\""
				echo "fi"
			) > "$HOME/.ssh/git-annex-shell"
			chmod +x "$HOME/.ssh/git-annex-shell"
		fi
	fi

	# And this shim is used by the webapp when adding a remote ssh server.
	if [ ! -e "$HOME/.ssh/git-annex-wrapper" ]; then
		mkdir "$HOME/.ssh" >/dev/null 2>&1 || true
		if [ -e "$HOME/.ssh" ]; then
			(
				echo "#!/bin/sh"
				echo "set -e"
				echo "exec '$base/runshell' \"\$@\""
			) > "$HOME/.ssh/git-annex-wrapper"
			chmod +x "$HOME/.ssh/git-annex-wrapper"
		fi
	fi
fi

# Put our binaries first, to avoid issues with out of date or incompatable
# system binaries. Extra binaries come after system path.
ORIG_PATH="$PATH"
export ORIG_PATH
PATH="$base/bin:$PATH:$base/extra"
export PATH

# These env vars are used by the shim wrapper around each binary.
for lib in $(cat "$base/libdirs"); do
	GIT_ANNEX_LD_LIBRARY_PATH="$base/$lib:$GIT_ANNEX_LD_LIBRARY_PATH"
done
export GIT_ANNEX_LD_LIBRARY_PATH
GIT_ANNEX_DIR="$base"
export GIT_ANNEX_DIR

ORIG_GCONV_PATH="$GCONV_PATH"
export ORIG_GCONV_PATH
GCONV_PATH="$base/$(cat "$base/gconvdir")"
export GCONV_PATH

# workaround for https://ghc.haskell.org/trac/ghc/ticket/7695
LOCPATH=/dev/null
export LOCPATH

ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH"
export ORIG_GIT_EXEC_PATH
GIT_EXEC_PATH="$base/git-core"
export GIT_EXEC_PATH

ORIG_GIT_TEMPLATE_DIR="$GIT_TEMPLATE_DIR"
export ORIG_GIT_TEMPLATE_DIR
GIT_TEMPLATE_DIR="$base/templates"
export GIT_TEMPLATE_DIR

ORIG_MANPATH="$MANPATH"
export ORIG_MANPATH
MANPATH="$base/usr/share/man:$MANPATH"
export MANPATH

# Indicate which variables were exported above and should be cleaned
# when running non-bundled programs.
GIT_ANNEX_STANDLONE_ENV="PATH GCONV_PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR MANPATH"
export GIT_ANNEX_STANDLONE_ENV

if [ "$1" ]; then
	cmd="$1"
	shift 1
	if [ -z "$tbase" ]; then
		exec "$cmd" "$@"
	else
		# allow EXIT trap to cleanup
		"$cmd" "$@"
	fi
else
	sh
fi