GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — nt junction by youknowone · Pull Request #6407 · RustPython/RustPython

Conversation

@youknowone

@youknowone youknowone commented Dec 11, 2025 •
edited by coderabbitai Bot
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • Bug Fixes

    • Fixed Windows path handling to properly format paths in build configuration.
  • New Features

    • Added Windows-specific file path utilities for type detection and existence checks.
    • Implemented readlink support for Windows junction and symlink resolution.
  • Chores

    • Extended Windows system interface feature availability.

✏️ Tip: You can customize this high-level summary in your review settings.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@coderabbitai

coderabbitai Bot commented Dec 11, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Walkthrough

The PR enhances Windows path handling in RustPython. It strips extended-length path prefixes in the build script, adds Windows system feature flags to the cargo manifest, and introduces Windows-specific file-type classification utilities, path existence checks, and readlink support with OsPathOrFd-based operations.

Changes

Cohort / File(s) Summary
Build configuration
crates/pylib/build.rs
Strips extended-length path prefix (\?) from canonicalized Lib path before exporting via cargo:rustc-env on Windows
Feature enablement
crates/vm/Cargo.toml
Adds Win32_System_IO and Win32_System_Kernel Windows-specific cargo features to the feature set
Windows path utilities
crates/vm/src/stdlib/nt.rs
Introduces PathArg helper, file-type classification functions (_path_isdir, _path_isfile, _path_islink, _path_isjunction, _path_exists, _path_lexists), readlink support for junctions/symlinks, OsPathOrFd-based path and handle operations, and replaces custom ProcessBasicInformation struct with Windows API version

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Windows API integration in nt.rs: Multiple new functions calling Windows APIs (reparse point handling, file type detection via handle and path) require careful validation of API usage and error handling.
  • OsPathOrFd support expansion: Path/FD conversion logic and dual-mode operation handling (both path and file descriptor inputs) across multiple new functions need thorough testing consideration.
  • Build script path manipulation: Platform-specific string handling for extended-length path prefixes requires validation across different Windows path scenarios.
  • readlink implementation: Reparse point data parsing and prefix preservation logic is non-trivial Windows-specific code.

Possibly related PRs

  • nt.skiproot, winapi.LCMapStringEx #6399: Adds skiproot/_path_splitroot_ex utilities to nt.rs, closely related Windows path-handling functionality in the same module.
  • fix scandir/lstat for windows #6357: Modifies OsPathOrFd handling in scandir/lstat operations; this PR expands OsPathOrFd support across multiple new path-checking functions.
  • Replace windows to windows-sys #6356: Modifies both Cargo.toml features and nt.rs Windows-specific code in parallel.

Suggested reviewers

  • ShaharNaveh

Poem

🐰 Hops through Windows paths so grand,
With \?\ stripped by steady hand,
readlink hops from junction deep,
OsPathOrFd secrets we now keep,
File types sorted, exits found—
RustPython's foot strikes solid ground! 🐾

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'nt junction' is too vague and generic; it lacks specificity about what changes are actually being made to the codebase. Provide a more descriptive title that clearly summarizes the main change, such as 'Add Windows junction and symlink support to nt module' or 'Implement Windows path type checking utilities for junctions and symlinks'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
  • X
  • Mastodon
  • Reddit
  • LinkedIn

Comment @coderabbitai help to get the list of available commands and usage tips.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@youknowone
youknowone force-pushed the nt branch from a67066c to c0dd54f Compare December 11, 2025 16:50
@youknowone youknowone changed the title nt module nt junction Dec 11, 2025
youknowone added 3 commits December 12, 2025 08:15
@youknowone
pylib strip path
32f2d41
@youknowone
nt._path_* functions,
c74e332
@youknowone
nt junction
e453c6d
@youknowone
youknowone force-pushed the nt branch from c0dd54f to e453c6d Compare December 11, 2025 23:15
@youknowone
youknowone marked this pull request as ready for review December 11, 2025 23:56
coderabbitai[bot]
coderabbitai Bot reviewed Dec 11, 2025
View reviewed changes

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
crates/pylib/build.rs (1)

