René's URL Explorer Experiment


Title: vfs: fix rename over non-empty directory by christianaurichzm · Pull Request #65613 · nodejs/node · GitHub

Open Graph Title: vfs: fix rename over non-empty directory by christianaurichzm · Pull Request #65613 · nodejs/node

X Title: vfs: fix rename over non-empty directory by christianaurichzm · Pull Request #65613 · nodejs/node

Description: MemoryProvider#renameSync() only rejected a destination whose type differed from the source (EISDIR/ENOTDIR). When both sides were directories it fell through to replacing the destination in its parent, so the destination directory and everything under it disappeared: // node --experimental-vfs const vfs = require('node:vfs').create(); vfs.mkdirSync('/src'); vfs.mkdirSync('/dst'); vfs.writeFileSync('/dst/keep.txt', 'keep'); vfs.renameSync('/src', '/dst'); // no error vfs.existsSync('/dst/keep.txt'); // false rename(2) accepts an existing directory as the destination only when it is empty, and fails with ENOTEMPTY otherwise. RealFSProvider delegates to fs.renameSync() and already behaves that way, so the two providers backing the same node:vfs API disagreed. Two smaller fixes in the same function, both covered by the new tests: a file replaced by a rename now loses a link, so a hard link to it no longer reports an inflated nlink; a rename whose two names resolve to the same entry is a no-op; renaming one hard link onto another used to remove the source name while the file kept its old link count.

Open Graph Description: MemoryProvider#renameSync() only rejected a destination whose type differed from the source (EISDIR/ENOTDIR). When both sides were directories it fell through to replacing the destination in its pa...

X Description: MemoryProvider#renameSync() only rejected a destination whose type differed from the source (EISDIR/ENOTDIR). When both sides were directories it fell through to replacing the destination in its pa...

Opengraph URL: https://github.com/nodejs/node/pull/65613

X: @github

direct link

Domain: github.com

