{"record":{"id":"401632c3518cab4a","repo":"SeleniumHQ/selenium","slug":"no-stable-docfx-versions-found-use-allow-prerel","errorCode":null,"errorMessage":"No stable DocFX versions found. Use --allow-prerelease to include prereleases.","messagePattern":"No stable DocFX versions found\\. Use --allow-prerelease to include prereleases\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"warning","filePath":"scripts/update_docfx.py","lineNumber":48,"sourceCode":"        if explicit_version not in versions:\n            raise ValueError(f\"Requested DocFX version {explicit_version!r} not found in NuGet index\")\n        return explicit_version\n\n    parsed = []\n    for v in versions:\n        try:\n            pv = Version(v)\n        except InvalidVersion:\n            continue\n        if not allow_prerelease and pv.is_prerelease:\n            continue\n        parsed.append((pv, v))\n\n    if not parsed:\n        if allow_prerelease:\n            raise ValueError(\"No parseable DocFX versions found in NuGet index\")\n        else:\n            raise ValueError(\"No stable DocFX versions found. Use --allow-prerelease to include prereleases.\")\n\n    return max(parsed, key=lambda item: item[0])[1]\n\n\ndef sha256_of_url(url):\n    digest = hashlib.sha256()\n    r = http.request(\"GET\", url, preload_content=False)\n    for chunk in r.stream(1024 * 1024):\n        digest.update(chunk)\n    r.release_conn()\n    return digest.hexdigest()\n\n\ndef render_docfx_repo(version, sha256):\n    return f'''\\\n\"\"\"Repository rule to download the docfx NuGet package.\"\"\"\n\n_BUILD = \"\"\"","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/SeleniumHQ/selenium/blob/aa36b38e696a0909e973bdf5e2f9031ffe842c4b/scripts/update_docfx.py#L30-L66","documentation":"Raised in choose_version() when every parseable version in the NuGet index is a pre-release (Version.is_prerelease) and --allow-prerelease was not passed. This is a guard that prevents silently pinning docs to an unstable DocFX build.","triggerScenarios":"Running `python scripts/update_docfx.py` (no --allow-prerelease) when the only published DocFX versions are pre-releases. The loop parses versions but filters them all out at the `if not allow_prerelease and pv.is_prerelease` check, leaving an empty parsed list.","commonSituations":"DocFX temporarily has no stable release on NuGet (all are -preview); a fork/mirror only mirrors pre-release builds; the script is run in an environment where the stable release was unpublished.","solutions":["Add --allow-prerelease if a pre-release is acceptable for your docs build.","Pin a known-good stable version with --version <stable> (verify it exists in the index first).","Wait for the next stable DocFX release if pre-releases are unacceptable.","Confirm you are hitting the official NuGet index and not a stale mirror."],"exampleFix":"# before\npython scripts/update_docfx.py\n\n# after\npython scripts/update_docfx.py --allow-prerelease","handlingStrategy":"validation","validationCode":"# Check if any stable version exists before relying on auto-selection\nfrom packaging.version import Version\nstables = [v for v in versions if not Version(v).is_prerelease]\nif not stables and not args.allow_prerelease:\n    print(\"Only pre-releases available; pass --allow-prerelease\", file=sys.stderr)\n    sys.exit(2)","typeGuard":null,"tryCatchPattern":"try:\n    version = choose_version(versions, args.allow_prerelease, args.version)\nexcept ValueError as e:\n    if \"--allow-prerelease\" in str(e):\n        # Decide policy: accept pre-release or fail the build\n        if os.environ.get(\"ALLOW_DOCFX_PRERELEASE\"):\n            version = choose_version(versions, True, args.version)\n        else:\n            raise","preventionTips":["Document the --allow-prerelease flag in your docs-build README.","In CI, decide a pre-release policy explicitly rather than relying on the latest stable always existing.","Monitor DocFX release channels for gaps in stable publishing."],"tags":["python","build-script","versioning","prerelease"],"backgroundTag":null,"analyzedSha":"aa36b38e696a0909e973bdf5e2f9031ffe842c4b","analyzedAt":"2026-08-14T02:32:32.244Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}