help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Show who is requiring


From: Sebastien Vauban
Subject: Re: Show who is requiring
Date: Fri, 07 Dec 2012 22:57:02 +0100
User-agent: Gnus/5.130006 (Ma Gnus v0.6) Emacs/24.3.50 (windows-nt)

Hello Stefan and all,

"Sebastien Vauban" wrote:
> Stefan Monnier wrote:
>>>>> I tried using (current-buffer) to get the name of the "source" package
>>>>> (i.e., the one which makes the `require' request), but that's wrong. Any
>>>>> idea how to get the name of the "caller" package?
>>>>
>>>> IIUC you want load-file-name.
>>>
>>> How does this report the names of files that require another package?
>>
>> IIUC he has put an advice on `require', so in this advice, `load-file-name'
>> should contain the name of the code that's calling the `require'.
>
> From your description, that's exactly what I'm after. I'll test and report.

For some unknown reason (I mean: to me), `load-file-name' is sometimes nil,
like if the requires came out of nowhere:

--8<---------------cut here---------------start------------->8---
Loading Minimal Emacs...
.emacs-minimal -> help-fns... Done [3 times]
Loading Minimal Emacs... Done
org -> calendar...
  calendar -> cal-menu...
    cal-menu -> calendar... Done
  calendar -> cal-menu... Done
org -> calendar... Done
org -> find-func... Done
org -> format-spec... Done
org -> ob-emacs-lisp...
  ob-emacs-lisp -> ob...
    ob -> ob-eval... Done
    ob -> org-macs... Done
    ob -> org-compat...
      org-compat -> org-macs... Done
    ob -> org-compat... Done
  ob-emacs-lisp -> ob... Done
org -> ob-emacs-lisp... Done
org -> org-compat... Done
org -> outline... Done
org -> noutline... Done
org -> time-date... Done
org -> easymenu... Done
org -> overlay... Done
org -> org-macs... Done
org -> org-entities...
  org-entities -> org-macs... Done
org -> org-entities... Done
org -> org-faces...
  org-faces -> org-macs... Done
  org-faces -> org-compat... Done
org -> org-faces... Done
org -> org-list...
  org-list -> org-macs... Done
  org-list -> org-compat... Done
org -> org-list... Done
org -> org-pcomplete...
  org-pcomplete -> org-macs... Done
  org-pcomplete -> org-compat... Done
  org-pcomplete -> pcomplete...
    pcomplete -> comint...
      comint -> ring... Done
      comint -> ansi-color... Done
      comint -> regexp-opt... Done
    pcomplete -> comint... Done
  org-pcomplete -> pcomplete... Done
org -> org-pcomplete... Done
org -> org-src...
  org-src -> org-macs... Done
  org-src -> org-compat... Done
  org-src -> ob-keys...
    ob-keys -> ob... Done
  org-src -> ob-keys... Done
  org-src -> ob-comint...
    ob-comint -> ob... Done
    ob-comint -> org-compat... Done
    ob-comint -> comint... Done
  org-src -> ob-comint... Done
org -> org-src... Done
org -> org-footnote...
  org-footnote -> org-macs... Done
  org-footnote -> org-compat... Done
org -> org-footnote... Done
org -> ob... Done
org -> ob-table...
  ob-table -> ob... Done
org -> ob-table... Done
org -> ob-lob...
  ob-lob -> ob... Done
  ob-lob -> ob-table... Done
org -> ob-lob... Done
org -> ob-ref...
  ob-ref -> ob... Done
org -> ob-ref... Done
org -> ob-tangle...
  ob-tangle -> ob... Done
  ob-tangle -> org-src... Done
org -> ob-tangle... Done
org -> ob-comint... Done
org -> ob-keys... Done
org -> font-lock... Done
org -> help-fns... Done [2 times]
org -> bytecomp...
  bytecomp -> backquote... Done
  bytecomp -> macroexp... Done
  bytecomp -> cconv... Done
org -> bytecomp... Done
org -> warnings... Done
byte-opt -> bytecomp... Done
byte-opt -> macroexp... Done
org -> help-fns... Done [3 times]
nil? -> org-bbdb...
  org-bbdb -> org... Done
nil? -> org-bbdb... Done
nil? -> org-bibtex...
  org-bibtex -> org... Done
  org-bibtex -> bibtex...
    bibtex -> button... Done
  org-bibtex -> bibtex... Done
  org-bibtex -> org-compat... Done
nil? -> org-bibtex... Done
nil? -> org-docview...
  org-docview -> org... Done
nil? -> org-docview... Done
nil? -> org-gnus...
  org-gnus -> org... Done
  org-gnus -> gnus-util...
    gnus-util -> time-date... Done
  org-gnus -> gnus-util... Done
nil? -> org-gnus... Done
nil? -> org-info...
  org-info -> org... Done
nil? -> org-info... Done
nil? -> org-jsinfo...
  org-jsinfo -> org-exp...
    org-exp -> org... Done
    org-exp -> org-macs... Done
    org-exp -> org-agenda...
      org-agenda -> org... Done
      org-agenda -> org-macs... Done
    org-exp -> org-agenda... Done
    org-exp -> org-exp-blocks...
      org-exp-blocks -> find-func... Done
      org-exp-blocks -> org-compat... Done
    org-exp -> org-exp-blocks... Done
    org-exp -> ob-exp...
      ob-exp -> ob... Done
      ob-exp -> org-exp-blocks... Done
    org-exp -> ob-exp... Done
    org-exp -> org-src... Done
  org-jsinfo -> org-exp... Done
  org-jsinfo -> org-html...
    org-html -> org-exp... Done
    org-html -> format-spec... Done
  org-jsinfo -> org-html... Done
nil? -> org-jsinfo... Done
nil? -> org-irc...
  org-irc -> org... Done
nil? -> org-irc... Done
nil? -> org-mew...
  org-mew -> org... Done
nil? -> org-mew... Done
nil? -> org-mhe...
  org-mhe -> org... Done
nil? -> org-mhe... Done
nil? -> org-rmail...
  org-rmail -> org... Done
nil? -> org-rmail... Done
nil? -> org-vm...
  org-vm -> org... Done
nil? -> org-vm... Done
nil? -> org-w3m...
  org-w3m -> org... Done
nil? -> org-w3m... Done
nil? -> org-wl...
  org-wl -> org... Done
nil? -> org-wl... Done
OVERVIEW
Loading vc-svn...done
nil? -> vc-svn... Done
--8<---------------cut here---------------end--------------->8---

The above trace is obtained with the following minimal Emacs file:

--8<---------------cut here---------------start------------->8---
(message "Loading Minimal Emacs...")

(defadvice require (around require-around)
  "Leave a trace of packages being loaded."
  (let* ((feature (ad-get-arg 0))
         (require-depth (or (and (boundp 'require-depth) require-depth)
                            0))
         (prefix (concat (make-string (* 2 require-depth) ? ) "")))
    (cond ((featurep feature)
           (message "%s%s -> %s... Done" ;; already loaded
                    prefix
                    (if load-file-name
                        (file-name-base load-file-name)
                      "nil?")
                    feature)
           (setq ad-return-value feature))
          (t
           (let ((lvn/time-start))
             (message "%s%s -> %s..."
                      prefix
                      (if load-file-name
                          (file-name-base load-file-name)
                        "nil?")
                      feature)
             (setq lvn/time-start (float-time))
             (let ((require-depth (1+ require-depth)))
               ad-do-it)
             (message "%s%s -> %s... Done"
                      prefix
                      (if load-file-name
                          (file-name-base load-file-name)
                        "nil?")
                      feature))))))

(ad-activate 'require)

(message "Loading Minimal Emacs... Done")
--8<---------------cut here---------------end--------------->8---

launched with the command `emacs -q -l .emacs-minimal.el'.

In the above session, I just opened a random `.org' file...

Any idea on (how to get) who is requiring packages such as:

- org-bbdb,
- org-bibtex,
- org-docview,
- org-gnus,
- org-info,
- org-jsinfo,
- org-irc,
- org-mew,
- org-mhe,
- org-rmail,
- org-vm,
- org-w3m,
- org-wl, and
- vc-svn?

Writing it down, I just realize that all the `org-*' packages here are the
ones in `org-modules'. In fact, that's `org.el' who's requiring them:

--8<---------------cut here---------------start------------->8---
(defun org-load-modules-maybe (&optional force)
  "Load all extensions listed in `org-modules'."
  (when (or force (not org-modules-loaded))
    (mapc (lambda (ext)
            (condition-case nil (require ext)
              (error (message "Problems while trying to load feature `%s'" 
ext))))
          org-modules)
    (setq org-modules-loaded t)))
--8<---------------cut here---------------end--------------->8---

Why isn't `load-file-name' set to `org.el' in this case, then?

No idea, neither, for `vc-svn'... Who required it? Who's hidden under the
alias nil, here?

Best regards,
  Seb

-- 
Sebastien Vauban


reply via email to

[Prev in Thread] Current Thread [Next in Thread]