Merge lp:~qzhang/lava-dispatcher/another-inject-kernel into lp:lava-dispatcher
- another-inject-kernel
- Merge into trunk
Status: | Merged |
---|---|
Merged at revision: | 110 |
Proposed branch: | lp:~qzhang/lava-dispatcher/another-inject-kernel |
Merge into: | lp:lava-dispatcher |
Diff against target: |
309 lines (+159/-14) 6 files modified
doc/android-new-kernel.json (+37/-0) doc/lava-new-kernel.json (+30/-0) lava_dispatcher/actions/android_deploy.py (+28/-7) lava_dispatcher/actions/deploy.py (+58/-5) lava_dispatcher/client.py (+1/-1) lava_dispatcher/utils.py (+5/-1) |
To merge this branch: | bzr merge lp:~qzhang/lava-dispatcher/another-inject-kernel |
Related bugs: | |
Related blueprints: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Linaro Validation Team | Pending | ||
Review via email: mp+72927@code.launchpad.net |
Commit message
Description of the change
Another injecting kernel, use l-h-r now.
1. use linaro-
2. tested once and pass
3. only support new kernel in deb format in normal image and tarball format in Android image.
4. job file like:
"actions": [
{
"command": "deploy_
"parameters":
{
"rootfs":
"http://
"hwpack":
"http://
"http://
}
},
Michael Hudson-Doyle (mwhudson) wrote : | # |
- 101. By Spring Zhang
-
sync with mainline
- 102. By Spring Zhang
-
sync with mainline
- 103. By Spring Zhang
-
sync with mainline
- 104. By Spring Zhang
-
sync with mainline
- 105. By Spring Zhang
-
fix another OSError 18 link error
- 106. By Spring Zhang
-
fix minor bugs
Preview Diff
1 | === added file 'doc/android-new-kernel.json' | |||
2 | --- doc/android-new-kernel.json 1970-01-01 00:00:00 +0000 | |||
3 | +++ doc/android-new-kernel.json 2011-09-15 07:09:50 +0000 | |||
4 | @@ -0,0 +1,37 @@ | |||
5 | 1 | { | ||
6 | 2 | "job_name": "android_new_kernel", | ||
7 | 3 | "image_type": "android", | ||
8 | 4 | "target": "panda01", | ||
9 | 5 | "timeout": 18000, | ||
10 | 6 | "actions": [ | ||
11 | 7 | { | ||
12 | 8 | "command": "deploy_linaro_android_image", | ||
13 | 9 | "parameters": | ||
14 | 10 | { | ||
15 | 11 | "boot": "https://android-build.linaro.org/jenkins/job/linaro-android_leb-panda/61/artifact/build/out/target/product/pandaboard/boot.tar.bz2", | ||
16 | 12 | "system": "https://android-build.linaro.org/jenkins/job/linaro-android_leb-panda/61/artifact/build/out/target/product/pandaboard/system.tar.bz2", | ||
17 | 13 | "data": "https://android-build.linaro.org/jenkins/job/linaro-android_leb-panda/61/artifact/build/out/target/product/pandaboard/userdata.tar.bz2", | ||
18 | 14 | "pkg": "https://android-build.linaro.org/jenkins/job/linaro-android_leb-panda/171/artifact/build/out/target/product/pandaboard/boot.tar.bz2" | ||
19 | 15 | }, | ||
20 | 16 | "metadata": | ||
21 | 17 | { | ||
22 | 18 | "rootfs.type": "android", | ||
23 | 19 | "rootfs.build": "61" | ||
24 | 20 | } | ||
25 | 21 | }, | ||
26 | 22 | { | ||
27 | 23 | "command": "boot_linaro_android_image" | ||
28 | 24 | }, | ||
29 | 25 | { | ||
30 | 26 | "command": "test_android_basic" | ||
31 | 27 | }, | ||
32 | 28 | { | ||
33 | 29 | "command": "submit_results_on_host", | ||
34 | 30 | "parameters": | ||
35 | 31 | { | ||
36 | 32 | "server": "http://validation.linaro.org/launch-control", | ||
37 | 33 | "stream": "/anonymous/android-panda01-basic/" | ||
38 | 34 | } | ||
39 | 35 | } | ||
40 | 36 | ] | ||
41 | 37 | } | ||
42 | 0 | 38 | ||
43 | === renamed file 'doc/lava-ltp-job' => 'doc/lava-ltp-job.json' | |||
44 | === added file 'doc/lava-new-kernel.json' | |||
45 | --- doc/lava-new-kernel.json 1970-01-01 00:00:00 +0000 | |||
46 | +++ doc/lava-new-kernel.json 2011-09-15 07:09:50 +0000 | |||
47 | @@ -0,0 +1,30 @@ | |||
48 | 1 | { | ||
49 | 2 | "job_name": "new-kernel", | ||
50 | 3 | "target": "mx53loco01", | ||
51 | 4 | "timeout": 6000, | ||
52 | 5 | "actions": [ | ||
53 | 6 | { | ||
54 | 7 | "command": "deploy_linaro_image", | ||
55 | 8 | "parameters": | ||
56 | 9 | { | ||
57 | 10 | "rootfs": | ||
58 | 11 | "http://snapshots.linaro.org/11.05-daily/linaro-nano/20110612/0/images/tar/nano-n-tar-20110612-0.tar.gz", | ||
59 | 12 | "hwpack": | ||
60 | 13 | "http://snapshots.linaro.org/11.05-daily/linaro-hwpacks/lt-mx53loco/20110609/0/images/hwpack/hwpack_linaro-lt-mx53loco_20110609-0_armel_supported.tar.gz", | ||
61 | 14 | "kernel_matrix":[ | ||
62 | 15 | "http://pkgserver/original/linux-image-2.6.38-1000-linaro-lt-mx5_2.6.38-1000.7_armel.deb", "linux-image-2.6.38"] | ||
63 | 16 | } | ||
64 | 17 | }, | ||
65 | 18 | { | ||
66 | 19 | "command": "boot_linaro_image" | ||
67 | 20 | }, | ||
68 | 21 | { | ||
69 | 22 | "command": "submit_results", | ||
70 | 23 | "parameters": | ||
71 | 24 | { | ||
72 | 25 | "server": "http://validation.linaro.org/launch-control", | ||
73 | 26 | "stream": "/anonymous/testresult/" | ||
74 | 27 | } | ||
75 | 28 | } | ||
76 | 29 | ] | ||
77 | 30 | } | ||
78 | 0 | 31 | ||
79 | === modified file 'lava_dispatcher/actions/android_deploy.py' | |||
80 | --- lava_dispatcher/actions/android_deploy.py 2011-09-05 22:39:47 +0000 | |||
81 | +++ lava_dispatcher/actions/android_deploy.py 2011-09-15 07:09:50 +0000 | |||
82 | @@ -29,7 +29,7 @@ | |||
83 | 29 | from lava_dispatcher.client import CriticalError | 29 | from lava_dispatcher.client import CriticalError |
84 | 30 | 30 | ||
85 | 31 | class cmd_deploy_linaro_android_image(BaseAction): | 31 | class cmd_deploy_linaro_android_image(BaseAction): |
87 | 32 | def run(self, boot, system, data, use_cache=True): | 32 | def run(self, boot, system, data, pkg=None, use_cache=True): |
88 | 33 | LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir | 33 | LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir |
89 | 34 | LAVA_IMAGE_URL = self.context.lava_image_url | 34 | LAVA_IMAGE_URL = self.context.lava_image_url |
90 | 35 | client = self.client | 35 | client = self.client |
91 | @@ -49,8 +49,8 @@ | |||
92 | 49 | raise CriticalError("Unable to reach LAVA server, check network") | 49 | raise CriticalError("Unable to reach LAVA server, check network") |
93 | 50 | 50 | ||
94 | 51 | try: | 51 | try: |
97 | 52 | boot_tbz2, system_tbz2, data_tbz2 = self.download_tarballs(boot, | 52 | boot_tbz2, system_tbz2, data_tbz2, pkg_tbz2 = \ |
98 | 53 | system, data, use_cache) | 53 | self.download_tarballs(boot, system, data, pkg, use_cache) |
99 | 54 | except: | 54 | except: |
100 | 55 | tb = traceback.format_exc() | 55 | tb = traceback.format_exc() |
101 | 56 | client.sio.write(tb) | 56 | client.sio.write(tb) |
102 | @@ -66,9 +66,16 @@ | |||
103 | 66 | LAVA_IMAGE_URL, system_tarball]) | 66 | LAVA_IMAGE_URL, system_tarball]) |
104 | 67 | data_url = '/'.join(u.strip('/') for u in [ | 67 | data_url = '/'.join(u.strip('/') for u in [ |
105 | 68 | LAVA_IMAGE_URL, data_tarball]) | 68 | LAVA_IMAGE_URL, data_tarball]) |
106 | 69 | if pkg_tbz2: | ||
107 | 70 | pkg_tarball = pkg_tbz2.replace(LAVA_IMAGE_TMPDIR, '') | ||
108 | 71 | pkg_url = '/'.join(u.strip('/') for u in [ | ||
109 | 72 | LAVA_IMAGE_URL, pkg_tarball]) | ||
110 | 69 | 73 | ||
111 | 70 | try: | 74 | try: |
113 | 71 | self.deploy_linaro_android_testboot(boot_url) | 75 | if pkg_tbz2: |
114 | 76 | self.deploy_linaro_android_testboot(boot_url, pkg_url) | ||
115 | 77 | else: | ||
116 | 78 | self.deploy_linaro_android_testboot(boot_url) | ||
117 | 72 | self.deploy_linaro_android_testrootfs(system_url) | 79 | self.deploy_linaro_android_testrootfs(system_url) |
118 | 73 | self.purge_linaro_android_sdcard() | 80 | self.purge_linaro_android_sdcard() |
119 | 74 | except: | 81 | except: |
120 | @@ -78,12 +85,14 @@ | |||
121 | 78 | finally: | 85 | finally: |
122 | 79 | shutil.rmtree(self.tarball_dir) | 86 | shutil.rmtree(self.tarball_dir) |
123 | 80 | 87 | ||
125 | 81 | def download_tarballs(self, boot_url, system_url, data_url, use_cache=True): | 88 | def download_tarballs(self, boot_url, system_url, data_url, pkg_url=None, |
126 | 89 | use_cache=True): | ||
127 | 82 | """Download tarballs from a boot, system and data tarball url | 90 | """Download tarballs from a boot, system and data tarball url |
128 | 83 | 91 | ||
129 | 84 | :param boot_url: url of the Linaro Android boot tarball to download | 92 | :param boot_url: url of the Linaro Android boot tarball to download |
130 | 85 | :param system_url: url of the Linaro Android system tarball to download | 93 | :param system_url: url of the Linaro Android system tarball to download |
131 | 86 | :param data_url: url of the Linaro Android data tarball to download | 94 | :param data_url: url of the Linaro Android data tarball to download |
132 | 95 | :param pkg_url: url of the custom kernel tarball to download | ||
133 | 87 | :param use_cache: whether or not to use the cached copy (if it exists) | 96 | :param use_cache: whether or not to use the cached copy (if it exists) |
134 | 88 | """ | 97 | """ |
135 | 89 | lava_cachedir = self.context.lava_cachedir | 98 | lava_cachedir = self.context.lava_cachedir |
136 | @@ -96,13 +105,21 @@ | |||
137 | 96 | boot_path = download_with_cache(boot_url, tarball_dir, lava_cachedir) | 105 | boot_path = download_with_cache(boot_url, tarball_dir, lava_cachedir) |
138 | 97 | system_path = download_with_cache(system_url, tarball_dir, lava_cachedir) | 106 | system_path = download_with_cache(system_url, tarball_dir, lava_cachedir) |
139 | 98 | data_path = download_with_cache(data_url, tarball_dir, lava_cachedir) | 107 | data_path = download_with_cache(data_url, tarball_dir, lava_cachedir) |
140 | 108 | if pkg_url: | ||
141 | 109 | pkg_path = download_with_cache(pkg_url, tarball_dir) | ||
142 | 110 | else: | ||
143 | 111 | pkg_path = None | ||
144 | 99 | else: | 112 | else: |
145 | 100 | boot_path = download(boot_url, tarball_dir) | 113 | boot_path = download(boot_url, tarball_dir) |
146 | 101 | system_path = download(system_url, tarball_dir) | 114 | system_path = download(system_url, tarball_dir) |
147 | 102 | data_path = download(data_url, tarball_dir) | 115 | data_path = download(data_url, tarball_dir) |
149 | 103 | return boot_path, system_path, data_path | 116 | if pkg_url: |
150 | 117 | pkg_path = download(pkg_url, tarball_dir) | ||
151 | 118 | else: | ||
152 | 119 | pkg_path = None | ||
153 | 120 | return boot_path, system_path, data_path, pkg_path | ||
154 | 104 | 121 | ||
156 | 105 | def deploy_linaro_android_testboot(self, boottbz2): | 122 | def deploy_linaro_android_testboot(self, boottbz2, pkgbz2=None): |
157 | 106 | client = self.client | 123 | client = self.client |
158 | 107 | client.run_cmd_master('mkfs.vfat /dev/disk/by-label/testboot ' | 124 | client.run_cmd_master('mkfs.vfat /dev/disk/by-label/testboot ' |
159 | 108 | '-n testboot') | 125 | '-n testboot') |
160 | @@ -111,6 +128,10 @@ | |||
161 | 111 | client.run_cmd_master('mount /dev/disk/by-label/testboot ' | 128 | client.run_cmd_master('mount /dev/disk/by-label/testboot ' |
162 | 112 | '/mnt/lava/boot') | 129 | '/mnt/lava/boot') |
163 | 113 | client.run_cmd_master('wget -qO- %s |tar --numeric-owner -C /mnt/lava -xjf -' % boottbz2) | 130 | client.run_cmd_master('wget -qO- %s |tar --numeric-owner -C /mnt/lava -xjf -' % boottbz2) |
164 | 131 | if pkgbz2: | ||
165 | 132 | client.run_shell_command( | ||
166 | 133 | 'wget -qO- %s |tar --numeric-owner -C /mnt/lava -xjf -' | ||
167 | 134 | % pkgbz2, response = MASTER_STR) | ||
168 | 114 | 135 | ||
169 | 115 | self.recreate_uInitrd() | 136 | self.recreate_uInitrd() |
170 | 116 | 137 | ||
171 | 117 | 138 | ||
172 | === modified file 'lava_dispatcher/actions/deploy.py' | |||
173 | --- lava_dispatcher/actions/deploy.py 2011-09-08 23:35:05 +0000 | |||
174 | +++ lava_dispatcher/actions/deploy.py 2011-09-15 07:09:50 +0000 | |||
175 | @@ -15,11 +15,11 @@ | |||
176 | 15 | # GNU General Public License for more details. | 15 | # GNU General Public License for more details. |
177 | 16 | # | 16 | # |
178 | 17 | # You should have received a copy of the GNU General Public License | 17 | # You should have received a copy of the GNU General Public License |
181 | 18 | # along | 18 | # along with this program; if not, see <http://www.gnu.org/licenses>. |
180 | 19 | # with this program; if not, see <http://www.gnu.org/licenses>. | ||
182 | 20 | 19 | ||
183 | 21 | from commands import getoutput, getstatusoutput | 20 | from commands import getoutput, getstatusoutput |
184 | 22 | import os | 21 | import os |
185 | 22 | import sys | ||
186 | 23 | import re | 23 | import re |
187 | 24 | import shutil | 24 | import shutil |
188 | 25 | import traceback | 25 | import traceback |
189 | @@ -31,13 +31,15 @@ | |||
190 | 31 | 31 | ||
191 | 32 | 32 | ||
192 | 33 | class cmd_deploy_linaro_image(BaseAction): | 33 | class cmd_deploy_linaro_image(BaseAction): |
194 | 34 | def run(self, hwpack, rootfs, use_cache=True): | 34 | def run(self, hwpack, rootfs, kernel_matrix=None, use_cache=True): |
195 | 35 | LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir | 35 | LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir |
196 | 36 | LAVA_IMAGE_URL = self.context.lava_image_url | 36 | LAVA_IMAGE_URL = self.context.lava_image_url |
197 | 37 | client = self.client | 37 | client = self.client |
198 | 38 | print "deploying on %s" % client.hostname | 38 | print "deploying on %s" % client.hostname |
199 | 39 | print " hwpack: %s" % hwpack | 39 | print " hwpack: %s" % hwpack |
200 | 40 | print " rootfs: %s" % rootfs | 40 | print " rootfs: %s" % rootfs |
201 | 41 | if kernel_matrix: | ||
202 | 42 | print " package: %s" % kernel_matrix[0] | ||
203 | 41 | print "Booting master image" | 43 | print "Booting master image" |
204 | 42 | client.boot_master_image() | 44 | client.boot_master_image() |
205 | 43 | 45 | ||
206 | @@ -49,9 +51,17 @@ | |||
207 | 49 | client.sio.write(tb) | 51 | client.sio.write(tb) |
208 | 50 | raise CriticalError("Unable to reach LAVA server, check network") | 52 | raise CriticalError("Unable to reach LAVA server, check network") |
209 | 51 | 53 | ||
210 | 54 | if kernel_matrix: | ||
211 | 55 | hwpack = self.refresh_hwpack(kernel_matrix, hwpack, use_cache) | ||
212 | 56 | #make new hwpack downloadable | ||
213 | 57 | hwpack = hwpack.replace(LAVA_IMAGE_TMPDIR, '') | ||
214 | 58 | hwpack = '/'.join(u.strip('/') for u in [ | ||
215 | 59 | LAVA_IMAGE_URL, hwpack]) | ||
216 | 60 | print "Hwpack with new kernel: %s" % hwpack | ||
217 | 61 | |||
218 | 52 | try: | 62 | try: |
221 | 53 | boot_tgz, root_tgz = self.generate_tarballs( | 63 | boot_tgz, root_tgz = self.generate_tarballs(hwpack, rootfs, |
222 | 54 | hwpack, rootfs, use_cache) | 64 | use_cache) |
223 | 55 | except: | 65 | except: |
224 | 56 | tb = traceback.format_exc() | 66 | tb = traceback.format_exc() |
225 | 57 | client.sio.write(tb) | 67 | client.sio.write(tb) |
226 | @@ -119,6 +129,7 @@ | |||
227 | 119 | self.tarball_dir = mkdtemp(dir=LAVA_IMAGE_TMPDIR) | 129 | self.tarball_dir = mkdtemp(dir=LAVA_IMAGE_TMPDIR) |
228 | 120 | tarball_dir = self.tarball_dir | 130 | tarball_dir = self.tarball_dir |
229 | 121 | os.chmod(tarball_dir, 0755) | 131 | os.chmod(tarball_dir, 0755) |
230 | 132 | #fix me: if url is not http-prefix, copy it to tarball_dir | ||
231 | 122 | if use_cache: | 133 | if use_cache: |
232 | 123 | hwpack_path = download_with_cache(hwpack_url, tarball_dir, lava_cachedir) | 134 | hwpack_path = download_with_cache(hwpack_url, tarball_dir, lava_cachedir) |
233 | 124 | rootfs_path = download_with_cache(rootfs_url, tarball_dir, lava_cachedir) | 135 | rootfs_path = download_with_cache(rootfs_url, tarball_dir, lava_cachedir) |
234 | @@ -184,3 +195,45 @@ | |||
235 | 184 | 'wget -qO- %s |tar --numeric-owner -C /mnt/boot -xzf -' % bootfs) | 195 | 'wget -qO- %s |tar --numeric-owner -C /mnt/boot -xzf -' % bootfs) |
236 | 185 | client.run_cmd_master('umount /mnt/boot') | 196 | client.run_cmd_master('umount /mnt/boot') |
237 | 186 | 197 | ||
238 | 198 | def refresh_hwpack(self, kernel_matrix, hwpack, use_cache=True): | ||
239 | 199 | client = self.client | ||
240 | 200 | LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir | ||
241 | 201 | print "Deploying new kernel" | ||
242 | 202 | new_kernel = kernel_matrix[0] | ||
243 | 203 | deb_prefix = kernel_matrix[1] | ||
244 | 204 | filesuffix = new_kernel.split(".")[-1] | ||
245 | 205 | |||
246 | 206 | if filesuffix != "deb": | ||
247 | 207 | raise CriticalError("New kernel only support deb kernel package!") | ||
248 | 208 | |||
249 | 209 | # download package to local | ||
250 | 210 | tarball_dir = mkdtemp(dir=LAVA_IMAGE_TMPDIR) | ||
251 | 211 | os.chmod(tarball_dir, 0755) | ||
252 | 212 | if use_cache: | ||
253 | 213 | kernel_path = download_with_cache(new_kernel, tarball_dir) | ||
254 | 214 | hwpack_path = download_with_cache(hwpack, tarball_dir) | ||
255 | 215 | else: | ||
256 | 216 | kernel_path = download(new_kernel, tarball_dir) | ||
257 | 217 | hwpack_path = download(hwpack, tarball_dir) | ||
258 | 218 | |||
259 | 219 | cmd = ("sudo linaro-hwpack-replace -t %s -p %s -r %s" | ||
260 | 220 | % (hwpack_path, kernel_path, deb_prefix)) | ||
261 | 221 | |||
262 | 222 | rc, output = getstatusoutput(cmd) | ||
263 | 223 | if rc: | ||
264 | 224 | shutil.rmtree(tarball_dir) | ||
265 | 225 | tb = traceback.format_exc() | ||
266 | 226 | client.sio.write(tb) | ||
267 | 227 | raise RuntimeError("linaro-hwpack-replace failed: %s" % output) | ||
268 | 228 | |||
269 | 229 | #fix it:l-h-r doesn't make a output option to specify the output hwpack, | ||
270 | 230 | #so it needs to do manually here | ||
271 | 231 | |||
272 | 232 | #remove old hwpack and leave only new hwpack in tarball_dir | ||
273 | 233 | os.remove(hwpack_path) | ||
274 | 234 | hwpack_list = os.listdir(tarball_dir) | ||
275 | 235 | for hp in hwpack_list: | ||
276 | 236 | if hp.split(".")[-1] == "gz": | ||
277 | 237 | new_hwpack_path = os.path.join(tarball_dir, hp) | ||
278 | 238 | return new_hwpack_path | ||
279 | 239 | |||
280 | 187 | 240 | ||
281 | === modified file 'lava_dispatcher/client.py' | |||
282 | --- lava_dispatcher/client.py 2011-09-14 16:05:43 +0000 | |||
283 | +++ lava_dispatcher/client.py 2011-09-15 07:09:50 +0000 | |||
284 | @@ -130,7 +130,7 @@ | |||
285 | 130 | # Details: system PS1 is set in /etc/bash.bashrc and user PS1 is set in | 130 | # Details: system PS1 is set in /etc/bash.bashrc and user PS1 is set in |
286 | 131 | # /root/.bashrc, it is | 131 | # /root/.bashrc, it is |
287 | 132 | # "${debian_chroot:+($debian_chroot)}\u@\h:\w\$ " | 132 | # "${debian_chroot:+($debian_chroot)}\u@\h:\w\$ " |
289 | 133 | self.proc.sendline('export PS1="$PS1 rc=$(echo \$?) "') | 133 | self.proc.sendline('export PS1="$PS1 [rc=$(echo \$?)]: "') |
290 | 134 | self.proc.expect(self.tester_str) | 134 | self.proc.expect(self.tester_str) |
291 | 135 | 135 | ||
292 | 136 | def enter_uboot(self): | 136 | def enter_uboot(self): |
293 | 137 | 137 | ||
294 | === modified file 'lava_dispatcher/utils.py' | |||
295 | --- lava_dispatcher/utils.py 2011-09-01 03:03:09 +0000 | |||
296 | +++ lava_dispatcher/utils.py 2011-09-15 07:09:50 +0000 | |||
297 | @@ -45,7 +45,11 @@ | |||
298 | 45 | if os.path.exists(cache_loc): | 45 | if os.path.exists(cache_loc): |
299 | 46 | filename = os.path.basename(cache_loc) | 46 | filename = os.path.basename(cache_loc) |
300 | 47 | file_location = os.path.join(path, filename) | 47 | file_location = os.path.join(path, filename) |
302 | 48 | os.link(cache_loc, file_location) | 48 | try: |
303 | 49 | os.link(cache_loc, file_location) | ||
304 | 50 | except OSError, err: | ||
305 | 51 | if err.errno == 18: | ||
306 | 52 | shutil.copy(cache_loc, file_location) | ||
307 | 49 | else: | 53 | else: |
308 | 50 | file_location = download(url, path) | 54 | file_location = download(url, path) |
309 | 51 | try: | 55 | try: |
This looks basically OK to me, bet it conflicts with trunk now though.