react-profiling0
react-import-mapreact,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf
route-pattern/:user_id/:repository/pull/:id/files/:range(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:a9c161df-2de1-89b1-ac87-af374efbd15d
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-id868A:2678AD:3517AC:49E1A1:6AEDB5C6
html-safe-noncec414ed4a9bf4c2b0c21f0b9eea90009cb584857220b555d73ced1ad450b5b6cb
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4NjhBOjI2NzhBRDozNTE3QUM6NDlFMUExOjZBRURCNUM2IiwidmlzaXRvcl9pZCI6IjY3ODMxMzU2MzcyNzI2Mzg5MTgiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac92ff890f8c5b6874aab7fcb43f728e5bd429029a035072d47a6c3bd6c00e70a7
hovercard-subject-tagpull_request:4383457330
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
twitter:imagehttps://avatars.githubusercontent.com/u/36874062?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/36874062?s=400&v=4
og:image:altMemoryProvider#renameSync() only rejected a destination whose type differed from the source (EISDIR/ENOTDIR). When both sides were directories it fell through to replacing the destination in its pa...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Nonee40242599af5e7da0f281843dec7492c322688d4a48caeea85f9fb8e41c8ea53
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/nodejs/node git https://github.com/nodejs/node.git
octolytics-dimension-user_id9950313
octolytics-dimension-user_loginnodejs
octolytics-dimension-repository_id27193779
octolytics-dimension-repository_nwonodejs/node
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id27193779
octolytics-dimension-repository_network_root_nwonodejs/node
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release89cbf2bb52a24fc179bf5925abba0ba574b262ce
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#start-of-content
https://github.com/
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fpull%2F65613%2Ffiles%2F7789cf376f213f7224d41bbc2a7461cd9845b18b
GitHubRepository hosting, code review, and collaborationhttps://github.com/platform
CopilotAI coding agent for tasks, projects, and automated workhttps://github.com/features/copilot
ActionsCI/CD and automationhttps://github.com/features/actions
Code QualityQuality analysis, fixes, and enforcementhttps://github.com/features/code-quality
CodespacesCloud development environmentshttps://github.com/features/codespaces
Code SecurityVulnerability detection and remediationhttps://github.com/security/advanced-security/code-security
Secret ProtectionSecret scanning and leak preventionhttps://github.com/security/advanced-security/secret-protection
All Featureshttps://github.com/features
Documentationhttps://docs.github.com/en
Traininghttps://learn.github.com/skills
Certificationshttps://learn.github.com/credentials
Build with Copilothttps://github.com/features/ai
Customize Copilothttps://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-copilot-overview
Integrationshttps://github.com/marketplace
Trending reposhttps://github.com/trending
GitHub Sponsorshttps://github.com/open-source/sponsors
Developer articleshttps://github.com/resources/articles
ChangelogYour source for the latest features, improvements, and fixes across GitHub products, all in one place.https://github.blog/changelog/
Enterpriseshttps://github.com/enterprise
Teamhttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
See all industrieshttps://github.com/solutions/industry
Why GitHubhttps://github.com/why-github
Customer Storieshttps://github.com/customer-stories
Business insightshttps://github.com/solutions/executive-insights
Trust Centerhttps://github.com/trust-center
GitHub Advanced SecurityEnterprise-grade code securityhttps://github.com/security/advanced-security
Copilot for businessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Documentationhttps://docs.github.com/en
Resource centerhttps://github.com/resources
Bloghttps://github.blog/
Events & webinarshttps://github.com/resources/events
Community Forumhttps://github.com/orgs/community/discussions
Customer Storieshttps://github.com/customer-stories
Integrationshttps://github.com/marketplace
Customer supporthttps://help.github.com/
Traininghttps://learn.github.com/skills
GitHub Statushttps://www.githubstatus.com/
Abouthttps://github.com/about
Partnershttps://github.com/partners
Changeloghttps://github.blog/changelog/
GitHub UniverseThe event for developers, by developers — talks, workshops, and what’s next for GitHub.https://githubuniverse.com/
Pricinghttps://github.com/pricing
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fnodejs%2Fnode%2Fpull%2F65613%2Ffiles%2F7789cf376f213f7224d41bbc2a7461cd9845b18b
Sign uphttps://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=nodejs%2Fnode
Reloadhttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
Reloadhttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
Reloadhttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
nodejshttps://github.com/nodejs
nodehttps://github.com/nodejs/node
Codehttps://github.com/nodejs/node
Issues654 (654)https://github.com/nodejs/node/issues
Pull requests664 (664)https://github.com/nodejs/node/pulls
Actionshttps://github.com/nodejs/node/actions
Projectshttps://github.com/nodejs/node/projects
Security and qualityhttps://github.com/nodejs/node/security
Insightshttps://github.com/nodejs/node/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fnodejs%2Fnode%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fnodejs%2Fnode%2Fissues%2Fnew%2Fchoose
christianaurichzmhttps://github.com/christianaurichzm
nodejs:mainhttps://github.com/nodejs/node/tree/main
christianaurichzm:vfs-fix-rename-over-non-empty-directoryhttps://github.com/christianaurichzm/node/tree/vfs-fix-rename-over-non-empty-directory
Conversation 10 https://github.com/nodejs/node/pull/65613
Commits 2 https://github.com/nodejs/node/pull/65613/commits
Checks 38 https://github.com/nodejs/node/pull/65613/checks
Files changed https://github.com/nodejs/node/pull/65613/files
Please reload this pagehttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
vfs: fix rename over non-empty directory https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#top
Show all changes 2 commits https://github.com/nodejs/node/pull/65613/files
5eeb333 vfs: fix rename over non-empty directory christianaurichzm Aug 28, 2026 https://github.com/nodejs/node/pull/65613/commits/5eeb333bb15488a98f75c5b1e6daa3948b046847
7789cf3 vfs: fix rename over a lazy destination directory christianaurichzm Sep 1, 2026 https://github.com/nodejs/node/pull/65613/commits/7789cf376f213f7224d41bbc2a7461cd9845b18b
Clear filters https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
Please reload this pagehttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
Please reload this pagehttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
memory.js https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-e954e208a8f73fa7dd4ce5b1eb35b1f5cead8d2a9ce751037e54a65334f40963
test-vfs-memory-provider-dynamic.js https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-382fa9eac20f0aaab4ee897e7dfa9b489279443adc939d7518997eea51897581
test-vfs-rename.js https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-de692ebae7d07b17e039bdb461d5eaed5f0efb4f9ea750cada2ffae371335d29
lib/internal/vfs/providers/memory.jshttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-e954e208a8f73fa7dd4ce5b1eb35b1f5cead8d2a9ce751037e54a65334f40963
View file https://github.com/christianaurichzm/node/blob/7789cf376f213f7224d41bbc2a7461cd9845b18b/lib/internal/vfs/providers/memory.js
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/nodejs/node/pull/65613/files/{{ revealButtonHref }}
https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-e954e208a8f73fa7dd4ce5b1eb35b1f5cead8d2a9ce751037e54a65334f40963
https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-e954e208a8f73fa7dd4ce5b1eb35b1f5cead8d2a9ce751037e54a65334f40963
Please reload this pagehttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-e954e208a8f73fa7dd4ce5b1eb35b1f5cead8d2a9ce751037e54a65334f40963
test/parallel/test-vfs-memory-provider-dynamic.jshttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-382fa9eac20f0aaab4ee897e7dfa9b489279443adc939d7518997eea51897581
View file https://github.com/christianaurichzm/node/blob/7789cf376f213f7224d41bbc2a7461cd9845b18b/test/parallel/test-vfs-memory-provider-dynamic.js
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/nodejs/node/pull/65613/files/{{ revealButtonHref }}
https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-382fa9eac20f0aaab4ee897e7dfa9b489279443adc939d7518997eea51897581
https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-382fa9eac20f0aaab4ee897e7dfa9b489279443adc939d7518997eea51897581
https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-382fa9eac20f0aaab4ee897e7dfa9b489279443adc939d7518997eea51897581
test/parallel/test-vfs-rename.jshttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-de692ebae7d07b17e039bdb461d5eaed5f0efb4f9ea750cada2ffae371335d29
View file https://github.com/christianaurichzm/node/blob/7789cf376f213f7224d41bbc2a7461cd9845b18b/test/parallel/test-vfs-rename.js
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/nodejs/node/pull/65613/files/{{ revealButtonHref }}
https://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b#diff-de692ebae7d07b17e039bdb461d5eaed5f0efb4f9ea750cada2ffae371335d29
Please reload this pagehttps://github.com/nodejs/node/pull/65613/files/7789cf376f213f7224d41bbc2a7461cd9845b18b
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.