mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
fix(cli): Map error kind to PermissionDenied
when symlinking fails due to permissions (#25398)
Fixes https://github.com/denoland/deno/issues/25333. We fall back to junctions if the error kind is `PermissionDenied` but the std library actually sets the kind to `Uncategorized` if the symlink fails due to insufficient privileges. This was causing the fallback to not actually fall back in this case.
This commit is contained in:
parent
9a36b6fb04
commit
105c571fb6
1 changed files with 11 additions and 4 deletions
|
@ -496,9 +496,9 @@ pub fn hard_link_dir_recursive(from: &Path, to: &Path) -> Result<(), AnyError> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn symlink_dir(oldpath: &Path, newpath: &Path) -> Result<(), Error> {
|
pub fn symlink_dir(oldpath: &Path, newpath: &Path) -> Result<(), Error> {
|
||||||
let err_mapper = |err: Error| {
|
let err_mapper = |err: Error, kind: Option<ErrorKind>| {
|
||||||
Error::new(
|
Error::new(
|
||||||
err.kind(),
|
kind.unwrap_or_else(|| err.kind()),
|
||||||
format!(
|
format!(
|
||||||
"{}, symlink '{}' -> '{}'",
|
"{}, symlink '{}' -> '{}'",
|
||||||
err,
|
err,
|
||||||
|
@ -510,12 +510,19 @@ pub fn symlink_dir(oldpath: &Path, newpath: &Path) -> Result<(), Error> {
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
{
|
{
|
||||||
use std::os::unix::fs::symlink;
|
use std::os::unix::fs::symlink;
|
||||||
symlink(oldpath, newpath).map_err(err_mapper)?;
|
symlink(oldpath, newpath).map_err(|e| err_mapper(e, None))?;
|
||||||
}
|
}
|
||||||
#[cfg(not(unix))]
|
#[cfg(not(unix))]
|
||||||
{
|
{
|
||||||
use std::os::windows::fs::symlink_dir;
|
use std::os::windows::fs::symlink_dir;
|
||||||
symlink_dir(oldpath, newpath).map_err(err_mapper)?;
|
symlink_dir(oldpath, newpath).map_err(|err| {
|
||||||
|
if let Some(code) = err.raw_os_error() {
|
||||||
|
if code as u32 == winapi::shared::winerror::ERROR_PRIVILEGE_NOT_HELD {
|
||||||
|
return err_mapper(err, Some(ErrorKind::PermissionDenied));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err_mapper(err, None)
|
||||||
|
})?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue