From owner-svn-ports-head@freebsd.org Mon Jun 13 15:22:33 2016 Return-Path: Delivered-To: svn-ports-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 971E4AF18ED; Mon, 13 Jun 2016 15:22:33 +0000 (UTC) (envelope-from sbz@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 71CD72F87; Mon, 13 Jun 2016 15:22:33 +0000 (UTC) (envelope-from sbz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u5DFMWD2059449; Mon, 13 Jun 2016 15:22:32 GMT (envelope-from sbz@FreeBSD.org) Received: (from sbz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u5DFMWPQ059446; Mon, 13 Jun 2016 15:22:32 GMT (envelope-from sbz@FreeBSD.org) Message-Id: <201606131522.u5DFMWPQ059446@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: sbz set sender to sbz@FreeBSD.org using -f From: Sofian Brabez Date: Mon, 13 Jun 2016 15:22:32 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r416846 - head/Tools/scripts X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-head@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SVN commit messages for the ports tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jun 2016 15:22:33 -0000 Author: sbz Date: Mon Jun 13 15:22:32 2016 New Revision: 416846 URL: https://svnweb.freebsd.org/changeset/ports/416846 Log: - Update to last version Differential Revision: https://reviews.freebsd.org/D6827 Modified: head/Tools/scripts/README.getpatch head/Tools/scripts/getpatch Modified: head/Tools/scripts/README.getpatch ============================================================================== --- head/Tools/scripts/README.getpatch Mon Jun 13 15:13:51 2016 (r416845) +++ head/Tools/scripts/README.getpatch Mon Jun 13 15:22:32 2016 (r416846) @@ -69,8 +69,12 @@ EXAMPLES Redirection <() depends on the shell you're using; validated with zsh and bash. -DIAGNOSTICS - getpatch exits 0 on success or 1 if a help message was displayed. +EXIT STATUS + getpatch exits with one of the following values according to sysexits code: + + 0 on success. + 64 if a help message was displayed. + 69 if patches are not found. SEE ALSO getpr @@ -82,4 +86,4 @@ BUGS If you're using getpatch and you encounter a bug or want an improvement don't hesitate to mail me. -FreeBSD 18 June 2014 FreeBSD +FreeBSD 12 June 2016 FreeBSD Modified: head/Tools/scripts/getpatch ============================================================================== --- head/Tools/scripts/getpatch Mon Jun 13 15:13:51 2016 (r416845) +++ head/Tools/scripts/getpatch Mon Jun 13 15:22:32 2016 (r416846) @@ -30,7 +30,9 @@ import argparse import codecs +import os import re +import ssl import sys if sys.version_info.major == 3: import urllib.request as urllib2 @@ -41,6 +43,14 @@ else: FreeBSD getpatch handles Gnats and Bugzilla patch attachments """ + +def create_ssl_context(cafile): + if os.path.exists(cafile): + return ssl.create_default_context(cafile=cafile) + else: + return ssl._create_unverified_context() + + class GetPatch(object): def __init__(self, pr, category='ports'): @@ -51,25 +61,26 @@ class GetPatch(object): self.patch = "" self.output_stdout = False self.default_locale = sys.getdefaultencoding() + self.ssl_context = create_ssl_context('/usr/local/etc/ssl/cert.pem') def fetch(self, *largs, **kwargs): raise NotImplementedError() def write(self, filename, data): if filename.endswith(('.patch', '.txt')): - filename = filename[:filename.rindex('.')]+'.diff' - f=codecs.open(filename, encoding=self.default_locale, mode='w') + filename = "{}.diff".format(filename[:filename.rindex('.')]) + f = codecs.open(filename, encoding=self.default_locale, mode='w') f.write(data.decode(self.default_locale)) f.close() - self.out("[+] %s created" % filename) + self.out("[+] {} created".format(filename)) - def get(self,only_last=False, output_stdout=False): + def get(self, only_last=False, output_stdout=False): self.output_stdout = output_stdout self.fetch(self.pr, category=self.category) if len(self.patchs) == 0: self.out("[-] No patch found") - sys.exit(1) + sys.exit(os.EX_UNAVAILABLE) if only_last: self.patchs = [self.patchs.pop()] @@ -78,7 +89,7 @@ class GetPatch(object): url = patch['url'] p = patch['name'] - data = urllib2.urlopen(url).read() + data = urllib2.urlopen(url, context=self.ssl_context).read() if self.output_stdout: sys.stdout.write(data.decode(self.default_locale)) @@ -92,10 +103,11 @@ class GetPatch(object): if not self.output_stdout: print(s) + class GnatsGetPatch(GetPatch): URL_BASE = 'https://www.freebsd.org/cgi' - URL = '%s/query-pr.cgi?pr=' % URL_BASE + URL = '{}/query-pr.cgi?pr='.format(URL_BASE) REGEX = r'Download ([^<]*)' def __init__(self, pr, category): @@ -103,22 +115,25 @@ class GnatsGetPatch(GetPatch): def fetch(self, *largs, **kwargs): category = kwargs['category'] - target = ("%s/%s" % (category, self.pr), "%s" % self.pr)[category==''] - self.out("[+] Fetching patch for pr %s" % target) + target = ("{}/{}".format(category, self.pr), + "{}".format(self.pr))[category == ''] + self.out("[+] Fetching patch for pr {}".format(target)) pattern = re.compile(self.REGEX) - u = urllib2.urlopen(self.URL+'%s' % target) + u = urllib2.urlopen("{}{}".format(self.URL, target), + context=self.ssl_context) data = u.read() - if data == None: + if data is None: self.out("[-] No patch found") - sys.exit(1) + sys.exit(os.EX_UNAVAILABLE) for patchs in re.findall(pattern, str(data)): self.add_patch(patchs[0], patchs[1]) + class BzGetPatch(GetPatch): - URL_BASE= 'https://bugs.freebsd.org/bugzilla/' - URL_SHOW = '%s/show_bug.cgi?id=' % URL_BASE + URL_BASE = 'https://bugs.freebsd.org/bugzilla/' + URL_SHOW = '{}/show_bug.cgi?id='.format(URL_BASE) REGEX_URL = r'Details' REGEX = r'
([^ ]+) \(text/plain(?:; charset=[-\w]+)?\)' @@ -126,19 +141,21 @@ class BzGetPatch(GetPatch): GetPatch.__init__(self, pr, category) def _get_patch_name(self, url): - match = re.search(self.REGEX, urllib2.urlopen(url).read()) + data = urllib2.urlopen(url, context=self.ssl_context).read() + match = re.search(self.REGEX, str(data)) if match is None: return None return match.group(1) def _get_patch_urls(self, data): patch_urls = {} - for url in re.findall(self.REGEX_URL, data): - url = '%s/%s' % (self.URL_BASE, url) + for url in re.findall(self.REGEX_URL, str(data)): + url = '{}{}'.format(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) + msg = "[-] Could not determine the patch file name in {}." \ + "Skipping." + self.out(msg.format(url)) continue download_url = url[:url.find('&')] patch_urls[download_url] = file_name @@ -146,51 +163,57 @@ class BzGetPatch(GetPatch): def fetch(self, *largs, **kwargs): category = kwargs['category'] - self.out("[+] Fetching patch for pr %s/%s" % (category, self.pr)) - u = urllib2.urlopen(self.URL_SHOW+'%s' % self.pr) + target = ("{}/{}".format(category, self.pr), + "{}".format(self.pr))[category == ''] + self.out("[+] Fetching patch for pr {}".format(target)) + u = urllib2.urlopen("{}{}".format(self.URL_SHOW, self.pr), + context=self.ssl_context) data = u.read() - if data == None: + if data is None: self.out("[-] No patch found") - sys.exit(1) + sys.exit(os.EX_UNAVAILABLE) patch_urls = self._get_patch_urls(data) if not patch_urls: self.out("[-] No patch found") - sys.exit(1) + sys.exit(os.EX_UNAVAILABLE) - for url, file_name in patch_urls.iteritems(): + for url, file_name in patch_urls.items(): self.add_patch(url, file_name) + def main(): parser = argparse.ArgumentParser( description='Gets patch attachments from a Bug Tracking System' ) parser.add_argument('pr', metavar='pr', type=str, nargs=1, - help='Pr id number') - parser.add_argument('--mode', type=str, choices=['gnats','bz'], - default='bz', help='available modes to retrieve patch') + help='Pr id number') + parser.add_argument('--mode', type=str, choices=['gnats', 'bz'], + default='bz', help='available modes to retrieve patch') parser.add_argument('--last', action='store_true', - help='only retrieve the latest iteration of a patch') + help='only retrieve the latest iteration of a patch') parser.add_argument('--stdout', action='store_true', - help='dump patch on stdout') + help='dump patch on stdout') if len(sys.argv) == 1: parser.print_help() - sys.exit(1) + sys.exit(os.EX_USAGE) args = parser.parse_args() category = "" pr = str(args.pr[0]) - if '/' in pr and pr is not None: + if pr and '/' in pr: category, pr = pr.split('/') Clazz = globals()['%sGetPatch' % args.mode.capitalize()] gp = Clazz(pr, category) gp.get(only_last=args.last, output_stdout=args.stdout) + return os.EX_OK + if __name__ == '__main__': - main() + sys.exit(main())