aboutsummaryrefslogtreecommitdiffstats
path: root/utils/guard_path.sh
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2024-11-16 11:09:40 +0800
committerGitHub <noreply@github.com>2024-11-16 11:09:40 +0800
commit86aa9106090a0219bac30bc12f5a5bd91949afd9 (patch)
tree69aef8c03242c67480c4edfe42a2cbf4c785b466 /utils/guard_path.sh
parent6d30c22b82a5ac1a5775d8137c3b08a581770273 (diff)
downloadllm-functions-docker-86aa9106090a0219bac30bc12f5a5bd91949afd9.tar.gz
refactor: improve bash code (#125)
* refactor: extract guard_path to utils/guard_path.sh * add utils/guard_operation.sh
Diffstat (limited to 'utils/guard_path.sh')
-rwxr-xr-xutils/guard_path.sh60
1 files changed, 60 insertions, 0 deletions
diff --git a/utils/guard_path.sh b/utils/guard_path.sh
new file mode 100755
index 0000000..6de9cd8
--- /dev/null
+++ b/utils/guard_path.sh
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+
+main() {
+ if [[ "$#" -ne 2 ]]; then
+ echo "Usage: guard_path.sh <path> <confirmation_prompt>" >&2
+ exit 1
+ fi
+ if [ -t 1 ]; then
+ path="$(_to_realpath "$1")"
+ confirmation_prompt="$2"
+ if [[ ! "$path" == "$(pwd)"* ]]; then
+ read -r -p "$confirmation_prompt [Y/n] " ans
+ if [[ "$ans" == "N" || "$ans" == "n" ]]; then
+ echo "error: aborted!" >&2
+ exit 1
+ fi
+ fi
+ fi
+}
+
+_to_realpath() {
+ path="$1"
+ if [[ $OS == "Windows_NT" ]]; then
+ path="$(cygpath -u "$path")"
+ fi
+ awk -v path="$path" -v pwd="$PWD" '
+BEGIN {
+ if (path !~ /^\//) {
+ path = pwd "/" path
+ }
+ if (path ~ /\/\.{1,2}?$/) {
+ isDir = 1
+ }
+ split(path, parts, "/")
+ newPartsLength = 0
+ for (i = 1; i <= length(parts); i++) {
+ part = parts[i]
+ if (part == "..") {
+ if (newPartsLength > 0) {
+ delete newParts[newPartsLength--]
+ }
+ } else if (part != "." && part != "") {
+ newParts[++newPartsLength] = part
+ }
+ }
+ if (isDir == 1 || newPartsLength == 0) {
+ newParts[++newPartsLength] = ""
+ }
+ printf "/"
+ for (i = 1; i <= newPartsLength; i++) {
+ newPart = newParts[i]
+ printf newPart
+ if (i < newPartsLength) {
+ printf "/"
+ }
+ }
+}'
+}
+
+main "$@"