From 9196dc66ae57a7cb751a42d49e5ab6038c916ff7 Mon Sep 17 00:00:00 2001
From: Amaury Forgeot d'Arc <amauryfa@gmail.com>
Date: Thu, 19 Jun 2008 20:54:32 +0000
Subject: [PATCH] Issue 3145: help("modules xxx") failed when scanning
 test.badsyntax_pep3120... now it silently ignores modules it cannot scan or
 import.

---
 Lib/pydoc.py | 21 ++++++++++++++++-----
 Misc/NEWS    | 15 +++++++++++++++
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 8e80b37e7c..2c559bd26e 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -1870,16 +1870,25 @@ class ModuleScanner:
             else:
                 loader = importer.find_module(modname)
                 if hasattr(loader,'get_source'):
+                    try:
+                        source = loader.get_source(modname)
+                    except UnicodeDecodeError:
+                        if onerror:
+                            onerror(modname)
+                        continue
                     import io
-                    desc = source_synopsis(
-                        io.StringIO(loader.get_source(modname))
-                    ) or ''
+                    desc = source_synopsis(io.StringIO(source)) or ''
                     if hasattr(loader,'get_filename'):
                         path = loader.get_filename(modname)
                     else:
                         path = None
                 else:
-                    module = loader.load_module(modname)
+                    try:
+                        module = loader.load_module(modname)
+                    except ImportError:
+                        if onerror:
+                            onerror(modname)
+                        continue
                     desc = (module.__doc__ or '').splitlines()[0]
                     path = getattr(module,'__file__',None)
                 name = modname + ' - ' + desc
@@ -1895,10 +1904,12 @@ def apropos(key):
         if modname[-9:] == '.__init__':
             modname = modname[:-9] + ' (package)'
         print(modname, desc and '- ' + desc)
+    def onerror(modname):
+        pass
     try: import warnings
     except ImportError: pass
     else: warnings.filterwarnings('ignore') # ignore problems during import
-    ModuleScanner().run(callback, key)
+    ModuleScanner().run(callback, key, onerror=onerror)
 
 # --------------------------------------------------- web browser interface
 
diff --git a/Misc/NEWS b/Misc/NEWS
index 0d5379b698..0656041f8a 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -4,6 +4,21 @@ Python News
 
 (editors: check NEWS.help for information about editing NEWS using ReST.)
 
+What's new in Python 3.0b2?
+===========================
+
+*Release date: XX-XXX-2008*
+
+Core and Builtins
+-----------------
+
+Library
+-------
+
+- Issue #3145: help("modules whatever") failed when trying to load the source
+  code of every single module of the standard library, including invalid files
+  used in the test suite.
+
 What's new in Python 3.0b1?
 ===========================
 
-- 
2.49.0