From f6197fcb6fe5e8e88f1001ed07b432ebf548d016 Mon Sep 17 00:00:00 2001 From: Ian Bull Date: Sun, 24 Nov 2024 21:55:57 -0800 Subject: [PATCH] feat: prefer denort binary in target/ directory when available Enhances the deno compile workflow for denort development by automatically checking for a denort binary in the same directory as the deno binary, provided both are located within a target/ directory. If found, this denort binary will be used. Key points: - The DENORT_BIN environment variable remains supported for explicitly specifying a custom denort binary path. - Includes additional logic to verify if the deno binary is a symlink pointing to an executable in the target/ directory. --- cli/standalone/binary.rs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs index e35119e0aa7dfa..2d25bdaf686970 100644 --- a/cli/standalone/binary.rs +++ b/cli/standalone/binary.rs @@ -4,6 +4,7 @@ use std::borrow::Cow; use std::collections::BTreeMap; use std::collections::HashMap; use std::collections::VecDeque; +use std::env; use std::env::current_exe; use std::ffi::OsString; use std::fs; @@ -15,6 +16,7 @@ use std::io::Seek; use std::io::SeekFrom; use std::io::Write; use std::ops::Range; +use std::path::Component; use std::path::Path; use std::path::PathBuf; use std::process::Command; @@ -454,7 +456,7 @@ impl<'a> DenoCompileBinaryWriter<'a> { // // Phase 2 of the 'min sized' deno compile RFC talks // about adding this as a flag. - if let Some(path) = std::env::var_os("DENORT_BIN") { + if let Some(path) = get_dev_binary_path() { return std::fs::read(&path).with_context(|| { format!("Could not find denort at '{}'", path.to_string_lossy()) }); @@ -904,6 +906,38 @@ impl<'a> DenoCompileBinaryWriter<'a> { } } +fn get_denort(deno_exe: PathBuf) -> Option { + let mut denort = deno_exe; + denort.set_file_name("denort"); + denort.exists().then(|| denort.into_os_string()) +} + +fn is_in_target(path: &Path) -> bool { + path + .components() + .any(|component| component == Component::Normal("target".as_ref())) +} + +fn get_dev_binary_path() -> Option { + env::var_os("DENORT_BIN").or_else(|| { + env::current_exe().ok().and_then(|exec_path| { + if is_in_target(&exec_path) { + get_denort(exec_path) + } else if exec_path.is_symlink() { + fs::read_link(&exec_path).ok().and_then(|target_path| { + if is_in_target(&target_path) { + get_denort(target_path) + } else { + None + } + }) + } else { + None + } + }) + }) +} + /// This function returns the environment variables specified /// in the passed environment file. fn get_file_env_vars(