Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

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

Chiusa Adatta ai principianti
#4,059 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

  • #4106 di @xiehuanyi — chiusa senza merge

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
88/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
tooling

Direzione di ricerca

Inizia in graphify/extract.py, nella costruzione del percorso _symbolless_files, e verifica come viene selezionato root quando viene passato solo cache_root. Riproduci il caso tra unità in Windows, quindi esegui tests/test_languages.py::test_objc_bridging_header_not_isolated, tests/test_languages.py::test_objc_paired_no_dangling_edges e tests/test_partial_extraction_warning.py. Il lavoro è concluso quando l’estrazione non si interrompe più tra unità e i test interessati hanno esito positivo.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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).

Lingua principale
Python
Stelle
124k
Fork
11.9k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di Graphify-Labs/graphify

Tutte le issue di Graphify-Labs/graphify

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.