From de67952919b28b463ed09a0916d08969c6eac981 Mon Sep 17 00:00:00 2001 From: Rich Trott Date: Sat, 13 Mar 2021 18:33:07 -0800 Subject: [PATCH] path: fix posix.relative() on Windows Fixes: https://github.com/nodejs/node/issues/13683 PR-URL: https://github.com/nodejs/node/pull/37747 Reviewed-By: Matteo Collina --- lib/path.js | 16 +++++++++++++++- test/known_issues/known_issues.status | 14 -------------- .../test-path-posix-relative-on-windows.js | 0 test/parallel/test-path-resolve.js | 12 ++++++++++-- 4 files changed, 25 insertions(+), 17 deletions(-) rename test/{known_issues => parallel}/test-path-posix-relative-on-windows.js (100%) diff --git a/lib/path.js b/lib/path.js index 6001b0ba8301a7..95cb3201bf2fe0 100644 --- a/lib/path.js +++ b/lib/path.js @@ -23,11 +23,15 @@ const { FunctionPrototypeBind, + RegExp, StringPrototypeCharCodeAt, + StringPrototypeIndexOf, StringPrototypeLastIndexOf, + StringPrototypeReplace, StringPrototypeSlice, StringPrototypeToLowerCase, } = primordials; + const { CHAR_UPPERCASE_A, CHAR_LOWERCASE_A, @@ -1014,7 +1018,17 @@ const posix = { let resolvedAbsolute = false; for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { - const path = i >= 0 ? args[i] : process.cwd(); + let path; + if (i >= 0) { + path = args[i]; + } else { + const _ = StringPrototypeReplace( + process.cwd(), + new RegExp(`\\${module.exports.sep}`, 'g'), + posix.sep + ); + path = StringPrototypeSlice(_, StringPrototypeIndexOf(_, posix.sep)); + } validateString(path, 'path'); diff --git a/test/known_issues/known_issues.status b/test/known_issues/known_issues.status index 690e6e9840b77c..7a50c10404c723 100644 --- a/test/known_issues/known_issues.status +++ b/test/known_issues/known_issues.status @@ -15,32 +15,18 @@ test-vm-timeout-escape-queuemicrotask: SKIP [$system==win32] [$system==linux] -# Windows-specific test -test-path-posix-relative-on-windows: SKIP [$system==macos] -# Windows-specific test -test-path-posix-relative-on-windows: SKIP [$system==solaris] -# Windows-specific test -test-path-posix-relative-on-windows: SKIP [$system==freebsd] -# Windows-specific test -test-path-posix-relative-on-windows: SKIP [$system==aix] -# Windows-specific test -test-path-posix-relative-on-windows: SKIP [$arch==arm] # The Raspberry Pis are too slow to run this test. # See https://github.com/nodejs/build/issues/2227#issuecomment-608334574 test-crypto-authenticated-stream: SKIP -# Windows-specific test -test-path-posix-relative-on-windows: SKIP [$system==ibmi] -# Windows-specific test -test-path-posix-relative-on-windows: SKIP diff --git a/test/known_issues/test-path-posix-relative-on-windows.js b/test/parallel/test-path-posix-relative-on-windows.js similarity index 100% rename from test/known_issues/test-path-posix-relative-on-windows.js rename to test/parallel/test-path-posix-relative-on-windows.js diff --git a/test/parallel/test-path-resolve.js b/test/parallel/test-path-resolve.js index ed3c7c4c5a0113..eed54dba5a6663 100644 --- a/test/parallel/test-path-resolve.js +++ b/test/parallel/test-path-resolve.js @@ -9,6 +9,14 @@ const failures = []; const slashRE = /\//g; const backslashRE = /\\/g; +const posixyCwd = common.isWindows ? + (() => { + const _ = process.cwd() + .replaceAll(path.sep, path.posix.sep); + return _.slice(_.indexOf(path.posix.sep)); + })() : + process.cwd(); + const resolveTests = [ [ path.win32.resolve, // Arguments result @@ -31,8 +39,8 @@ const resolveTests = [ // Arguments result [[['/var/lib', '../', 'file/'], '/var/file'], [['/var/lib', '/../', 'file/'], '/file'], - [['a/b/c/', '../../..'], process.cwd()], - [['.'], process.cwd()], + [['a/b/c/', '../../..'], posixyCwd], + [['.'], posixyCwd], [['/some/dir', '.', '/absolute/'], '/absolute'], [['/foo/tmp.3/', '../tmp.3/cycles/root.js'], '/foo/tmp.3/cycles/root.js'] ]