aboutsummaryrefslogtreecommitdiffstats
path: root/utils/guard_path.sh
blob: 6de9cd8b741bbe6be9bda49b4d06d015dba3d99b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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 "$@"