Disable automatic downloading of components!

Upstream-Status: Inappropriate [disable feature]

Signed-off-by: Mark Hatle <mark.hatle@xilinx.com>

Update patch to fit on 3.7.2.

Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>

diff --git a/setup.py b/setup.py
index 0bea13fa6f..f39d8fc871 100644
--- a/setup.py
+++ b/setup.py
@@ -327,13 +327,7 @@ setup(  # Finally, pass this all along to setuptools to do the heavy lifting.
         "pillow>=6.2.0",
         "pyparsing>=2.3.1,<3.1",
         "python-dateutil>=2.7",
-    ] + (
-        # Installing from a git checkout that is not producing a wheel.
-        ["setuptools_scm>=7"] if (
-            Path(__file__).with_name(".git").exists() and
-            os.environ.get("CIBUILDWHEEL", "0") != "1"
-        ) else []
-    ),
+    ],
     extras_require={
         ':python_version<"3.10"': [
             "importlib-resources>=3.2.0",
diff --git a/setupext.py b/setupext.py
index a898d642d6..474172ff8f 100644
--- a/setupext.py
+++ b/setupext.py
@@ -66,40 +66,7 @@ def get_from_cache_or_download(url, sha):
     BytesIO
         The file loaded into memory.
     """
-    cache_dir = _get_xdg_cache_dir()
-
-    if cache_dir is not None:  # Try to read from cache.
-        try:
-            data = (cache_dir / sha).read_bytes()
-        except IOError:
-            pass
-        else:
-            if _get_hash(data) == sha:
-                return BytesIO(data)
-
-    # jQueryUI's website blocks direct downloads from urllib.request's
-    # default User-Agent, but not (for example) wget; so I don't feel too
-    # bad passing in an empty User-Agent.
-    with urllib.request.urlopen(
-            urllib.request.Request(url, headers={"User-Agent": ""}),
-            context=_get_ssl_context()) as req:
-        data = req.read()
-
-    file_sha = _get_hash(data)
-    if file_sha != sha:
-        raise Exception(
-            f"The downloaded file does not match the expected sha.  {url} was "
-            f"expected to have {sha} but it had {file_sha}")
-
-    if cache_dir is not None:  # Try to cache the downloaded file.
-        try:
-            cache_dir.mkdir(parents=True, exist_ok=True)
-            with open(cache_dir / sha, "xb") as fout:
-                fout.write(data)
-        except IOError:
-            pass
-
-    return BytesIO(data)
+    raise IOError(f"Automatic downloading is disabled.")
 
 
 def get_and_extract_tarball(urls, sha, dirname):
