Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xdg-ninja: add shell pattern matching capability #271

Merged
merged 2 commits into from
Sep 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
runtimeDependencies = with pkgs; [
glow
jq
findutils
];
overlays = [
(self: super: {
Expand Down
54 changes: 33 additions & 21 deletions xdg-ninja.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand Down