Skip to content

Cannot find Homebrew-installed wakatime-cli on Apple Silicon Macs #86

@skkzsh

Description

@skkzsh

Problem

The README says brew install wakatime-cli, but wakatime-mode cannot find the binary on Apple Silicon Macs.

Cause

$ where wakatime-cli
/opt/homebrew/bin/wakatime-cli

Homebrew's prefix on Apple Silicon is /opt/homebrew, but wakatime-find-binary only checks /usr/local/bin, ~/.wakatime/, etc.
The executable-find fallback at the end looks for "wakatime", not "wakatime-cli", so it never matches.

(defun wakatime-find-binary (program)
"Find the full path to an executable program."
(cond
((file-exists-p (format "/usr/local/bin/%s" program))
(format "/usr/local/bin/%s" program))
((file-exists-p (format "/usr/bin/%s" program))
(format "/usr/bin/%s" program))
((file-exists-p (format "/bin/%s" program))
(format "/bin/%s" program))
((file-exists-p (format "/usr/local/sbin/%s" program))
(format "/usr/local/sbin/%s" program))
((file-exists-p (format "/usr/sbin/%s" program))
(format "/usr/sbin/%s" program))
((file-exists-p (format "/sbin/%s" program))
(format "/sbin/%s" program))
;; For linux users
((file-exists-p "~/.wakatime/wakatime-cli")
"~/.wakatime/wakatime-cli")
;; For windows 10+ fix to get wakatime-cli.exe
((file-exists-p (concat
(string-replace "\\" "/" (concat
(substitute-env-vars "$HOMEDRIVE")
(substitute-env-vars "$HOMEPATH")))
(format "/.wakatime/%s" program)))
(concat (string-replace "\\" "/" (concat
(substitute-env-vars "$HOMEDRIVE")
(substitute-env-vars "$HOMEPATH")))
(format "/.wakatime/%s" program)))
;; For windows 10+ fix to get wakatime-cli-amd64.exe
((file-exists-p (concat
(string-replace "\\" "/" (concat
(substitute-env-vars "$HOMEDRIVE")
(substitute-env-vars "$HOMEPATH")))
"/.wakatime/wakatime-cli-windows-amd64.exe"))
(concat (string-replace "\\" "/" (concat
(substitute-env-vars "$HOMEDRIVE")
(substitute-env-vars "$HOMEPATH")))
"/.wakatime/wakatime-cli-windows-amd64.exe"))
((not (s-blank (executable-find "wakatime")))
(executable-find "wakatime"))
(t program)))

Suggested fix

Make executable-find the primary method, while keeping /opt/homebrew/bin and /usr/local/bin as hardcoded fallbacks for GUI Emacs environments where $PATH may be incomplete.
This also covers #72, which similarly proposed switching to executable-find:

(defun wakatime-find-binary (program)
  (cond
    ((executable-find program))
    ((file-exists-p (format "/opt/homebrew/bin/%s" program))
      (format "/opt/homebrew/bin/%s" program))
    ((file-exists-p (format "/usr/local/bin/%s" program))
      (format "/usr/local/bin/%s" program))
    ((file-exists-p "~/.wakatime/wakatime-cli")
      "~/.wakatime/wakatime-cli")
    ;; ... Windows paths
    (t program)))

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions