diff --git a/rp b/rp index 5c34ecf..ce57675 100755 --- a/rp +++ b/rp @@ -123,7 +123,7 @@ fatal() { genkey() { usagestack+=("PRIVATE_KEYS_DIR") local skdir - skdir="${1/\//}"; shift || fatal "Required positional argument: PRIVATE_KEYS_DIR" + skdir="${1%/}"; shift || fatal "Required positional argument: PRIVATE_KEYS_DIR" while (( $# > 0 )); do local arg; arg="$1"; shift @@ -149,8 +149,8 @@ genkey() { pubkey() { usagestack+=("PRIVATE_KEYS_DIR" "PUBLIC_KEYS_DIR") local skdir pkdir - skdir="${1/\//}"; shift || fatal "Required positional argument: PRIVATE_KEYS_DIR" - pkdir="${1/\//}"; shift || fatal "Required positional argument: PUBLIC_KEYS_DIR" + skdir="${1%/}"; shift || fatal "Required positional argument: PRIVATE_KEYS_DIR" + pkdir="${1%/}"; shift || fatal "Required positional argument: PUBLIC_KEYS_DIR" while (( $# > 0 )); do local arg; arg="$1"; shift @@ -174,7 +174,7 @@ exchange() { usagestack+=("PRIVATE_KEYS_DIR" "[dev ]" "[listen :]" "[peer PUBLIC_KEYS_DIR [endpoint :] [persistent-keepalive ] [allowed-ips /[,/]...]]...") local skdir dev lport dev="${project_name}0" - skdir="${1/\//}"; shift || fatal "Required positional argument: PRIVATE_KEYS_DIR" + skdir="${1%/}"; shift || fatal "Required positional argument: PRIVATE_KEYS_DIR" while (( $# > 0 )); do local arg; arg="$1"; shift @@ -238,7 +238,7 @@ exchange() { shift; # Skip "peer" argument local peerdir ip port keepalive allowedips - peerdir="${1/\//}"; shift || fatal "Required peer argument: PUBLIC_KEYS_DIR" + peerdir="${1%/}"; shift || fatal "Required peer argument: PUBLIC_KEYS_DIR" while (( $# > 0 )); do local arg; arg="$1"; shift @@ -282,6 +282,29 @@ exchange() { done } +find_rosenpass_binary() { + local binary; binary="" + if [[ -n "${gitdir}" ]]; then + # If rp is run from the git repo, use the newest build artifact + binary=$( + find "${gitdir}/result/bin/${project_name}" \ + "${gitdir}"/target/{release,debug}/"${project_name}" \ + -printf "%T@ %p\n" 2>/dev/null \ + | sort -nr \ + | awk 'NR==1 { print($2) }' + ) + elif [[ -n "${nixdir}" ]]; then + # If rp is run from nix, use the nix-installed rosenpass version + binary="${nixdir}/bin/${project_name}" + fi + + if [[ -z "${binary}" ]]; then + binary="${project_name}" + fi + + echo "${binary}" +} + main() { formatting_init cleanup_init @@ -289,15 +312,11 @@ main() { frag_init project_name="rosenpass" - scriptdir="$(dirname "${script}")" verbose=0 - binary="$( - find "${scriptdir}"/target/{release,debug}/"${project_name}" -printf "%T@ %p\n" 2>/dev/null \ - | sort -nr \ - | awk -v fallback="${project_name}" ' - NR == 1 { print($2) } - END { if (NR == 0) print(fallback) }' - )" + scriptdir="$(dirname "${script}")" + gitdir="$(git -C "${scriptdir}" rev-parse --show-toplevel 2>/dev/null)" || true + nixdir="$(readlink -f result/bin/rp | grep -Pio '^/nix/store/[^/]+(?=/bin/[^/]+)')" || true + binary="$(find_rosenpass_binary)" # Parse command