diff --git a/docs/source/conf.py b/docs/source/conf.py index 822b6a8a76bd1..82dc40ca42c68 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -96,6 +96,19 @@ def setup(app): generate_examples() +def get_repo_base_and_branch(pr_number): + url = f"https://api.github.com/repos/vllm-project/vllm/pulls/{pr_number}" + response = requests.get(url) + if response.status_code == 200: + data = response.json() + base = data['base']['repo']['full_name'] + branch = data['base']['ref'] + return base, branch + else: + logger.error(f"Failed to fetch PR details: {response.status_code}") + return None, None + + def linkcode_resolve(domain, info): if domain != 'py': return None @@ -104,14 +117,26 @@ def linkcode_resolve(domain, info): filename = info['module'].replace('.', '/') module = info['module'] try: + # try to determine the correct file and line number to link to obj = sys.modules[module] for part in info['fullname'].split('.'): obj = getattr(obj, part) lineno = inspect.getsourcelines(obj)[1] filename = (inspect.getsourcefile(obj) or f"{filename}.py").split("vllm/", 1)[1] + + if filename.startswith("checkouts/"): + # a PR build on readthedocs + pr_number = filename.split("/")[1] + filename = filename.split("/", 2)[2] + base, branch = get_repo_base_and_branch(pr_number) + if base and branch: + return f"https://github.com/{base}/blob/{branch}/{filename}#L{lineno}" + + # Otherwise, link to the source file on the main branch return f"https://github.com/vllm-project/vllm/blob/main/{filename}#L{lineno}" except Exception: + # last resort fallback, just try to point to the correct file on main return f"https://github.com/vllm-project/vllm/blob/main/{filename}.py"