19-22: Consider handling potential UTF-8 conversion failure.

The unwrap() on Line 20 assumes the canonicalized path is valid UTF-8, which may not always be true on Windows with certain file names. Consider using expect() with a descriptive message or handling the error more gracefully.

Apply this diff to provide a better error message:

-        let path_str = canonicalized_path.to_str().unwrap();
+        let path_str = canonicalized_path.to_str()
+            .expect("Failed to convert canonicalized path to UTF-8");
crates/vm/src/stdlib/nt.rs (1)

285-338: Consider documenting the disk_only parameter.

The disk_only parameter's purpose and behavior are not immediately clear from the code. Adding a doc comment explaining when it should be true/false would improve maintainability.

📜 Review details

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d34b2cf and e453c6d.

⛔ Files ignored due to path filters (2)
  • Lib/test/test_ntpath.py is excluded by !Lib/**
  • Lib/test/test_os.py is excluded by !Lib/**
📒 Files selected for processing (3)
  • crates/pylib/build.rs (1 hunks)
  • crates/vm/Cargo.toml (1 hunks)
  • crates/vm/src/stdlib/nt.rs (8 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

**/*.rs: Follow the default rustfmt code style by running cargo fmt to format Rust code
Always run clippy to lint Rust code (cargo clippy) before completing tasks and fix any warnings or lints introduced by changes
Follow Rust best practices for error handling and memory management
Use the macro system (pyclass, pymodule, pyfunction, etc.) when implementing Python functionality in Rust

Files:

  • crates/pylib/build.rs
  • crates/vm/src/stdlib/nt.rs
🧠 Learnings (5)
📓 Common learnings
Learnt from: moreal
Repo: RustPython/RustPython PR: 5847
File: vm/src/stdlib/stat.rs:547-567
Timestamp: 2025-06-27T14:47:28.810Z
Learning: In RustPython's stat module implementation, platform-specific constants like SF_SUPPORTED and SF_SYNTHETIC should be conditionally declared only for the platforms where they're available (e.g., macOS), following CPython's approach of optional declaration using #ifdef checks rather than providing fallback values for other platforms.
Learnt from: moreal
Repo: RustPython/RustPython PR: 5847
File: vm/src/stdlib/stat.rs:547-567
Timestamp: 2025-06-27T14:47:28.810Z
Learning: In RustPython's stat module implementation, platform-specific constants like SF_SUPPORTED and SF_SYNTHETIC should be conditionally declared only for the platforms where they're available (e.g., macOS), following CPython's approach of optional declaration rather than providing fallback values for other platforms.
Learnt from: reactive-firewall
Repo: RustPython/RustPython PR: 6176
File: .github/workflows/Check_Tests.yml:133-141
Timestamp: 2025-09-28T22:22:55.921Z
Learning: In the RustPython project's CI-5974-Test-RustPython-Integration action, the override-rustpython-path input is marked as required but has runtime fallback logic that defaults to RUSTPYTHONPATH environment variable or "Lib" if neither is provided, making explicit specification unnecessary in most cases.
📚 Learning: 2025-06-28T16:31:03.991Z
Learnt from: arihant2math
Repo: RustPython/RustPython PR: 5790
File: build.rs:2-2
Timestamp: 2025-06-28T16:31:03.991Z
Learning: In Cargo build scripts (build.rs), the environment variable CARGO_CFG_TARGET_OS is guaranteed to exist and is automatically set by Cargo during the build process, making unwrap() safe to use when accessing this variable.

Applied to files:

  • crates/pylib/build.rs
  • crates/vm/Cargo.toml
📚 Learning: 2025-11-29T12:17:28.606Z
Learnt from: CR
Repo: RustPython/RustPython PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-29T12:17:28.606Z
Learning: Applies to Lib/**/*.py : Minimize modifications to CPython standard library files in the `Lib/` directory; modifications should be minimal and only to work around RustPython limitations

Applied to files:

  • crates/pylib/build.rs
