Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

`extract()` raises `ValueError` on Windows when a symbol-less file and `root` are on different drives (regression in 0.9.75)

クローズ 初心者向け
#4,059 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

  • #4106 @xiehuanyi による — マージされずにクローズ

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
88/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
tooling

調査の方向性

graphify/extract.py の _symbolless_files パス構築から始め、cache_root だけが渡された場合に root がどのように選択されるかを確認してください。Windows でドライブをまたぐケースを再現し、その後 tests/test_languages.py::test_objc_bridging_header_not_isolated、tests/test_languages.py::test_objc_paired_no_dangling_edges、tests/test_partial_extraction_warning.py を実行してください。抽出がドライブをまたいでも中断されず、影響を受けるテストがパスすれば完了です。

索引モデルが issue の本文から書いたものです。

説明

Summary

The "cleanly parsed code file yields no symbols" warning added in 0.9.75 (#4009, fixes #3946) builds the displayed path with an unguarded os.path.relpath in graphify/extract.py:

_symbolless_files.append((os.path.relpath(str(_p), str(root)).replace("\\", "/"), _size))

On Windows os.path.relpath raises ValueError: path is on mount 'D:', start on mount 'C:' when the file and root are on different drives, so a diagnostic warning aborts the whole extraction.

The automated review on #4009 already flagged this risk ("os.path.relpath can raise ValueError and crash extract() for out-of-root paths on Windows", medium severity). This issue adds a concrete reproduction, the affected tests, and a verified fix.

Environment

Windows 11, Python 3.12.13, graphify v0.9.75 (48d7c0e8).

Reproduction

root is not passed, so extract() falls back to cache_root (elif cache_root is not None: root = cache_root).

import tempfile
from pathlib import Path
from graphify.extract import extract

p = Path(r"D:\proj\a.py")   # contains only: "# comment\nX = 1\n"  -> the file yields exactly 1 node
with tempfile.TemporaryDirectory() as td:   # %TEMP% is on C:
    extract([p], cache_root=Path(td))

Result on v0.9.75:

ValueError: path is on mount 'D:', start on mount 'C:'
  • On v0.9.74 the same call succeeds.
  • On v0.9.75 the same call succeeds when root=p.parent is passed explicitly.
  • The test suite hits it too when the checkout is on a different drive from %TEMP%: tests/test_languages.py::test_objc_bridging_header_not_isolated and tests/test_languages.py::test_objc_paired_no_dangling_edges fail, because the _corpus() helper passes only cache_root=<tmp dir>. A clean v0.9.75 checkout on D: gives 2 failed; the same checkout on C: gives 2 passed.

Scope

  • The graphify extract CLI is not affected: it passes root=target explicitly (ast_kwargs: dict = {"cache_root": out_root, "root": target}). Checked end to end with the repo on D:, GRAPHIFY_OUT on C: and one symbol-less .py file: the warning is printed, graph.json is written, exit code 0.
  • Affected: callers of extract() that pass cache_root without root on a different drive from the scanned files, and the test suite on Windows checkouts outside the temp drive.

Suggested fix

try:
    _rel = os.path.relpath(str(_p), str(root)).replace("\\", "/")
except ValueError:          # different drive on Windows
    _rel = _p.as_posix()
_symbolless_files.append((_rel, _size))

Applied to a clean v0.9.75 checkout on D:: the reproduction above succeeds, the -k objc tests in tests/test_languages.py pass (33 passed), and tests/test_partial_extraction_warning.py passes (11 passed).

主要言語
Python
スター
124k
フォーク
11.9k
PR マージ指標
30日以内にマージされた PR はありません

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

Graphify-Labs/graphify のほかの issue

Graphify-Labs/graphify の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。