X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/xdg-ninja.git/blobdiff_plain/7838b796e595c02bb80b86ad1e35bfc5bca472d4..892694ec0e4568b7d209f9d13535059d5241031c:/xdg-ninja.sh diff --git a/xdg-ninja.sh b/xdg-ninja.sh index f8e12b5..fc1f115 100755 --- a/xdg-ninja.sh +++ b/xdg-ninja.sh @@ -63,11 +63,14 @@ help() { ${FX_ITALIC}--skip-ok${FX_RESET} ${FX_BOLD}Don't display anything for files that do not exist (default)${FX_RESET} + ${FX_ITALIC}--skip-unsupported${FX_RESET} ${FX_BOLD}Don't display anything for files that do not have fixes available${FX_RESET} + """ printf "%b" "$HELPSTRING" } SKIP_OK=true +SKIP_UNSUPPORTED=false for i in "$@"; do if [ "$i" = "--help" ] || [ "$i" = "-h" ]; then help @@ -76,6 +79,8 @@ for i in "$@"; do SKIP_OK=true elif [ "$i" = "--no-skip-ok" ]; then SKIP_OK=false + elif [ "$i" = "--skip-unsupported" ]; then + SKIP_UNSUPPORTED=true elif [ "$i" = "-v" ]; then SKIP_OK=false fi @@ -118,14 +123,32 @@ apply_shell_expansion() { eval "$command" } -# Returns 0 if the path doesn't lead anywhere -# Returns 1 if the path leads to something -check_if_file_exists() { - FILE_PATH=$(apply_shell_expansion "$1") - if [ -e "$FILE_PATH" ]; then +# Function to check if a string contains shell pattern matching +has_pattern() { + case $1 in + *\** | *\?* | *\[*\]*) + return 0 + ;; + *) return 1 + ;; + esac +} + +# Returns the actual name of the given file that is on the user's disk +# This command applies shell pattern matching and return the actual filename +retrieve_existing_filename() { + FILE_PATH=$(apply_shell_expansion "$1") + + # return filename if found, nothing else + if has_pattern "$FILE_PATH"; then + dir="$(dirname "$FILE_PATH")" + part="$(basename "$FILE_PATH")" + find "$dir" -maxdepth 1 -name "$part" -print -quit 2>/dev/null else - return 0 + if [ -e "$FILE_PATH" ]; then + printf "%s" "$FILE_PATH" + fi fi } @@ -136,6 +159,9 @@ decode_string() { /' # Replace \n with literal newline and \" with ", normalize number of trailing newlines to 2 } +# Counter to keep track of how many files can be moved +FIXABLE=0 + # Function to handle the formatting of output log() { MODE="$1" @@ -147,10 +173,12 @@ log() { ERR) printf '[%b%s%b]: %b%s%b\n' "${FX_BOLD}${FG_RED}" "$NAME" "${FX_RESET}" "${FX_BOLD}${FX_ITALIC}" "$FILENAME" "${FX_RESET}" + FIXABLE=$((FIXABLE+1)) ;; WARN) - printf '[%b%s%b]: %b%s%b\n' "${FX_BOLD}${FG_YELLOW}" "$NAME" "${FX_RESET}" "${FX_BOLD}${FX_ITALIC}" "$FILENAME" "${FX_RESET}" + [ "$SKIP_UNSUPPORTED" = false ] && + printf '[%b%s%b]: %b%s%b\n' "${FX_BOLD}${FG_YELLOW}" "$NAME" "${FX_RESET}" "${FX_BOLD}${FX_ITALIC}" "$FILENAME" "${FX_RESET}" ;; INFO) @@ -176,28 +204,24 @@ check_file() { MOVABLE="$3" HELP="$4" - check_if_file_exists "$FILENAME" - - case $? in + file=$(retrieve_existing_filename "$FILENAME") - 0) - log SUCS "$NAME" "$FILENAME" "$HELP" - ;; - - 1) + if [ "$file" ]; then if [ "$MOVABLE" = true ]; then - log ERR "$NAME" "$FILENAME" "$HELP" + log ERR "$NAME" "$file" "$HELP" else - log WARN "$NAME" "$FILENAME" "$HELP" + log WARN "$NAME" "$file" "$HELP" fi if [ "$HELP" ]; then - log HELP "$NAME" "$FILENAME" "$HELP" + if [ "$MOVABLE" = true ] || [ "$SKIP_UNSUPPORTED" = false ]; then + log HELP "$NAME" "$file" "$HELP" + fi else - log HELP "$NAME" "$FILENAME" "_No help available._" + log HELP "$NAME" "$file" "_No help available._" fi - ;; - - esac + else + log SUCS "$NAME" "$file" "$HELP" + fi } # Reads files from programs/, calls check_file on each file specified for each program @@ -206,7 +230,7 @@ do_check_programs() { " read -r name; read -r filename; read -r movable; read -r help; do check_file "$name" "$filename" "$movable" "$help" done <