Compare commits

..

2 commits

6 changed files with 24 additions and 26 deletions

View file

@ -10,6 +10,7 @@
.Op Fl -find Ar root
.Op Fl -pc Ar flags
.Ar target
.Op Fl -or Ar alt
.Op Ar --\ args
.Sh DESCRIPTION
The
@ -29,6 +30,8 @@ The resulting script will locate the target binary in the given directory using
.Xr find 1 .
.It Fl h , Fl -help
Print a short help message.
.It Fl -or Ar fallback
The resulting script will fall back to the provided argument if the target is not executable.
.It Fl -pc Ar flags
The resulting script will pass the arguments converted with
.Xr path-convert 1 . path-convert will be invoked with the provided flags forwarded (use 'x' to forward no flags).

View file

@ -1,6 +1,6 @@
[package]
name = "mkwin"
version = "0.1.1"
version = "0.2.0"
edition = "2021"
[dependencies]

View file

@ -3,13 +3,13 @@
use std::process::exit;
/// no argument for target; code 1
pub fn missing_target() {
pub fn missing_target() -> ! {
eprintln!("mkwin: missing target");
exit(1);
}
/// failed to canonicalize target path; code 2
pub fn canonicalize_fail(target: String) {
pub fn canonicalize_fail(target: String) -> ! {
eprintln!("mkwin: failed to canonicalze '{target}'--does the file exist?");
exit(2);
}

View file

@ -4,6 +4,7 @@ pub const HELP: [&str;2] = ["-h", "--help"];
pub const EMPTY: [&str;2] = ["-e", "--empty"];
pub const ENV_SHARE: [&str;2] = ["-E", "--env-share"];
pub const FIND_BIN: &str = "--find";
pub const OR: &str = "--or";
pub const PATH_CONVERT: &str = "--pc";
pub const QUIET: [&str;2] = ["-q", "--quiet"];

View file

@ -66,29 +66,30 @@ pub fn main() {
// get target executable
let target: String;
if let Ok(Some(arg)) = args.subcommand() {
if let Some(root) = find_bin { // handle find binary flag
target = format!("target=`find {root} -name '{arg}'`\n\"$target\"");
if let Some(root) = &find_bin { // handle find binary flag
target = format!("`find {root} -name '{arg}'`");
} else { // handle normal path
let path = Path::new(&arg);
if let Ok(path) = path.canonicalize() {
let path: String = path.to_string_lossy().into();
target = format!("'{path}'");
} else {
error::canonicalize_fail(arg);
return;
}
}
} else {
error::missing_target();
return;
} else { error::canonicalize_fail(arg); }
}
} else { error::missing_target(); }
let exec =
if let Ok(alt) = args.value_from_str::<&str, String>(flag::OR) {
format!("target={target}\nif [ ! -x \"$target\" ]; then\n\ttarget='{alt}'\nfi\n\n\"$target\"")
} else if find_bin.is_some() {
format!("\"{target}\"")
} else { target };
// construct output
println!("#!/usr/bin/bash\n# generated with: mkwin{arg_string}\n");
if env_share { println!("env-share 2> /dev/null\n"); }
print!("{target}");
print!("{exec}");
// handle forwarded arguments
if !forwarded.is_empty() {

View file

@ -1,18 +1,11 @@
#!/usr/bin/bash
# generated with: mkwin /mnt/c/Program Files/PowerShell/7/pwsh.exe -E --or /mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe
env-share 2> /dev/null
# try to use system-wide version first.
PWSH='/mnt/c/Program Files/PowerShell/7/pwsh.exe'
if [ ! -x "$PWSH" ]; then
unset PWSH
target='/mnt/c/Program Files/PowerShell/7/pwsh.exe'
if [ ! -x "$target" ]; then
target='/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe'
fi
# fall back to System32
if [ -z ${PWSH+x} ]; then
PWSH='/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe'
fi
# run target
"$PWSH" $@
"$target" $@