]> glassweightruler.freedombox.rocks Git - xdg-ninja.git/commitdiff
Merge pull request #271 from fourchettes/shell-pattern-matching
authorb3nj5m1n <47924309+b3nj5m1n@users.noreply.github.com>
Thu, 28 Sep 2023 11:58:56 +0000 (13:58 +0200)
committerGitHub <noreply@github.com>
Thu, 28 Sep 2023 11:58:56 +0000 (13:58 +0200)
Alright, I think we're good to go!

README.md
flake.nix
xdg-ninja.sh

index 6c3bc5e4009e7d4c16b40ecfcf541a4836ebec5c..9af8c772bbc41e40a5b95afc89b7fd97b9fbef0e 100644 (file)
--- a/README.md
+++ b/README.md
@@ -36,6 +36,7 @@ To install xdg-ninja with [Homebrew](https://brew.sh), run `brew install xdg-nin
 
 - your favorite POSIX-compliant shell ([bash](https://repology.org/project/bash/packages), [zsh](https://repology.org/project/zsh/packages), [dash](https://repology.org/project/dash-shell/packages), ...)
 - [jq](https://repology.org/project/jq/packages) for parsing the json files
+- [find](https://repology.org/project/findutils/versions)
 
 ### Optional
 
index 8f3a5bfc2d03554273839c201236510173a28de8..5a1be2c21cce6fd7a1c971081d85a72352726eba 100644 (file)
--- a/flake.nix
+++ b/flake.nix
@@ -13,6 +13,7 @@
         runtimeDependencies = with pkgs; [
           glow
           jq
+          findutils
         ];
         overlays = [
           (self: super: {
index 8780de7a2e26f4880ac30e4d15749b7e3a2f4c43..84260f5498973d2a1b502f3147cb8c04eb396ef4 100755 (executable)
@@ -123,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
 }
 
@@ -186,30 +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
             if [ "$MOVABLE" = true ] || [ "$SKIP_UNSUPPORTED" = false ]; then
-                log HELP "$NAME" "$FILENAME" "$HELP"
+                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