From 972eea08c83b98c34ed4297ae719389f515fbb52 Mon Sep 17 00:00:00 2001
From: Laurent COLBOIS <laurent.colbois@idiap.ch>
Date: Thu, 23 Jun 2022 15:53:31 +0200
Subject: [PATCH] Add script to install all CI versions of external Bob
 dependencies

---
 bob/devtools/build.py                | 14 ++++++--
 bob/devtools/scripts/install_deps.py | 52 ++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 2 deletions(-)
 create mode 100644 bob/devtools/scripts/install_deps.py

diff --git a/bob/devtools/build.py b/bob/devtools/build.py
index fdc8d86e..986634b4 100644
--- a/bob/devtools/build.py
+++ b/bob/devtools/build.py
@@ -716,7 +716,9 @@ def base_build(
         return conda_build.api.build(recipe_dir, config=conda_config)
 
 
-def load_packages_from_conda_build_config(conda_build_config, condarc_options):
+def load_packages_from_conda_build_config(
+    conda_build_config, condarc_options, with_pins=False
+):
     with open(conda_build_config, "r") as f:
         content = f.read()
 
@@ -734,7 +736,15 @@ def load_packages_from_conda_build_config(conda_build_config, condarc_options):
 
     package_names_map = package_pins.pop("package_names_map")
 
-    packages = [package_names_map.get(p, p) for p in package_pins.keys()]
+    if with_pins:
+        # NB : in pins, need to strip the occasional " cuda*" suffix
+        # tensorflow=x.x.x cuda* -> tensorflow=x.x.x
+        packages = [
+            f"{package_names_map.get(p, p)}={str(v[0]).split(' ')[0]}"
+            for p, v in package_pins.items()
+        ]
+    else:
+        packages = [package_names_map.get(p, p) for p in package_pins.keys()]
 
     return packages, package_names_map
 
diff --git a/bob/devtools/scripts/install_deps.py b/bob/devtools/scripts/install_deps.py
new file mode 100644
index 00000000..ac266ddc
--- /dev/null
+++ b/bob/devtools/scripts/install_deps.py
@@ -0,0 +1,52 @@
+"""Create an environment with all external dependencies listed in bob/devtools/data/conda_build_config.yaml"""
+import click
+
+
+@click.command(
+    epilog="""Example:
+  1. Creates an environment called `myenv' containing all external bob dependencies:
+
+python bob/devtools/scripts/install_deps.py  myenv
+
+2. The version of python to solve with can be provided as option:
+
+python bob/devtools/scripts/install_deps.py  myenv --python=3.8
+
+"""
+)
+@click.argument("env_name", nargs=1)
+@click.option("--python", required=True, help="Python version to pin, e.g. 3.8")
+def install_deps(env_name, python):
+    import subprocess
+
+    from bob.devtools.build import load_packages_from_conda_build_config
+
+    conda_config_path = "bob/devtools/data/conda_build_config.yaml"
+
+    packages, package_names_map = load_packages_from_conda_build_config(
+        conda_config_path, {"channels": []}, with_pins=True
+    )
+
+    # ask mamba to create an environment with the packages
+    try:
+        _ = subprocess.run(
+            [
+                "mamba",
+                "create",
+                "--override-channels",
+                "-c",
+                "conda-forge",
+                "-n",
+                env_name,
+                f"python={python}",
+            ]
+            + packages,
+            check=True,
+        )
+    except subprocess.CalledProcessError as e:
+        print(e.output.decode())
+        raise e
+
+
+if __name__ == "__main__":
+    install_deps()
-- 
GitLab