Add bitmask 0.9.0 spec file
[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/pyinstaller/pyinstaller.git --depth 1
74         # HACK: use kali's branch since a needed fix is not merged to upstream yet
75         git clone https://github.com/kalikaneko/pyinstaller.git --branch feature/pyside-hooks --depth 1
76         cd pyinstaller
77     else
78         cd pyinstaller
79         git fetch origin
80         # git reset --hard origin/develop
81         git reset --hard feature/pyside-hooks  # just for kali's fork
82     fi
83
84     python setup.py develop
85
86     set +x
87     echo "${cc_green}Status: $status done.${cc_normal}"
88 }
89
90 clone_repos() {
91     status="clone repositories"
92     echo "${cc_green}Status: $status...${cc_normal}"
93     set -x  # show commands
94
95     src="https://leap.se/git"
96     cd $REPOS_ROOT
97
98     for repo in $REPOSITORIES; do
99         echo "${cc_yellow}Status: cloning: $repo...${cc_normal}"
100         if [ ! -d $repo ]; then
101            git clone -b develop $src/$repo --depth 1
102        else
103            cd $repo
104            git fetch
105            git reset --hard origin/develop
106            cd ..
107        fi
108     done
109
110     set +x
111     echo "${cc_green}Status: $status done!${cc_normal}"
112 }
113
114 install_requirements() {
115     status="installing non-leap requirements"
116     echo "${cc_green}Status: $status...${cc_normal}"
117     set -x  # show commands
118     cd $REPOS_ROOT
119     source $VENV_DIR/bin/activate
120
121     cd $REPOS_ROOT/bitmask_client/
122     make install_base_deps
123     pip install -U --no-index --trusted-host lizard.leap.se --find-links=https://lizard.leap.se/wheels pyside
124     # ./pkg/postmkvenv.sh
125
126     # hack to solve gnupg version problem
127     pip uninstall -y gnupg && pip install gnupg
128
129     set +x
130     echo "${cc_green}Status: $status done.${cc_normal}"
131 }
132
133 create_sumo(){
134     echo "${cc_red}No sumo creation available in here.${cc_normal}"
135     exit  # no creation, get sumo from path
136     status="creating sumo tarball"
137     echo "${cc_green}Status: $status...${cc_normal}"
138     set -x  # show commands
139
140
141     # source $VENV_DIR/bin/activate
142     # cd $REPOS_ROOT/bitmask_client/
143     # python setup.py sdist --sumo
144 }
145
146 install_sumo(){
147     if [[ -z $1 ]]; then
148         echo "You need to specify a sumo tarball path parameter."
149         exit 1
150     fi
151
152     status="'installing' sumo tarball"
153     echo "${cc_green}Status: $status...${cc_normal}"
154     set -x  # show commands
155
156     source $VENV_DIR/bin/activate
157     SUMO_PATH=$1
158
159     _cdsitepackages
160
161     # the file name may be like 'leap.bitmask-0.9.0rc1-12-g59bc704-SUMO.tar.gz',
162     # but it also can be 'leap.bitmask-latest-SUMO.tar.gz'
163     # and the root path inside the archive for that file would be
164     # 'leap.bitmask-0.9.0rc1-12-g59bc704-SUMO' in both cases.
165     base_path=`tar tzf $SUMO_PATH | head -n 1`
166     target_subpath=src/leap
167     tar xzf $SUMO_PATH $base_path$target_subpath --strip-components=2
168 }
169
170 add_files(){
171     # HACK: this is only a hack around a missing pyinstaller hook
172     status="hack: add files"
173     echo "${cc_green}Status: $status...${cc_normal}"
174     set -x  # show commands
175
176     _cdsitepackages
177
178     dest="$REPOS_ROOT/bitmask_client/dist/bitmask/u1db/backends/"
179     mkdir -p $dest
180     cp u1db/backends/dbschema.sql $dest
181
182     set +x
183     echo "${cc_green}Status: $status done.${cc_normal}"
184 }
185
186 tweak_linux(){
187     status="tweaking linux specific stuff"
188     echo "${cc_green}Status: $status...${cc_normal}"
189     set -x  # show commands
190
191     cd $REPOS_ROOT/bitmask_client/dist/bitmask
192     mv bitmask bitmask-app
193
194     cd $REPOS_ROOT/bitmask_client
195     cp pkg/linux/bitmask-launcher dist/bitmask/bitmask
196
197     cd $REPOS_ROOT/bitmask_client
198     mkdir -p dist/bitmask/helpers
199     cp pkg/linux/bitmask-root dist/bitmask/helpers/
200
201     # NOTE: TUF stuff is needed for all OSs, not just linux
202     # TODO: copy launcher.conf for TUF updates
203     # cp pkg/tuf/launcher.conf dist/bitmask/helpers/
204
205     set +x
206     echo "${cc_green}Status: $status done.${cc_normal}"
207 }
208
209 tweak_zope(){
210     # - create bare zope dir in site-packages
211     # - touch zope/__init__.py
212     # - move the zope.interface folder to zope/
213     # - move the zope.proxy folder to zope/
214     # - remove the zope* eggs in site-packages
215     # - remove any refs to these eggs in easy-install.pth ?? (unsure about this, talking from the top of my head) 
216     status="tweaking zope packages"
217     echo "${cc_green}Status: $status...${cc_normal}"
218     set -x  # show commands
219
220     _cdsitepackages
221     mkdir -p zope
222     touch zope/__init__.py
223     # zope/interface and zope/proxy already in place
224     rm -fr zope.{interface,proxy}*.egg-info
225     rm -f zope.{interface,proxy}*-nspkg.pth
226     cd -
227
228     set +x
229     echo "${cc_green}Status: $status done.${cc_normal}"
230 }
231
232 run_pyinstaller(){
233     status="running pyinstaller"
234     echo "${cc_green}Status: $status...${cc_normal}"
235     set -x  # show commands
236
237     spec_file=$1
238     cd $REPOS_ROOT/bitmask_client
239     make clean_pkg
240
241     # HACK: path needed by bitmask_client makefile
242     mkdir -p $REPOS_ROOT/bitmask_client/dist/Bitmask.app/Contents/Resources/
243
244     make pyinst
245
246     set +x
247     echo "${cc_green}Status: $status done.${cc_normal}"
248 }
249
250 archive_bundle(){
251     # - rename dist/bitmask distribution folder to bitmask-<release>-<date?>
252     status="creating bundle archive"
253     echo "${cc_green}Status: $status...${cc_normal}"
254     set -x  # show commands
255
256     source $VENV_DIR/bin/activate
257     version=`python -c "import leap.bitmask; print leap.bitmask.__version__"`
258
259     cd $REPOS_ROOT/bitmask_client/dist/
260     # TODO: add version to bundle name
261     # `git describe` won't work if shallow clone (--depth 1)
262     BUNDLE_NAME="bitmask-$version"
263     mv bitmask $BUNDLE_NAME
264     tar czf $SCRIPT_DIR/$BUNDLE_NAME.tar.gz $BUNDLE_NAME
265
266     set +x
267     echo "${cc_green}Status: $status done.${cc_normal}"
268 }
269
270 if [[ -z $1 ]]; then
271     echo "Bitmask pyinstaller creator."
272     echo "You need to specify the sumo tarball path as a parameter."
273     echo "Usage:"
274     echo "  $0 path/to/sumo.tar.gz"
275     exit 1
276 fi
277
278 sumo_path=`realpath $1`
279
280 create_venv
281 install_pyinstaller
282 clone_repos
283 install_requirements
284 install_sumo $sumo_path
285 tweak_zope
286 run_pyinstaller
287 add_files
288 tweak_linux
289 archive_bundle