From 88d489de52d40ed61ea73e30907576ebee754828 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Fri, 22 Aug 2025 12:58:30 +0200 Subject: [PATCH 1/6] Fail earlier when user try to install future version of R Closes https://github.com/jupyterhub/repo2docker/issues/1455 --- repo2docker/buildpacks/r.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 9a81f046..a7057675 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -1,6 +1,7 @@ import datetime import os import re +import warnings from functools import lru_cache import requests @@ -99,9 +100,18 @@ class RBuildPack(PythonBuildPack): # available. Users can however explicitly specify the full version to get something specific if r_version in version_map: r_version = version_map[r_version] - elif len(r_version.split(".")) == 2: - # must have x.y.z version, add .0 for unrecognized (future) R versions - r_version += ".0" + else: + # Instead of appending ".0" to future R versions, + # repo2docker fails earlier with a meaningful message to the user. + # If repo2docker doesn't fail here, repo2docker might fail later + # without a meaningul message to the user. + raise RuntimeError( + f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new?template=BLANK_ISSUE.", + ) + else: + warnings.warn( + f"Using R version {r_version} instead of full version, i.e. MAJOR.MINOR.PATCH." + ) # translate to the full version string self._r_version = r_version From 3079a04fb8b611c226b4bc989db174dddee5e3d2 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Thu, 28 Aug 2025 10:23:31 +0200 Subject: [PATCH 2/6] Support R full version provided by user i.e. MAJOR.MINOR.PATCH. --- repo2docker/buildpacks/r.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index a7057675..556f6691 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -101,13 +101,18 @@ class RBuildPack(PythonBuildPack): if r_version in version_map: r_version = version_map[r_version] else: - # Instead of appending ".0" to future R versions, - # repo2docker fails earlier with a meaningful message to the user. - # If repo2docker doesn't fail here, repo2docker might fail later - # without a meaningul message to the user. - raise RuntimeError( - f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new?template=BLANK_ISSUE.", - ) + r_version_parts = r_version.split(".") + if len(r_version_parts) == 3: + warnings.warn( + f"Using R full version, {r_version}, provided by user." + ) + else: + # repo2docker fails earlier with a meaningful message to the user. + # If repo2docker doesn't fail here, repo2docker might fail later + # without a meaningul message to the user. + raise RuntimeError( + f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new?template=BLANK_ISSUE.", + ) else: warnings.warn( f"Using R version {r_version} instead of full version, i.e. MAJOR.MINOR.PATCH." From 1f83d7608bb4be3ec8088edd12328794bdf0bfdb Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 16:32:27 +0200 Subject: [PATCH 3/6] Address comments from @minrk --- repo2docker/buildpacks/r.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index a10443fe..93bc7bf7 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -89,7 +89,7 @@ class RBuildPack(PythonBuildPack): else: r_version_parts = r_version.split(".") if len(r_version_parts) == 3: - warnings.warn( + self.log.warning( f"Using R full version, {r_version}, provided by user." ) else: @@ -97,11 +97,11 @@ class RBuildPack(PythonBuildPack): # If repo2docker doesn't fail here, repo2docker might fail later # without a meaningul message to the user. raise RuntimeError( - f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new?template=BLANK_ISSUE.", + f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new/choose.", ) else: - warnings.warn( - f"Using R version {r_version} instead of full version, i.e. MAJOR.MINOR.PATCH." + self.log.warning( + f"R version unspecified, using default R version {r_version}. You can specify the R version in runtime.txt." ) # translate to the full version string From 460d3c1fb0cf75ae61dc77252d57b2c347d0ef9b Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 16:59:10 +0200 Subject: [PATCH 4/6] Remove requirement of date in runtime.txt for R based on comment from @maniacs --- repo2docker/buildpacks/r.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 93bc7bf7..520bc48c 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -78,9 +78,9 @@ class RBuildPack(PythonBuildPack): if not hasattr(self, "_r_version"): _, version, date = self.runtime - # If runtime.txt is not set, or if it isn't of the form r----
, + # If runtime.txt is not set, or if it isn't of the form r--*, # we don't use any of it in determining r version and just use the default - if version and date: + if version: r_version = version # For versions of form x.y, we want to explicitly provide x.y.z - latest patchlevel # available. Users can however explicitly specify the full version to get something specific From 6b00d6fb0f065b011349ac4038217d827e8679de Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 17:01:04 +0200 Subject: [PATCH 5/6] Replace warning with info in log --- repo2docker/buildpacks/r.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 520bc48c..8cb0ffbb 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -89,13 +89,13 @@ class RBuildPack(PythonBuildPack): else: r_version_parts = r_version.split(".") if len(r_version_parts) == 3: - self.log.warning( + self.log.info( f"Using R full version, {r_version}, provided by user." ) else: # repo2docker fails earlier with a meaningful message to the user. # If repo2docker doesn't fail here, repo2docker might fail later - # without a meaningul message to the user. + # without a meaningful message to the user. raise RuntimeError( f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new/choose.", ) From b650d28849e8a6b63ab16cb57816086a710e0992 Mon Sep 17 00:00:00 2001 From: Raniere Gaia Costa da Silva Date: Mon, 8 Sep 2025 17:02:18 +0200 Subject: [PATCH 6/6] Minor improvement on English in error message --- repo2docker/buildpacks/r.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repo2docker/buildpacks/r.py b/repo2docker/buildpacks/r.py index 8cb0ffbb..4483300a 100644 --- a/repo2docker/buildpacks/r.py +++ b/repo2docker/buildpacks/r.py @@ -97,7 +97,7 @@ class RBuildPack(PythonBuildPack): # If repo2docker doesn't fail here, repo2docker might fail later # without a meaningful message to the user. raise RuntimeError( - f"R version {r_version} is not supported. Please open an issue using https://github.com/jupyterhub/repo2docker/issues/new/choose.", + f"R version {r_version} is not supported. Please open an issue at https://github.com/jupyterhub/repo2docker/issues/new/choose.", ) else: self.log.warning(