📚 Learning: 2025-06-27T14:47:28.810Z
Learnt from: moreal
Repo: RustPython/RustPython PR: 5847
File: vm/src/stdlib/stat.rs:547-567
Timestamp: 2025-06-27T14:47:28.810Z
Learning: In RustPython's stat module implementation, platform-specific constants like SF_SUPPORTED and SF_SYNTHETIC should be conditionally declared only for the platforms where they're available (e.g., macOS), following CPython's approach of optional declaration rather than providing fallback values for other platforms.

Applied to files:

  • crates/vm/src/stdlib/nt.rs
📚 Learning: 2025-06-27T14:47:28.810Z
Learnt from: moreal
Repo: RustPython/RustPython PR: 5847
File: vm/src/stdlib/stat.rs:547-567
Timestamp: 2025-06-27T14:47:28.810Z
Learning: In RustPython's stat module implementation, platform-specific constants like SF_SUPPORTED and SF_SYNTHETIC should be conditionally declared only for the platforms where they're available (e.g., macOS), following CPython's approach of optional declaration using #ifdef checks rather than providing fallback values for other platforms.

Applied to files:

  • crates/vm/src/stdlib/nt.rs
🔇 Additional comments (8)
crates/vm/Cargo.toml (1)

127-129: LGTM!

The new Windows-specific features Win32_System_IO and Win32_System_Kernel are correctly added to support the enhanced Windows path handling functionality in nt.rs, including DeviceIoControl for reparse point operations and PROCESS_BASIC_INFORMATION for process queries.

crates/vm/src/stdlib/nt.rs (7)

240-250: LGTM!

The PathArg helper struct provides a clean abstraction for converting Python path-like objects to either paths or file descriptors, following the established pattern in the codebase.


252-283: LGTM!

The internal file type constants and _test_info function correctly classify Windows file types using file attributes and reparse tags. The logic properly distinguishes between regular files, directories, symlinks, and mount points (junctions).


340-414: LGTM, but note the complex fallback logic.

The function correctly handles multiple fallback scenarios when opening files fails, including using Rust's standard library metadata as a fallback. This complexity is necessary for robust Windows file type checking across different file types and permissions.


416-517: LGTM!

The existence checking functions provide comprehensive handling of Windows-specific edge cases, including console devices like \\.\CON. The wrapper functions cleanly abstract the differences between file descriptor and path-based operations.


519-565: LGTM!

The Python-exposed path checking functions provide a clean, consistent interface for Windows-specific file type and existence checks, including the Windows-specific junction detection.


1478-1528: The field name InheritedFromUniqueProcessId is correct for windows-sys 0.61.2 and matches the PROCESS_BASIC_INFORMATION structure definition. The field is properly defined as a pointer-sized integer (usize in Rust), and the code correctly casts it to u32 when returning the parent process ID. No changes are needed.


1569-1693: Revert the suggested refactor—the current implementation is correct.

The manual byte parsing in the readlink function correctly implements the Windows REPARSE_DATA_BUFFER structure per official documentation. The byte offsets (8, 10, 16 for mount points; 20 for symlinks) are not "magic numbers"—they represent the documented Windows API structure layout. Using repr(C) struct definitions, as originally suggested, would be unsafe and incorrect because the REPARSE_DATA_BUFFER contains a union-like payload that varies by reparse tag type. The current approach of manually parsing from &[u8] is the recommended pattern for this Windows API and avoids undefined behavior. The existing comments accurately document the structure layout. No changes needed.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@youknowone
youknowone merged commit 3438fb2 into RustPython:main Dec 12, 2025
13 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@youknowone
youknowone deleted the nt branch December 12, 2025 00:03
This was referenced Dec 25, 2025
impl os functions #6484
Merged
upgrade shutil #6558
Merged
This was referenced Jan 19, 2026
Add sys._stdlib_dir #6798
Merged
Prohibit AI PR submit #6813
Merged
@coderabbitai coderabbitai Bot mentioned this pull request Feb 3, 2026
impl more nt #6984
Merged
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@coderabbitai coderabbitai[bot] coderabbitai[bot] left review comments

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

1 participant

@youknowone
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.