# plik receptury: func_tweak_path

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Dodanie katalogu na początku lub końcu ciągu $PATH, jeśli katalog ten
# nie został wcześniej dodany. Dowiązania symboliczne nie są brane pod uwagę.
# Funkcja zwraca wartość 1 lub ustawia nową wartość $PATH
# Przykład wywołania: add_to_path (przed|za) <katalog>
function add_to_path {
    local location=$1
    local directory=$2

    # Sprawdzenie,czy zostały podane parametry funkcji
    if [ -z "$location" -o  -z "$directory" ]; then
        echo "$0:$FUNCNAME: brak definicji położenia lub katalogu do dodania" >&2
        echo "np. add_to_path przed /bin" >&2
        return 1
    fi

    # Sprawdzenie, czy katalog nie został opisany za pomocą ścieżki względnej
    if [ $(echo $directory | grep '^/') ]; then
        : echo "$0:$FUNCNAME: '$directory' jest ścieżką bezwględną" >&2
    else
        echo "$0:$FUNCNAME: nie można dodać ścieżki względnej '$directory' do zmiennej \$PATH" >&2
        return 1
    fi

    # Sprawdzenie, czy dodawany katalog istnieje
    if [ -d "$directory" ]; then
        : echo "$0:$FUNCNAME: katalog istnieje" >&2
    else
        echo "$0:$FUNCNAME: '$directory' nie istnieje -- praca przerwana" >&2
        return 1
    fi

    # Sprawdzenie, czy katalog nie został wcześniej uwzględniony w ciągu $PATH
    if [ $(contains "$PATH" "$directory") ]; then
        echo "$0:$FUNCNAME: '$directory' występuje w zmiennej \$PATH--praca przerwana" >&2
    else
        : echo "$0:$FUNCNAME: dodanie katalogu do zmiennej \$PATH" >&2
    fi

    # Ustalenie, co należy zrobić
    case $location in
        przed* ) PATH="$directory:$PATH" ;;
        za*    ) PATH="$PATH:$directory" ;;
        *      ) PATH="$PATH:$directory" ;;
    esac

    # Oczysczenie wartości nowej ścieżki i przypisanie do zmiennej $PATH
    PATH=$(clean_path $PATH)

} # koniec funkcji add_to_path


#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Usunięcie katalogu ze zmiennej $PATH (jeśli został zdefiniowany).
# Wynik:  Ustawienie nowej wartości $PATH
# Przykład wywołania:  rm_from_path <katalog>
function rm_from_path {
    local directory=$1

    # Usunięcie wysztkich wystąpień katalogu $directory z ciągu $PATH
    PATH=${PATH//$directory/}

    # Oczyszczenie wartości nowej ścieżki i przypisanie do zmiennej $PATH
    PATH=$(clean_path $PATH)

} # koniec funkcji rm_from_path


#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Usunięcie początkowych, końcowych i powielonych znaków ':', 
# usunięcie zduplikowanych wpisów
# Wynik:  wyświetlenie oczyszczonej wartości $PATH
# Przykład wywołania:  cleaned_path=$(clean_path $PATH)
function clean_path {
    local path=$1
    local newpath
    local directory

    # Sprawdzenie,czy zostały podane parametry funkcji
    [ -z "$path" ] && return 1

    # Usunięcie zduplikowanych katalogów, jeśli występują
    for directory in ${path//:/ }; do
        contains "$newpath" "$directory" && newpath="${newpath}:${directory}"
    done

    # Usunięcie początkowego znaku ':'
    # Usunięcie końcowego znaku ':'
    # Usunięcie zduplikowanych separatorów ':'
    newpath=$(echo $newpath | sed 's/^:*//; s/:*$//; s/::/:/g')

    # Zwrócenie nowej wartości $PATH
    echo $newpath

} # koniec funkcji clean_path


#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Sprawdzenie, czy zmienna $PATH zawiera nazwę podanego katalogu
# Funkcja zwraca wartość 1, jeśli katalog występuje; 0 w przeciwnym przypadku
# Przykład wywołania:  contains $PATH $dir
function contains {
    local pattern=":$1:"
    local target=$2

    # W porównaniu jest uwzględniana wielkość liter, chyba że została 
    # włączona opcja nocasematch
    case $pattern in
        *:$target:* ) return 1;;
        *           ) return 0;;
    esac
} # koniec funkcji contains
