{"record":{"id":"154d4bb5990dba98","repo":"denoland/deno","slug":"you-don-t-have-write-permission-to-because-it-s","errorCode":null,"errorMessage":"You don't have write permission to {} because it's owned by root.\nConsider updating deno through your package manager if its installed from it.\nOtherwise run `deno upgrade` as root.","messagePattern":"You don't have write permission to (.+?) because it's owned by root\\.\nConsider updating deno through your package manager if its installed from it\\.\nOtherwise run `deno upgrade` as root\\.","errorType":"exception","errorClass":"AnyError","httpStatus":null,"severity":"error","filePath":"cli/tools/upgrade.rs","lineNumber":2026,"sourceCode":"        \"failed to get metadata of the current executable at '{}'\",\n        current_exe_path.display()\n      )\n    })?;\n    return Ok(metadata.permissions());\n  };\n\n  let permissions = metadata.permissions();\n  if permissions.readonly() {\n    bail!(\n      \"You do not have write permission to {}\",\n      output_exe_path.display()\n    );\n  }\n  #[cfg(unix)]\n  if std::os::unix::fs::MetadataExt::uid(&metadata) == 0\n    && !nix::unistd::Uid::effective().is_root()\n  {\n    bail!(\n      concat!(\n        \"You don't have write permission to {} because it's owned by root.\\n\",\n        \"Consider updating deno through your package manager if its installed from it.\\n\",\n        \"Otherwise run `deno upgrade` as root.\",\n      ),\n      output_exe_path.display()\n    );\n  }\n  Ok(permissions)\n}\n\nfn check_exe(exe_path: &Path) -> Result<(), AnyError> {\n  let output = Command::new(exe_path)\n    .arg(\"-V\")\n    .stderr(std::process::Stdio::inherit())\n    .output()\n    .with_context(|| format!(\"failed to run '{}'\", exe_path.display()))?;\n  if !output.status.success() {","sourceCodeStart":2008,"sourceCodeEnd":2044,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/cli/tools/upgrade.rs#L2008-L2044","documentation":"Unix-specific follow-up to the write-permission check: the target executable is owned by uid 0 (root) while the current process is not root, so even with write bits set the replace would fail. The message recommends using the system package manager or running the upgrade as root. This is the classic 'installed via apt/brew-as-root into /usr/local' situation.","triggerScenarios":"`deno upgrade` where the existing deno binary (or output path) is root-owned and the user is not root — typically because it was installed with sudo (curl|sh into /usr/local/bin) or by a system package, triggering the uid-0 check at cli/tools/upgrade.rs:2026.","commonSituations":"Servers/containers where deno was installed as root and later used by a normal user; shared machines; Docker images baking deno as root; users following install docs that pipe curl to sudo sh.","solutions":["Run `sudo deno upgrade` if you intend the system-wide install to be updated.","Better: reinstall deno under your user (e.g. `$HOME/.deno/bin`) and put that first in PATH, so upgrades need no root.","If installed by a package manager (apt/homebrew-as-root), update via that package manager instead.","Or `sudo chown $(id -u) <path>` to take ownership, then upgrade normally."],"exampleFix":"# before\ndeno upgrade  # owned by root -> error\n\n# after (option A: root update)\nsudo deno upgrade\n# after (option B: user-local install)\ncurl -fsSL https://deno.land/install.sh | sh   # installs to ~/.deno/bin\nexport PATH=\"$HOME/.deno/bin:$PATH\"","handlingStrategy":"validation","validationCode":"deno_bin=\"$(command -v deno)\"\n[ \"$(stat -c %u \"$deno_bin\" 2>/dev/null)\" = \"0\" ] && [ \"$(id -u)\" != 0 ] && { echo \"root-owned install — use sudo or move to ~/.deno\"; exit 1; }\ndeno upgrade","typeGuard":null,"tryCatchPattern":"deno upgrade 2>err.log || { grep -q 'owned by root' err.log && sudo deno upgrade; }","preventionTips":["Prefer user-local installs (~/.deno/bin first in PATH) so upgrades never need root.","For system installs, update via the owning package manager instead of deno upgrade.","In Dockerfiles, install deno as the runtime user, not root, when users will self-upgrade."],"tags":["upgrade","permissions","root","unix","ownership"],"backgroundTag":"permission-denied","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}