Revised AppImage download script
[geeqie.git] / scripts / geeqie-download-appimage.sh
1 #!/bin/sh
2 #**********************************************************************
3 # Copyright (C) 2023 - The Geeqie Team
4 #
5 # Author: Colin Clark
6 #
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License along
18 # with this program; if not, write to the Free Software Foundation, Inc.,
19 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #**********************************************************************
21
22 ## @file
23 ## @brief Download full and minimal AppImages from the Continuous build release on GitHub.
24 ## Optionally extract the full size AppImage.
25 ##
26 ## The user may modify the symbolic links as appropriate.
27 ##
28 ## Downloads will not be made unless the server version is newer than the local file.
29 ##
30
31 version="2023-09-08"
32 backups=3
33
34 show_help()
35 {
36         printf "Download the latest Geeqie AppImages from the
37 Continuous Build release on GitHub.
38
39 -b --backups <n> Set number of backups (default is 3)
40 -d --desktop Install desktop icon and menu item
41 -e --extract Extract AppImage
42 -h --help Display this message
43 -m --minimal Download minimal version of AppImage
44 -r --revert <n> Revert to downloaded AppImage backup
45 -v --version Display version of this file
46
47 The Continuous Build release is updated each
48 time the source code is updated.
49
50 The default action is to download an AppImage to
51 \$HOME/bin. A symbolic link will be set so that
52 \"geeqie\" points to the executable
53
54 No downloads will be made unless the file on the
55 server at GitHub is newer than the local file.
56
57 The full size AppImage is about 120MB and the
58 minimal AppImage is about 10MB. Therefore the full
59 size version will load much slower and will have
60 a slightly slower run speed.
61
62 However the minimal version has limited capabilities
63 compared to the full size version.
64
65 The minimal option (-m or --minimal) will download
66 the minimal version.
67
68 The extract option (-e or --extract) will extract
69 The contents of the AppImage into a sub-directory
70 of \$HOME/bin, and then set the symbolic link to the
71 extracted executable.
72
73 This will take up some disk space, but the
74 extracted executable will run as fast as a
75 packaged release.
76 \n\n"
77 }
78
79 show_version()
80 {
81         printf "Version: %s\n" "$version"
82 }
83
84 architecture=$(arch)
85
86 extract=0
87 minimal=""
88 desktop=0
89 backups_option=0
90 revert=0
91 revert_option=0
92
93 while :
94 do
95         case $1 in
96                 -h | -\? | --help)
97                         show_help
98
99                         exit 0
100                         ;;
101                 -v | --version)
102                         show_version
103
104                         exit 0
105                         ;;
106                 -d | --desktop)
107                         desktop=1
108                         ;;
109                 -b | --backups)
110                         backups_option=1
111                         if [ -n "$2" ]
112                         then
113                                 backups=$2
114                                 shift
115                         else
116                                 printf '"--backups" requires a non-empty option argument.\n' >&2
117
118                                 exit 1
119                         fi
120                         ;;
121                 -r | --revert)
122                         revert_option=1
123                         if [ -n "$2" ]
124                         then
125                                 revert=$2
126                                 shift
127                         else
128                                 printf '"--revert" requires a non-empty option argument.\n' >&2
129
130                                 exit 1
131                         fi
132                         ;;
133                 -e | --extract)
134                         extract=1
135                         ;;
136                 -m | --minimal)
137                         minimal="-minimal"
138                         ;;
139                 --) # End of all options.
140                         shift
141                         break
142                         ;;
143                 ?*)
144                         printf 'Unknown option %s\n' "$1" >&2
145
146                         exit 1
147                         ;;
148                 *)
149                         break
150                         ;;
151         esac
152
153         shift
154 done
155
156 if [ ! -d "$HOME/bin" ]
157 then
158         printf "\$HOME/bin does not exist.
159 It is required for this script to run.\n"
160
161         exit 1
162 fi
163
164 cd "$HOME/bin/" || exit 1
165
166 if [ "$backups_option" -eq 1 ] && {
167         [ "$minimal" = "-minimal" ] || [ "$extract" -eq 1 ] || [ "$revert_option" -eq 1 ]
168 }
169 then
170         printf "backups must be the only option\n"
171
172         exit 1
173 fi
174
175 if [ "$desktop" -eq 1 ] && {
176         [ "$minimal" = "-minimal" ] || [ "$extract" -eq 1 ]
177 }
178 then
179         printf "desktop must be the only option\n"
180
181         exit 1
182 fi
183
184 if [ "$backups_option" -eq 1 ]
185 then
186         if ! [ "$backups" -gt 0 ] 2> /dev/null
187         then
188                 printf "%s is not an integer\n" "$backups"
189
190                 exit 1
191         else
192                 tmp_file=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
193                 cp "$0" "$tmp_file"
194                 sed --in-place "s/^backups=.*/backups=$backups/" "$tmp_file"
195                 chmod +x "$tmp_file"
196                 mv "$tmp_file" "$0"
197
198                 exit 0
199         fi
200 fi
201
202 if [ "$desktop" -eq 1 ]
203 then
204         if [ -f "$HOME/Desktop/geeqie.desktop" ]
205         then
206                 printf "Desktop file already exists\n"
207
208                 exit 0
209         fi
210
211         file_count=$(find "$HOME/bin/" -name "Geeqie*latest*\.AppImage" -print | wc -l)
212         if [ "$file_count" -eq 0 ]
213         then
214                 printf "No AppImages have been downloaded\n"
215
216                 exit 1
217         fi
218
219         tmp_dir=$(mktemp --directory "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
220         cd "$tmp_dir" || exit 1
221
222         app=$(find "$HOME/bin/" -name "Geeqie*latest*\.AppImage" -print | sort --reverse | head -1)
223         $app --appimage-extract "usr/local/share/applications/geeqie.desktop"
224         $app --appimage-extract "usr/local/share/pixmaps/geeqie.png"
225         xdg-desktop-icon install --novendor "squashfs-root/usr/local/share/applications/geeqie.desktop"
226         xdg-icon-resource install --novendor --size 48 "squashfs-root/usr/local/share/pixmaps/geeqie.png"
227         xdg-desktop-menu install --novendor "squashfs-root/usr/local/share/applications/geeqie.desktop"
228         rm --recursive --force "$tmp_dir"
229
230         exit 0
231 fi
232
233 if [ "$revert_option" -eq 1 ]
234 then
235         if ! [ "$revert" -gt 0 ] 2> /dev/null
236         then
237                 printf "%s is not an integer\n" "$revert"
238
239                 exit 1
240         else
241                 if ! [ -f "$HOME/bin/Geeqie$minimal-latest-$architecture.AppImage.$revert" ]
242                 then
243                         printf "Backup $HOME/bin/Geeqie%s-latest-$architecture.AppImage.%s does not exist\n" "$minimal" "$revert"
244
245                         exit 1
246                 fi
247
248                 if [ "$extract" -eq 1 ]
249                 then
250                         rm --recursive --force "Geeqie$minimal-latest-$architecture-AppImage"
251                         mkdir "Geeqie$minimal-latest-$architecture-AppImage"
252                         cd "Geeqie$minimal-latest-$architecture-AppImage" || exit 1
253
254                         printf "Extracting AppImage\n"
255                         ../"Geeqie$minimal-latest-$architecture.AppImage.$revert" --appimage-extract | cut --characters 1-50 | tr '\n' '\r'
256                         printf "\nExtraction complete\n"
257
258                         cd ..
259                         ln --symbolic --force "./Geeqie$minimal-latest-$architecture-AppImage/squashfs-root/AppRun" geeqie
260                 else
261                         ln --symbolic --force "$HOME/bin/Geeqie$minimal-latest-$architecture.AppImage.$revert" geeqie
262                 fi
263
264                 exit 0
265         fi
266 fi
267
268 log_file=$(mktemp "${TMPDIR:-/tmp}/geeqie.XXXXXXXXXX")
269
270 wget --no-verbose --show-progress --backups="$backups" --output-file="$log_file" --timestamping "https://github.com/BestImageViewer/geeqie/releases/download/continuous/Geeqie$minimal-latest-$architecture.AppImage"
271
272 download_size=$(stat --printf "%s" "$log_file")
273 rm "$log_file"
274
275 # If a new file was downloaded, check if extraction is required
276 if [ "$download_size" -gt 0 ]
277 then
278         chmod +x "Geeqie$minimal-latest-$architecture.AppImage"
279
280         if [ "$extract" -eq 1 ]
281         then
282                 rm --recursive --force "Geeqie$minimal-latest-$architecture-AppImage"
283                 mkdir "Geeqie$minimal-latest-$architecture-AppImage"
284                 cd "Geeqie$minimal-latest-$architecture-AppImage" || exit 1
285
286                 printf "Extracting AppImage\n"
287                 ../"Geeqie$minimal-latest-$architecture.AppImage" --appimage-extract | cut --characters 1-50 | tr '\n' '\r'
288                 printf "\nExtraction complete\n"
289
290                 cd ..
291                 ln --symbolic --force "./Geeqie$minimal-latest-$architecture-AppImage/squashfs-root/AppRun" geeqie
292         else
293                 ln --symbolic --force "Geeqie$minimal-latest-$architecture.AppImage" geeqie
294         fi
295 fi