forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
makeself-unpack
100 lines (91 loc) · 2.75 KB
/
makeself-unpack
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
#!/bin/bash
# Glue to keep unpack_makeself() unchanged
source /lib/gentoo/functions.sh
find_unpackable_file() { echo "$@"; }
debug-print() { :; }
emktemp() { mktemp "$@"; }
die() { eerror "$*"; exit 1; }
assert() { _pipestatus="${PIPESTATUS[*]}"; [[ "${_pipestatus// /}" -eq 0 ]] || die; }
# Straight copied from unpacker.eclass ... should be kept in sync
unpack_banner() {
echo ">>> Unpacking ${1##*/} to ${PWD}"
}
unpack_makeself() {
local src_input=${1:-${A}}
local src=$(find_unpackable_file "${src_input}")
local skip=$2
local exe=$3
[[ -z ${src} ]] && die "Could not locate source for '${src_input}'"
unpack_banner "${src}"
if [[ -z ${skip} ]] ; then
local ver=$(grep -m1 -a '#.*Makeself' "${src}" | awk '{print $NF}')
local skip=0
exe=tail
case ${ver} in
1.5.*|1.6.0-nv*) # tested 1.5.{3,4,5} ... guessing 1.5.x series is same
skip=$(grep -a ^skip= "${src}" | cut -d= -f2)
;;
2.0|2.0.1)
skip=$(grep -a ^$'\t'tail "${src}" | awk '{print $2}' | cut -b2-)
;;
2.1.1)
skip=$(grep -a ^offset= "${src}" | awk '{print $2}' | cut -b2-)
(( skip++ ))
;;
2.1.2)
skip=$(grep -a ^offset= "${src}" | awk '{print $3}' | head -n 1)
(( skip++ ))
;;
2.1.3)
skip=`grep -a ^offset= "${src}" | awk '{print $3}'`
(( skip++ ))
;;
2.1.4|2.1.5|2.1.6|2.2.0)
skip=$(grep -a offset=.*head.*wc "${src}" | awk '{print $3}' | head -n 1)
skip=$(head -n ${skip} "${src}" | wc -c)
exe="dd"
;;
*)
eerror "I'm sorry, but I was unable to support the Makeself file."
eerror "The version I detected was '${ver}'."
eerror "Please file a bug about the file ${src##*/} at"
eerror "http://bugs.gentoo.org/ so that support can be added."
die "makeself version '${ver}' not supported"
;;
esac
debug-print "Detected Makeself version ${ver} ... using ${skip} as offset"
fi
case ${exe} in
tail) exe="tail -n +${skip} '${src}'";;
dd) exe="dd ibs=${skip} skip=1 if='${src}'";;
*) die "makeself cant handle exe '${exe}'"
esac
# lets grab the first few bytes of the file to figure out what kind of archive it is
local filetype tmpfile=$(emktemp)
eval ${exe} 2>/dev/null | head -c 512 > "${tmpfile}"
filetype=$(file -b "${tmpfile}") || die
case ${filetype} in
*tar\ archive*)
eval ${exe} | tar --no-same-owner -xf -
;;
bzip2*)
eval ${exe} | bzip2 -dc | tar --no-same-owner -xf -
;;
gzip*)
eval ${exe} | tar --no-same-owner -xzf -
;;
compress*)
eval ${exe} | gunzip | tar --no-same-owner -xf -
;;
XZ*)
eval ${exe} | unxz | tar --no-same-owner -xf -
;;
*)
eerror "Unknown filetype \"${filetype}\" ?"
false
;;
esac
assert "failure unpacking (${filetype}) makeself ${src##*/} ('${ver}' +${skip})"
rm "${tmpfile}"
}
for x; do unpack_makeself "$x" ; done