Subject: 29.0.60; find-function-search-for-symbol truncates library path
From: Troy Brown <[email-masked]>
To: [email-masked]
Date: Sun, 18 Jun 2023 00:45:12 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

When user-emacs-directory contains "emacs.el" in it's path (e.g.,
"~/.emacs.elpa"), which is much easier these days with the availability
of --init-directory, the find-function-search-for-symbol truncates the
library path after "emacs".

I was experimenting with a different user directory (i.e.,
"--init-directory=~/.emacs.elpa") and was surprised to find out that the
Help system was breaking when using this path.  When looking up a symbol
in the Help system (e.g., "C-h f company-mode RET") and then attempting
to visit the source file from the help window (i.e., help-view-source),
if the symbol belongs to an installed package (where the source is
under the "elpa" directory beneath user-emacs-directory), it will
generate the following error message:

  Can't find library: /home/troy/.emacs

Toggling "debug-on-error" and repeating the above, I can generate a
backtrace for this as follows:

Debugger entered--Lisp error: (file-error "Can't find library"
"/home/troy/.emacs")
  find-library-name("/home/troy/.emacs")
  #<subr find-function-search-for-symbol>(company-mode nil
"/home/troy/.emacs.elpa/elpa/company-20230416.2034/company.el")
  ad-Advice-find-function-search-for-symbol(#<subr
find-function-search-for-symbol> company-mode nil
"/home/troy/.emacs.elpa/elpa/company-20230416.2034/company.el")
  apply(ad-Advice-find-function-search-for-symbol #<subr
find-function-search-for-symbol> (company-mode nil
"/home/troy/.emacs.elpa/elpa/company-20230416.2034/company.el"))
  find-function-search-for-symbol(company-mode nil
"/home/troy/.emacs.elpa/elpa/company-20230416.2034/company.el")
  help-function-def--button-function(company-mode
"/home/troy/.emacs.elpa/elpa/company-20230416.2034/company.el" nil)
  help-view-source()
  funcall-interactively(help-view-source)
  call-interactively(help-view-source nil nil)
  command-execute(help-view-source)

I believe the following snippet of code in
find-function-search-for-symbol is to blame for this:

    (when (string-match "\\.emacs\\(.el\\)" library)
      (setq library (substring library 0 (match-beginning 1))))

The regex likely should be improved to only match .emacs or .emacs.el at
the end of the path, not in the middle of it.