diff --git a/Tools/scripts/getpatch b/Tools/scripts/getpatch index 037f424c4f69..74e5e0afe79d 100755 --- a/Tools/scripts/getpatch +++ b/Tools/scripts/getpatch @@ -120,24 +120,29 @@ class BzGetPatch(GetPatch): URL_BASE= 'https://bugs.freebsd.org/bugzilla/' URL_SHOW = '%s/show_bug.cgi?id=' % URL_BASE REGEX_URL = r'Details' - REGEX = r'
([^ ]+) \(text/plain\)' + REGEX = r'
([^ ]+) \(text/plain(?:; charset=[-\w]+)?\)' def __init__(self, pr, category): GetPatch.__init__(self, pr, category) - def _extract_patchs_url(self, data): - pattern = re.compile(self.REGEX_URL) - return re.findall(pattern, data) + def _get_patch_name(self, url): + match = re.search(self.REGEX, urllib2.urlopen(url).read()) + if match is None: + return None + return match.group(1) - def _extract_patchs_name(self, urls): - names = [] - pattern = re.compile(self.REGEX) - for url in urls: - u = urllib2.urlopen('%s/%s' % (self.URL_BASE, url)) - data = u.read() - names.append(re.findall(pattern, data)[0]) - - return names + def _get_patch_urls(self, data): + patch_urls = {} + for url in re.findall(self.REGEX_URL, data): + url = '%s/%s' % (self.URL_BASE, url) + file_name = self._get_patch_name(url) + if file_name is None: + self.out("[-] Could not determine the patch file name in %s. " + "Skipping." % url) + continue + download_url = url[:url.find('&')] + patch_urls[download_url] = file_name + return patch_urls def fetch(self, *largs, **kwargs): category = kwargs['category'] @@ -149,19 +154,13 @@ class BzGetPatch(GetPatch): self.out("[-] No patch found") sys.exit(1) - urls = self._extract_patchs_url(data) - nb_urls = len(urls) - names = self._extract_patchs_name(urls) - nb_names = len(names) - - urls = ['%s/%s' % (self.URL_BASE, u[:u.find('&')]) for u in urls] - - if nb_names == 0 or nb_urls == 0 or nb_names != nb_urls: + patch_urls = self._get_patch_urls(data) + if not patch_urls: self.out("[-] No patch found") sys.exit(1) - for i in range(nb_urls): - self.add_patch(urls[i], names[i]) + for url, file_name in patch_urls.iteritems(): + self.add_patch(url, file_name) def main():