From f3439523e8a174dc081ae28186bfa9c91edbbb20 Mon Sep 17 00:00:00 2001 From: Chet Luther Date: Wed, 5 Feb 2025 21:58:42 +0000 Subject: [PATCH] fix: follow symlinks when grepping for desktop entries When running browsers installed via the Nix home-manager, the browser .desktop files will be found within `~/.nix-profile/share/applications/` and `~/.nix-profile/share` will be in `$XDG_DATA_DIRS`. The `~/.nix-profile/share` directory is a symlink, and `grep -r` will follow that successfully, but then the `applications/firefox.desktop` within will also be a symlink. A `grep -r` won't follow that, so we have to use `grep -R` to follow all symlinks to actually find the desktop entries. For example, without this fix, I see the following when running `linkquisition https://google.com`. failed to call grep for determining a .desktop entry for firefox -P Personal --class=firefox-personal %U: exit status 1 failed to call grep for determining a .desktop entry for google-chrome-stable --user-data-dir="/home/cluther/.config/google-chrome-personal" %U: exit status 1 With this change, linkquisition is able to auto-detect all of the browser entries I have, and launch into them without error. --- freedesktop/browser_service.go | 2 +- freedesktop/xdg_service.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freedesktop/browser_service.go b/freedesktop/browser_service.go index c408f44..38c9ced 100644 --- a/freedesktop/browser_service.go +++ b/freedesktop/browser_service.go @@ -30,7 +30,7 @@ func (b *BrowserService) GetAvailableBrowsers() ([]linkquisition.Browser, error) // grep all the .desktop files in the paths for the category "WebBrowser": grepArgs := []string{ - "-r", + "-R", "-l", "-E", "^Categories=.*WebBrowser", diff --git a/freedesktop/xdg_service.go b/freedesktop/xdg_service.go index 6579f76..7f2f264 100644 --- a/freedesktop/xdg_service.go +++ b/freedesktop/xdg_service.go @@ -39,7 +39,7 @@ func (x *XdgService) GetDesktopEntryPathForBinary(binary string) (string, error) // grep all the .desktop files in the paths for the binary basename and return the first match: pattern := fmt.Sprintf("^Exec=(%s|%s)", binary, filepath.Base(binary)) - grepArgs := []string{"-r", "-l", "-m", "1", "-E", pattern, "--include", "*.desktop"} + grepArgs := []string{"-R", "-l", "-m", "1", "-E", pattern, "--include", "*.desktop"} grepArgs = append(grepArgs, paths...) cmd := exec.Command("grep", grepArgs...)