diff --git a/manifests/pip.pp b/manifests/pip.pp index 1ac36773..5c818e40 100644 --- a/manifests/pip.pp +++ b/manifests/pip.pp @@ -238,12 +238,20 @@ } 'latest': { + $include_pre_releases = $install_args =~ /(^| )--pre($| )/ + + $exclude_pre_releases_command = $include_pre_releases ? { + true => '', + # The below regexp is based on this code, assuming that it is semi-authoritative on the PEP440 versioning: + # https://github.com/pypa/packaging/blob/21.3/packaging/version.py#L230-L235 + default => ' | grep -vP "(a|b|c|rc|alpha|beta|pre|preview)[-_\.]?(\d+)?"', + } + # Unfortunately this is the smartest way of getting the latest available package version with pip as of now - # Note: we DO need to repeat ourselves with "from version" in both grep and sed as on some systems pip returns - # more than one line with paretheses. - $latest_version = join(["${pip_env} install ${proxy_flag} ${pkgname}==notreallyaversion 2>&1", - ' | grep -oP "\(from versions: .*\)" | sed -E "s/\(from versions: (.*?, )*(.*)\)/\2/g"', - ' | tr -d "[:space:]"']) + $latest_version = join(["${pip_env} install ${pypi_index} ${proxy_flag} ${pkgname}==notreallyaversion 2>&1", + ' | grep -oP "\(from versions: \K(.*)(?=\))" | tr -d "[:space:]" | tr "," "\n"', + $exclude_pre_releases_command, + ' | tail -n1']) # Packages with underscores in their names are listed with dashes in their place in `pip freeze` output $pkgname_with_dashes = regsubst($pkgname, '_', '-', 'G')