tools/update-packaging/common.sh

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:665612f085d3
1 #!/bin/bash
2 # This Source Code Form is subject to the terms of the Mozilla Public
3 # License, v. 2.0. If a copy of the MPL was not distributed with this
4 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
6 #
7 # Code shared by update packaging scripts.
8 # Author: Darin Fisher
9 #
10
11 # -----------------------------------------------------------------------------
12 QUIET=0
13
14 # By default just assume that these tools exist on our path
15 MAR=${MAR:-mar}
16 BZIP2=${BZIP2:-bzip2}
17 MBSDIFF=${MBSDIFF:-mbsdiff}
18
19 # -----------------------------------------------------------------------------
20 # Helper routines
21
22 notice() {
23 echo "$*" 1>&2
24 }
25
26 verbose_notice() {
27 if [ $QUIET -eq 0 ]; then
28 notice "$*"
29 fi
30 }
31
32 get_file_size() {
33 info=($(ls -ln "$1"))
34 echo ${info[4]}
35 }
36
37 copy_perm() {
38 reference="$1"
39 target="$2"
40
41 if [ -x "$reference" ]; then
42 chmod 0755 "$target"
43 else
44 chmod 0644 "$target"
45 fi
46 }
47
48 make_add_instruction() {
49 f="$1"
50 filev2="$2"
51 # The third param will be an empty string when a file add instruction is only
52 # needed in the version 2 manifest. This only happens when the file has an
53 # add-if-not instruction in the version 3 manifest. This is due to the
54 # precomplete file prior to the version 3 manifest having a remove instruction
55 # for this file so the file is removed before applying a complete update.
56 filev3="$3"
57
58 # Used to log to the console
59 if [ $4 ]; then
60 forced=" (forced)"
61 else
62 forced=
63 fi
64
65 is_extension=$(echo "$f" | grep -c 'distribution/extensions/.*/')
66 if [ $is_extension = "1" ]; then
67 # Use the subdirectory of the extensions folder as the file to test
68 # before performing this add instruction.
69 testdir=$(echo "$f" | sed 's/\(.*distribution\/extensions\/[^\/]*\)\/.*/\1/')
70 verbose_notice " add-if \"$testdir\" \"$f\""
71 echo "add-if \"$testdir\" \"$f\"" >> "$filev2"
72 if [ ! "$filev3" = "" ]; then
73 echo "add-if \"$testdir\" \"$f\"" >> "$filev3"
74 fi
75 else
76 verbose_notice " add \"$f\"$forced"
77 echo "add \"$f\"" >> "$filev2"
78 if [ ! "$filev3" = "" ]; then
79 echo "add \"$f\"" >> "$filev3"
80 fi
81 fi
82 }
83
84 check_for_add_if_not_update() {
85 add_if_not_file_chk="$1"
86
87 if [ `basename $add_if_not_file_chk` = "channel-prefs.js" -o \
88 `basename $add_if_not_file_chk` = "update-settings.ini" ]; then
89 ## "true" *giggle*
90 return 0;
91 fi
92 ## 'false'... because this is bash. Oh yay!
93 return 1;
94 }
95
96 check_for_add_to_manifestv2() {
97 add_if_not_file_chk="$1"
98
99 if [ `basename $add_if_not_file_chk` = "update-settings.ini" ]; then
100 ## "true" *giggle*
101 return 0;
102 fi
103 ## 'false'... because this is bash. Oh yay!
104 return 1;
105 }
106
107 make_add_if_not_instruction() {
108 f="$1"
109 filev3="$2"
110
111 verbose_notice " add-if-not \"$f\" \"$f\""
112 echo "add-if-not \"$f\" \"$f\"" >> "$filev3"
113 }
114
115 make_addsymlink_instruction() {
116 link="$1"
117 target="$2"
118 filev2="$3"
119 filev3="$4"
120
121 verbose_notice " addsymlink: $link -> $target"
122 echo "addsymlink \"$link\" \"$target\"" >> "$filev2"
123 echo "addsymlink \"$link\" \"$target\"" >> "$filev3"
124 }
125
126 make_patch_instruction() {
127 f="$1"
128 filev2="$2"
129 filev3="$3"
130
131 is_extension=$(echo "$f" | grep -c 'distribution/extensions/.*/')
132 if [ $is_extension = "1" ]; then
133 # Use the subdirectory of the extensions folder as the file to test
134 # before performing this add instruction.
135 testdir=$(echo "$f" | sed 's/\(.*distribution\/extensions\/[^\/]*\)\/.*/\1/')
136 verbose_notice " patch-if \"$testdir\" \"$f.patch\" \"$f\""
137 echo "patch-if \"$testdir\" \"$f.patch\" \"$f\"" >> "$filev2"
138 echo "patch-if \"$testdir\" \"$f.patch\" \"$f\"" >> "$filev3"
139 else
140 verbose_notice " patch \"$f.patch\" \"$f\""
141 echo "patch \"$f.patch\" \"$f\"" >> "$filev2"
142 echo "patch \"$f.patch\" \"$f\"" >> "$filev3"
143 fi
144 }
145
146 append_remove_instructions() {
147 dir="$1"
148 filev2="$2"
149 filev3="$3"
150
151 if [ -f "$dir/removed-files" ]; then
152 prefix=
153 listfile="$dir/removed-files"
154 elif [ -f "$dir/Contents/MacOS/removed-files" ]; then
155 prefix=Contents/MacOS/
156 listfile="$dir/Contents/MacOS/removed-files"
157 fi
158 if [ -n "$listfile" ]; then
159 # Map spaces to pipes so that we correctly handle filenames with spaces.
160 files=($(cat "$listfile" | tr " " "|" | sort -r))
161 num_files=${#files[*]}
162 for ((i=0; $i<$num_files; i=$i+1)); do
163 # Map pipes back to whitespace and remove carriage returns
164 f=$(echo ${files[$i]} | tr "|" " " | tr -d '\r')
165 # Trim whitespace
166 f=$(echo $f)
167 # Exclude blank lines.
168 if [ -n "$f" ]; then
169 # Exclude comments
170 if [ ! $(echo "$f" | grep -c '^#') = 1 ]; then
171 # Normalize the path to the root of the Mac OS X bundle if necessary
172 fixedprefix="$prefix"
173 if [ $prefix ]; then
174 if [ $(echo "$f" | grep -c '^\.\./') = 1 ]; then
175 if [ $(echo "$f" | grep -c '^\.\./\.\./') = 1 ]; then
176 f=$(echo $f | sed -e 's:^\.\.\/\.\.\/::')
177 fixedprefix=""
178 else
179 f=$(echo $f | sed -e 's:^\.\.\/::')
180 fixedprefix=$(echo "$prefix" | sed -e 's:[^\/]*\/$::')
181 fi
182 fi
183 fi
184 if [ $(echo "$f" | grep -c '\/$') = 1 ]; then
185 verbose_notice " rmdir \"$fixedprefix$f\""
186 echo "rmdir \"$fixedprefix$f\"" >> "$filev2"
187 echo "rmdir \"$fixedprefix$f\"" >> "$filev3"
188 elif [ $(echo "$f" | grep -c '\/\*$') = 1 ]; then
189 # Remove the *
190 f=$(echo "$f" | sed -e 's:\*$::')
191 verbose_notice " rmrfdir \"$fixedprefix$f\""
192 echo "rmrfdir \"$fixedprefix$f\"" >> "$filev2"
193 echo "rmrfdir \"$fixedprefix$f\"" >> "$filev3"
194 else
195 verbose_notice " remove \"$fixedprefix$f\""
196 echo "remove \"$fixedprefix$f\"" >> "$filev2"
197 echo "remove \"$fixedprefix$f\"" >> "$filev3"
198 fi
199 fi
200 fi
201 done
202 fi
203 }
204
205 # List all files in the current directory, stripping leading "./"
206 # Pass a variable name and it will be filled as an array.
207 # To support Tor Browser updates, skip the following files:
208 # TorBrowser/Data/Browser/profiles.ini
209 # TorBrowser/Data/Browser/profile.default/bookmarks.html
210 # TorBrowser/Data/Tor/torrc
211 list_files() {
212 count=0
213
214 find . -type f \
215 ! -name "update.manifest" \
216 ! -name "updatev2.manifest" \
217 ! -name "updatev3.manifest" \
218 ! -name "temp-dirlist" \
219 ! -name "temp-filelist" \
220 | sed 's/\.\/\(.*\)/\1/' \
221 | sort -r > "temp-filelist"
222 while read file; do
223 if [ "$file" = "TorBrowser/Data/Browser/profiles.ini" -o \
224 "$file" = "TorBrowser/Data/Browser/profile.default/bookmarks.html" -o \
225 "$file" = "TorBrowser/Data/Tor/torrc" ]; then
226 continue;
227 fi
228 eval "${1}[$count]=\"$file\""
229 (( count++ ))
230 done < "temp-filelist"
231 rm "temp-filelist"
232 }
233
234 # List all directories in the current directory, stripping leading "./"
235 list_dirs() {
236 count=0
237
238 find . -type d \
239 ! -name "." \
240 ! -name ".." \
241 | sed 's/\.\/\(.*\)/\1/' \
242 | sort -r > "temp-dirlist"
243 while read dir; do
244 eval "${1}[$count]=\"$dir\""
245 (( count++ ))
246 done < "temp-dirlist"
247 rm "temp-dirlist"
248 }
249
250 # List all symbolic links in the current directory, stripping leading "./"
251 list_symlinks() {
252 count=0
253
254 find . -type l \
255 | sed 's/\.\/\(.*\)/\1/' \
256 | sort -r > "temp-symlinklist"
257 while read symlink; do
258 target=$(readlink "$symlink")
259 eval "${1}[$count]=\"$symlink\""
260 eval "${2}[$count]=\"$target\""
261 (( count++ ))
262 done < "temp-symlinklist"
263 rm "temp-symlinklist"
264 }

mercurial