Repository navigation
v0.5.0
First release that handles directory junctions end-to-end. Junctions
are NTFS folder pointers — same purpose as symlinks for directories, but
unlike symlinks they need no admin and no Developer Mode. They're the
right tool for "make this folder appear at another path on the same
machine," and they're now first-class citizens in PowerLink.
Added
- Junction page (new sidebar entry between Clone and Inspector).
Pick a target folder, pick the parent folder where the junction
appears, hit Create. The link name is auto-derived from the target's
basename and editable. Optional "allow missing target" toggle for
intentional dangling junctions (deploy-script pattern). - Inspector now lists junctions alongside hardlinks. Two stacked
sections —Hardlinks (N)andJunctions (N, X dangling)— both
expandable. Each junction row shows the link path, target path, and
status (OK / dangling). Per-row Repair (pick a new target) and Delete
(removes only the reparse point — never touches the target). - Explorer integration for junctions across all three menu sites:
- Classic right-click on a folder: "PowerLink: Create junction
pointing at this folder" (opens the App pre-filled). - Classic right-click on a folder when something is picked:
"PowerLink: Drop as junction here" (symmetric with Drop-as-hardlink). - Right-drag a folder onto another folder: under a single
"PowerLink" submenu, "Junction here" appears next to "Clone tree
here (hardlinks)". Right-drag a file: "Hardlink here" alone.
The submenu groups everything under one parent so the drop menu
stays uncluttered next to Copy/Move/Create shortcut. - Win11 modern menu (sparse MSIX): "Drop as junction here" and
"Create junction pointing at this..." added to the cascade.
- Classic right-click on a folder: "PowerLink: Create junction
- CLI:
powerlink junction {create|info|delete|repair}and
powerlink drop-junction <target>.infoexits 0 (OK), 2 (dangling),
1 (error).deleterefuses non-junctions to prevent rmdir'ing a real
directory by mistake.repairoverwrites reparse data atomically.
Changed
- Drop-handler menu is now a 'PowerLink' submenu instead of two
top-level entries. Single visible "PowerLink >" cascades to the
applicable actions for the current selection. - Inspector page renamed to "Link inspector" internally — the title
and intro now cover both hardlinks and junctions. Sidebar entry stays
"Inspector" so muscle memory still works. - Settings → Explorer context menu copy mentions junctions; the
drag-and-drop description lists all three drop actions.
Fixed (safety-critical)
scan/clone/dedupcontinue to skip reparse points by default
— now locked in by tests. Previous releases happened to do the right
thing becauseEnumerationOptions.AttributesToSkip = ReparsePoint
was already set, but nothing protected against a casual removal of
that flag. Three regression tests now cover: self-referential junction
cycles don't deadlock the scan, junctions inside a scanned tree
aren't silently followed, and clone never hardlinks content reached
through a junction (which would let a later dedup rewrite the
junction's target into a hardlink to another copy — silent semantic
corruption).
Internal
Win32Junctionwrapper: DeviceIoControl FSCTL_SET/GET_REPARSE_POINT
with manualIO_REPARSE_TAG_MOUNT_POINTbuffer layout, NT-path
\??\prefix for substitute name, dangling-target detection,
long-path support, UNC-target rejection (junctions can't resolve
network paths). 19 xUnit tests across happy/edge/error cases.JunctionScanner: manual recursive walk that captures
reparse-point directories without descending into them. 4 tests
verify cycle safety + dangling detection.QueryContextMenuHResulthelper extracted to ShellExtUtils with
5 new C++ tests in the framework-free test exe — locks in the
"max offset + 1, NOT count" contract for the newCMD_JUNCTION = 2
offset in the drop handler.
What's Changed
- overlay: red-tinted Windows shortcut arrow for hardlinks by @dawidope in #1
- Add directory junction support by @dawidope in #2
New Contributors
Full Changelog: v0.4.2...v0.5.0