[feat] Install pyside from leap's wheelhouse
[bitmask_bundler.git] / bundle_pyinstaller.sh
1 #!/bin/bash
2 ######################################################################
3 # bundle_pyinstaller.sh
4 # Copyright (C) 2015 LEAP
5 #
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 ######################################################################
19 set -e  # Exit immediately if a command exits with a non-zero status.
20
21 REPOSITORIES="bitmask_client leap_pycommon soledad keymanager leap_mail"
22 PACKAGES="leap_pycommon keymanager soledad/common soledad/client leap_mail bitmask_client"
23
24 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}"  )" && pwd  )"
25 REPOS_ROOT="$SCRIPT_DIR/repositories"  # Root path for all the needed repositories
26 VENV_DIR="$SCRIPT_DIR/bitmask.venv"  # Root path for all the needed repositories
27
28
29 # To get colored output you should run this script like this:
30 # ENABLE_COLORS=1 ./this_script.sh
31 if [[ -z $ENABLE_COLORS ]]; then
32     cc_green=""
33     cc_yellow=""
34     cc_red=""
35     cc_normal=""
36 else
37     # Escape codes - set colors
38     esc=`echo -en "\033"`
39     cc_green="${esc}[0;32m"
40     cc_yellow="${esc}[0;33m"
41     cc_red="${esc}[0;31m"
42     cc_normal=`echo -en "${esc}[m\017"`
43 fi
44
45 mkdir -p $REPOS_ROOT
46
47 _cdsitepackages(){
48     # from http://stackoverflow.com/a/122340/687989
49     site_packages=`python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"`
50     cd $site_packages
51 }
52
53 create_venv() {
54     status="creating virtualenv"
55     echo "${cc_green}Status: $status...${cc_normal}"
56     set -x  # show commands
57
58     virtualenv $VENV_DIR && source $VENV_DIR/bin/activate
59     pip install --upgrade pip  # get the latest pip
60
61     set +x
62     echo "${cc_green}Status: $status done.${cc_normal}"
63 }
64
65 install_pyinstaller(){
66     status="installing pyinstaller from repo"
67     echo "${cc_green}Status: $status...${cc_normal}"
68     set -x  # show commands
69     source $VENV_DIR/bin/activate
70     cd $REPOS_ROOT
71
72     if [ ! -d pyinstaller ]; then
73         git clone https://github.com/kalikaneko/pyinstaller.git --branch feature/pyside-hooks --depth 1
74         cd pyinstaller
75     else
76         cd pyinstaller
77         git fetch origin
78         git reset --hard origin/develop
79     fi
80
81     python setup.py develop
82
83     set +x
84     echo "${cc_green}Status: $status done.${cc_normal}"
85 }
86
87 clone_repos() {
88     status="clone repositories"
89     echo "${cc_green}Status: $status...${cc_normal}"
90     set -x  # show commands
91
92     src="https://leap.se/git"
93     cd $REPOS_ROOT
94
95     for repo in $REPOSITORIES; do
96         echo "${cc_yellow}Status: cloning: $repo...${cc_normal}"
97         if [ ! -d $repo ]; then
98            git clone -b develop $src/$repo --depth 1
99        else
100            cd $repo
101            git fetch
102            git reset --hard origin/develop
103            cd ..
104        fi
105     done
106
107     set +x
108     echo "${cc_green}Status: $status done!${cc_normal}"
109 }
110
111 install_requirements() {
112     status="installing non-leap requirements"
113     echo "${cc_green}Status: $status...${cc_normal}"
114     set -x  # show commands
115     cd $REPOS_ROOT
116     source $VENV_DIR/bin/activate
117
118     cd $REPOS_ROOT/bitmask_client/
119     make install_base_deps
120     pip install -U --no-index --trusted-host lizard.leap.se --find-links=https://lizard.leap.se/wheels pyside
121     # ./pkg/postmkvenv.sh
122
123     # hack to solve gnupg version problem
124     pip uninstall -y gnupg && pip install gnupg
125
126     set +x
127     echo "${cc_green}Status: $status done.${cc_normal}"
128 }
129
130 create_sumo(){
131     echo "${cc_red}No sumo creation available in here.${cc_normal}"
132     exit  # no creation, get sumo from path
133     status="creating sumo tarball"
134     echo "${cc_green}Status: $status...${cc_normal}"
135     set -x  # show commands
136
137
138     # source $VENV_DIR/bin/activate
139     # cd $REPOS_ROOT/bitmask_client/
140     # python setup.py sdist --sumo
141 }
142
143 install_sumo(){
144     if [[ -z $1 ]]; then
145         echo "You need to specify a sumo tarball path parameter."
146         exit 1
147     fi
148
149     status="'installing' sumo tarball"
150     echo "${cc_green}Status: $status...${cc_normal}"
151     set -x  # show commands
152
153     source $VENV_DIR/bin/activate
154     SUMO_PATH=$1
155
156     _cdsitepackages
157
158     # the file name may be like 'leap.bitmask-0.9.0rc1-12-g59bc704-SUMO.tar.gz',
159     # but it also can be 'leap.bitmask-latest-SUMO.tar.gz'
160     # and the root path inside the archive for that file would be
161     # 'leap.bitmask-0.9.0rc1-12-g59bc704-SUMO' in both cases.
162     base_path=`tar tzf $SUMO_PATH | head -n 1`
163     target_subpath=src/leap
164     tar xzf $SUMO_PATH $base_path$target_subpath --strip-components=2
165 }
166
167 add_files(){
168     # HACK: this is only a hack around a missing pyinstaller hook
169     status="hack: add files"
170     echo "${cc_green}Status: $status...${cc_normal}"
171     set -x  # show commands
172
173     _cdsitepackages
174
175     dest="$REPOS_ROOT/bitmask_client/pkg/pyinst/cryptography/"
176     mkdir -p $dest
177     cp cryptography/hazmat/bindings/openssl/src/osrandom_engine.{c,h} $dest
178
179     dest="$REPOS_ROOT/bitmask_client/dist/bitmask/u1db/backends/"
180     mkdir -p $dest
181     cp u1db/backends/dbschema.sql $dest
182
183     set +x
184     echo "${cc_green}Status: $status done.${cc_normal}"
185 }
186
187 tweak_linux(){
188     status="tweaking linux specific stuff"
189     echo "${cc_green}Status: $status...${cc_normal}"
190     set -x  # show commands
191
192     cd $REPOS_ROOT/bitmask_client/dist/bitmask
193     mv bitmask bitmask-app
194
195     cd $REPOS_ROOT/bitmask_client
196     cp pkg/linux/bitmask-launcher dist/bitmask/bitmask
197
198     cd $REPOS_ROOT/bitmask_client
199     mkdir -p dist/bitmask/helpers
200     cp pkg/linux/bitmask-root dist/bitmask/helpers/
201
202     # NOTE: TUF stuff is needed for all OSs, not just linux
203     # TODO: copy launcher.conf for TUF updates
204     # cp pkg/tuf/launcher.conf dist/bitmask/helpers/
205
206     set +x
207     echo "${cc_green}Status: $status done.${cc_normal}"
208 }
209
210 tweak_zope(){
211     # - create bare zope dir in site-packages
212     # - touch zope/__init__.py
213     # - move the zope.interface folder to zope/
214     # - move the zope.proxy folder to zope/
215     # - remove the zope* eggs in site-packages
216     # - remove any refs to these eggs in easy-install.pth ?? (unsure about this, talking from the top of my head) 
217     status="tweaking zope packages"
218     echo "${cc_green}Status: $status...${cc_normal}"
219     set -x  # show commands
220
221     _cdsitepackages
222     mkdir -p zope
223     touch zope/__init__.py
224     # zope/interface and zope/proxy already in place
225     rm -fr zope.{interface,proxy}*.egg-info
226     rm -f zope.{interface,proxy}*-nspkg.pth
227     cd -
228
229     set +x
230     echo "${cc_green}Status: $status done.${cc_normal}"
231 }
232
233 run_pyinstaller(){
234     status="running pyinstaller"
235     echo "${cc_green}Status: $status...${cc_normal}"
236     set -x  # show commands
237
238     spec_file=$1
239     cd $REPOS_ROOT/bitmask_client
240     make clean_pkg
241
242     # HACK: path needed by bitmask_client makefile
243     mkdir -p $REPOS_ROOT/bitmask_client/dist/Bitmask.app/Contents/Resources/
244
245     make pyinst
246
247     set +x
248     echo "${cc_green}Status: $status done.${cc_normal}"
249 }
250
251 archive_bundle(){
252     # - rename dist/bitmask distribution folder to bitmask-<release>-<date?>
253     status="creating bundle archive"
254     echo "${cc_green}Status: $status...${cc_normal}"
255     set -x  # show commands
256
257     source $VENV_DIR/bin/activate
258     version=`python -c "import leap.bitmask; print leap.bitmask.__version__"`
259
260     cd $REPOS_ROOT/bitmask_client/dist/
261     # TODO: add version to bundle name
262     # `git describe` won't work if shallow clone (--depth 1)
263     BUNDLE_NAME="bitmask-$version"
264     mv bitmask $BUNDLE_NAME
265     tar czf $SCRIPT_DIR/$BUNDLE_NAME.tar.gz $BUNDLE_NAME
266
267     set +x
268     echo "${cc_green}Status: $status done.${cc_normal}"
269 }
270
271 if [[ -z $1 ]]; then
272     echo "Bitmask pyinstaller creator."
273     echo "You need to specify the sumo tarball path as a parameter."
274     echo "Usage:"
275     echo "  $0 path/to/sumo.tar.gz"
276     exit 1
277 fi
278
279 sumo_path=`realpath $1`
280
281 create_venv
282 install_pyinstaller
283 clone_repos
284 install_requirements
285 install_sumo $sumo_path
286 tweak_zope
287 add_files
288 run_pyinstaller
289 tweak_linux
290 archive_bundle