def get_distro():
# type: () -> Tuple[Optional[str], Optional[str], Optional[str]]
distro = None
+ distro_like: List[str] = []
distro_version = None
distro_codename = None
with open('/etc/os-release', 'r') as f:
val = val[1:-1]
if var == 'ID':
distro = val.lower()
+ elif var == 'ID_LIKE':
+ # ID_LIKE can be space-separated or comma-separated
+ for token in val.replace(',', ' ').split():
+ distro_like.append(token.strip().lower())
elif var == 'VERSION_ID':
distro_version = val.lower()
elif var == 'VERSION_CODENAME':
distro_codename = val.lower()
+
+ if not is_known_distro(distro):
+ for candidate_distro in distro_like:
+ if is_known_distro(candidate_distro):
+ distro = candidate_distro
+ break
+
return distro, distro_version, distro_codename
+def is_known_distro(distro: Optional[str]) -> bool:
+ if not distro:
+ return False
+ return (
+ distro in YumDnf.DISTRO_NAMES
+ or distro in Apt.DISTRO_NAMES
+ or distro in Zypper.DISTRO_NAMES
+ )
+
+
class Packager(object):
def __init__(
self,
""",
("hpec", "33", "hpec nimda"),
),
+ (
+ """# Fallback: unknown distro with comma-separated ID_LIKE
+ID="custom-rhel"
+ID_LIKE="rhel,centos,fedora"
+VERSION_ID="8"
+ """,
+ ("rhel", "8", None),
+ ),
+ (
+ """# Fallback: unknown distro with space-separated ID_LIKE
+ID="custom-rhel"
+ID_LIKE="rhel centos fedora"
+VERSION_ID="8"
+ """,
+ ("rhel", "8", None),
+ ),
+ (
+ """# Fallback: picks first known distro from mixed ID_LIKE
+ID="custom-distro"
+ID_LIKE="unknown-distro,centos,fedora"
+VERSION_ID="8"
+ """,
+ ("centos", "8", None),
+ ),
+ (
+ """# No fallback: unknown distro with unknown ID_LIKE values
+ID="unknown-distro"
+ID_LIKE="also-unknown another-unknown"
+VERSION_ID="1.0"
+ """,
+ ("unknown-distro", "1.0", None),
+ ),
+ (
+ """# No fallback: unknown distro with empty ID_LIKE
+ID="unknown-distro"
+ID_LIKE=""
+VERSION_ID="1.0"
+ """,
+ ("unknown-distro", "1.0", None),
+ ),
+ (
+ """# No fallback: known distro stays unchanged
+ID="rocky"
+ID_LIKE="rhel centos fedora"
+VERSION_ID="8.5"
+ """,
+ ("rocky", "8.5", None),
+ ),
],
)
def test_get_distro(monkeypatch, content, expected):