From 190074030329e6f37f58122fed3b0e7c17fe1d48 Mon Sep 17 00:00:00 2001
From: Brett Cannon <brettcannon@users.noreply.github.com>
Date: Fri, 10 Feb 2017 14:41:43 -0800
Subject: [PATCH 1/3] Support "bpo-" in Misc/NEWS

---
 Doc/tools/extensions/pyspecific.py | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py
index 273191bbd3c025..1ba80105c085cd 100644
--- a/Doc/tools/extensions/pyspecific.py
+++ b/Doc/tools/extensions/pyspecific.py
@@ -34,7 +34,7 @@
 
 
 ISSUE_URI = 'https://bugs.python.org/issue%s'
-SOURCE_URI = 'https://hg.python.org/cpython/file/3.6/%s'
+SOURCE_URI = 'https://github.com/python/cpython/tree/3.6/%s'
 
 # monkey-patch reST parser to disable alphabetic and roman enumerated lists
 from docutils.parsers.rst.states import Body
@@ -79,7 +79,7 @@ def new_depart_literal_block(self, node):
 
 def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
     issue = utils.unescape(text)
-    text = 'issue ' + issue
+    text = 'bpo-' + issue
     refnode = nodes.reference(text, text, refuri=ISSUE_URI % issue)
     return [refnode], []
 
@@ -225,7 +225,7 @@ def run(self):
 
 # Support for including Misc/NEWS
 
-issue_re = re.compile('([Ii])ssue #([0-9]+)')
+issue_re = re.compile('([Ii]ssue #|bpo-)([0-9]+)')
 whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$")
 
 
@@ -253,7 +253,7 @@ def run(self):
             text = 'The NEWS file is not available.'
             node = nodes.strong(text, text)
             return [node]
-        content = issue_re.sub(r'`\1ssue #\2 <https://bugs.python.org/\2>`__',
+        content = issue_re.sub(r'`\bpo-\2 <https://bugs.python.org/\2>`__',
                                content)
         content = whatsnew_re.sub(r'\1', content)
         # remove first 3 lines as they are the main heading

From 54011640183be0f18eebe2da7b0e3e81160dbb17 Mon Sep 17 00:00:00 2001
From: Brett Cannon <brettcannon@users.noreply.github.com>
Date: Fri, 10 Feb 2017 14:53:50 -0800
Subject: [PATCH 2/3] Fix up the match and substitution regexes

Make the prefix match non-capturing and fix a bug where a backslash was left into the substitution.
---
 Doc/tools/extensions/pyspecific.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py
index 1ba80105c085cd..a0cfc7edc4a465 100644
--- a/Doc/tools/extensions/pyspecific.py
+++ b/Doc/tools/extensions/pyspecific.py
@@ -225,7 +225,7 @@ def run(self):
 
 # Support for including Misc/NEWS
 
-issue_re = re.compile('([Ii]ssue #|bpo-)([0-9]+)')
+issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)')
 whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$")
 
 
@@ -253,7 +253,7 @@ def run(self):
             text = 'The NEWS file is not available.'
             node = nodes.strong(text, text)
             return [node]
-        content = issue_re.sub(r'`\bpo-\2 <https://bugs.python.org/\2>`__',
+        content = issue_re.sub(r'`bpo-\1 <https://bugs.python.org/\1>`__',
                                content)
         content = whatsnew_re.sub(r'\1', content)
         # remove first 3 lines as they are the main heading

From 02a87ce98d14f4d9d6e72ade7b4146201657bb33 Mon Sep 17 00:00:00 2001
From: Brett Cannon <brettcannon@users.noreply.github.com>
Date: Fri, 10 Feb 2017 15:06:05 -0800
Subject: [PATCH 3/3] Address reviewer comments

---
 Doc/tools/extensions/pyspecific.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py
index a0cfc7edc4a465..4d4fb8fc8350be 100644
--- a/Doc/tools/extensions/pyspecific.py
+++ b/Doc/tools/extensions/pyspecific.py
@@ -34,7 +34,7 @@
 
 
 ISSUE_URI = 'https://bugs.python.org/issue%s'
-SOURCE_URI = 'https://github.com/python/cpython/tree/3.6/%s'
+SOURCE_URI = 'https://github.com/python/cpython/tree/master/%s'
 
 # monkey-patch reST parser to disable alphabetic and roman enumerated lists
 from docutils.parsers.rst.states import Body
@@ -253,7 +253,7 @@ def run(self):
             text = 'The NEWS file is not available.'
             node = nodes.strong(text, text)
             return [node]
-        content = issue_re.sub(r'`bpo-\1 <https://bugs.python.org/\1>`__',
+        content = issue_re.sub(r'`bpo-\1 <https://bugs.python.org/issue\1>`__',
                                content)
         content = whatsnew_re.sub(r'\1', content)
         # remove first 3 lines as they are the main heading