X Tutup
Skip to content

New-Item Type SymbolicLink on Unix-like platforms: converts relative target paths to absolute ones, doesn't normalize path separators on macOS #13064

@mklement0

Description

@mklement0

PR #12797 tried to implement support for relative target paths for symbolic links (symlinks).

On Windows, this now works properly as of PowerShell Core 7.1.0-preview.4, including normalizing path separators to \.

On Unix-like platforms, a relative input path is still unexpectedly converted to a full path and stored as such in the symlink.

Curiously that doesn't happen when you use \ as a separator on macOS - which must be normalized to / on Unix-like platforms - but the normalization doesn't happen and the \-based relative path is stored as-is, which results in a broken symlink; on Linux, the unexpected conversion to an absolute path (with appropriate separators) takes place.

Steps to reproduce

# OK on Windows, FAILS on macOS and Linux.
Describe "New-Item symlinks" {
  BeforeAll {
    Push-Location testdrive:

    $targets = "./$PID.tmp", ".\$PID.tmp"
    $lnk = "$PID-L.tmp"

    'foo' > $targets[0]

  }

  It "Can create symlink with relative target <target>" -TestCases @{ target = $targets[0] }, @{ target = $targets[1] } {
    param([string] $target)

    $null = New-Item -Type SymbolicLink  $lnk -Target $target  -Force

    # Make sure the relative target path was recorded as such and uses
    # the platform-appropriate separator.
    (Get-Item $lnk).Target | Should -Be ($target -replace '[\\/]', [IO.Path]::DirectorySeparatorChar)

  }

  AfterAll {
    Pop-Location
  }
}

Expected behavior

The tests should succeed on all platforms.

Actual behavior

On macOS and Linux, both tests fail:

The first test fails, because the relative path was converted to an absolute one.

      Expected: './95916.tmp'
      But was:  '/private/t...'

On macOS, the second test fails because \ wasn't normalized to /:

      Expected: './95916.tmp'
      But was:  '.\95916.tmp'

On Linux, by contrast, the test fails because the relative path is again unexpectedly converted to an absolute one.

Environment data

PowerShell Core 7.1.0-preview.4

Metadata

Metadata

Assignees

No one assigned

    Labels

    Issue-BugIssue has been identified as a bug in the productUp-for-GrabsUp-for-grabs issues are not high priorities, and may be opportunities for external contributorsWG-Cmdlets-Corecmdlets in the Microsoft.PowerShell.Core module

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      X Tutup