mirror of
https://github.com/openSUSE/osc.git
synced 2024-12-28 10:46:15 +01:00
a65606cbfe
If urlgrab returns a URLError (for example if the Network is unreachable) the for loop did not continue and the osc build aborts. Now we also catch the URLError and try the next mirror and return False correctly if no mirror could be reached. And then try to download it from api
51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
# Copyright (C) 2018 SUSE Linux. All rights reserved.
|
|
# This program is free software; it may be used, copied, modified
|
|
# and distributed under the terms of the GNU General Public Licence,
|
|
# either version 2, or (at your option) any later version.
|
|
|
|
import sys
|
|
import os.path
|
|
from .core import streamfile
|
|
|
|
try:
|
|
from urllib.request import HTTPError
|
|
from urllib.parse import urlparse
|
|
from urllib.parse import unquote
|
|
from urllib.error import URLError
|
|
except ImportError:
|
|
from urllib2 import HTTPError
|
|
from urlparse import urlparse
|
|
from urllib import unquote
|
|
from urllib2 import URLError
|
|
|
|
|
|
class OscFileGrabber(object):
|
|
def __init__(self, progress_obj=None):
|
|
self.progress_obj = progress_obj
|
|
|
|
def urlgrab(self, url, filename=None, text=None):
|
|
if filename is None:
|
|
parts = urlparse(url)
|
|
filename = os.path.basename(unquote(parts[2]))
|
|
with open(filename, 'wb') as f:
|
|
for i in streamfile(url, progress_obj=self.progress_obj,
|
|
text=text):
|
|
f.write(i)
|
|
|
|
|
|
class OscMirrorGroup(object):
|
|
def __init__(self, grabber, mirrors):
|
|
self._grabber = grabber
|
|
self._mirrors = mirrors
|
|
|
|
def urlgrab(self, url, filename=None, text=None):
|
|
for mirror in self._mirrors:
|
|
try:
|
|
self._grabber.urlgrab(mirror, filename, text)
|
|
return True
|
|
except (HTTPError, URLError) as e:
|
|
# try next mirror
|
|
pass
|
|
|
|
return False
|