all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#66782: 29.1; ERT tests reports test redefined depending on loading sequence
@ 2023-10-27 20:59 Xiyue Deng
  2023-10-28  6:32 ` Eli Zaretskii
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-10-27 20:59 UTC (permalink / raw)
  To: 66782


ERT may report error of `Test 'foo' redefined' when `foo' is not
actually reused but due to loading sequence of the test source files,
e.g. when some test A requires some other test B and A is loaded before
B.  A minimum test case with two ert test files:

,----
| $ cat ert-1-test.el 
| (require 'ert)
| 
| (ert-deftest first-test ()
|   (should (= (+ 1 2) 3)))
| 
| (provide 'ert-1-test)
`----

,----
| $ cat ert-2-test.el 
| (require 'ert)
| (require 'ert-1-test)
| 
| (ert-deftest second-test ()
|   (should (= (+ 2 3) 5)))
`----

If running ert by first loading ert-1-test and then ert-2-test then it
goes fine:

,----
| $ emacs -batch -Q -L . -l ert -l ert-1-test.el -l ert-2-test.el -f ert-run-tests-batch-and-exit
| Running 2 tests (2023-10-27 03:42:24-0700, selector ‘t’)
|    passed  1/2  first-test (0.000054 sec)
|    passed  2/2  second-test (0.000025 sec)
| 
| Ran 2 tests, 2 results as expected, 0 unexpected (2023-10-27 03:42:24-0700, 0.000204 sec)
`----

However, if the sequence is changed, ERT will report error:

,----
| $ emacs -batch -Q -L . -l ert -l ert-2-test.el -l ert-1-test.el -f ert-run-tests-batch-and-exit
| 
| Error: error ("Test ‘first-test’ redefined")
|   mapbacktrace(#f(compiled-function (evald func args flags) #<bytecode 0x1cdb26547dae8645>))
|   debug-early-backtrace()
|   debug-early(error (error "Test ‘first-test’ redefined"))
|   error("Test `%s' redefined" first-test)
|   ert-set-test(first-test #s(ert-test :name first-test :documentation nil :body (lambda nil (let* ((fn-10 #'=) (args-11 (condition-case err (let ((signal-hook-function #'ert--should-signal-hook)) (list (+ 1 2) 3)) (error (progn (setq fn-10 #'signal) (list (car err) (cdr err))))))) (let ((value-12 'ert-form-evaluation-aborted-13)) (let (form-description-14) (if (unwind-protect (setq value-12 (apply fn-10 args-11)) (setq form-description-14 (nconc (list '(should (= (+ 1 2) 3))) (list :form (cons fn-10 args-11)) (if (eql value-12 'ert-form-evaluation-aborted-13) nil (list :value value-12)) (if (eql value-12 'ert-form-evaluation-aborted-13) nil (let* ((-explainer- (and t (ert--get-explainer '=)))) (if -explainer- (list :explanation (apply -explainer- args-11)) nil))))) (ert--signal-should-execution form-description-14)) nil (ert-fail form-description-14))) value-12))) :most-recent-result nil :expected-result-type :passed :tags nil :file-name "/home/xiyueden/Projects/test/ert-test/ert-1-test.el"))
|   load-with-code-conversion("/home/xiyueden/Projects/test/ert-test/ert-1-test.el" "/home/xiyueden/Projects/test/ert-test/ert-1-test.el" nil t)
|   command-line-1(("-L" "." "-l" "ert" "-l" "ert-2-test.el" "-l" "ert-1-test.el" "-f" "ert-run-tests-batch-and-exit"))
|   command-line()
|   normal-top-level()
| Test ‘first-test’ redefined
`----

As you can see there's only one `first-test' defined.  The error message
is misleading.

A real world example of this can be found in lsp-mode, where
test/lsp-clangd-test.el[1] requires test/lsp-integration-test.el[2].
See also the discussion on an Debian bug[3].

This used to work fine but not after Emacs 29 started checking for used
test names.  A guess of the cause is that if the depending test is
loaded first, the dependent test will first get processed through
require and then processed again through `-l'.  Fixing this may require
a topological sorting of the libraries loaded through `-l' based on
their dependency graph.

However, I'd like to see whether upstream considers this type of usage
well-formed and should be supported.  If not, upstream should give a
warning on such usage, such as printing a warning when requiring other
modules that has `ert-deftest'.  Meanwhile, an improved error message
would also be great.

[1] https://github.com/emacs-lsp/lsp-mode/blob/master/test/lsp-clangd-test.el#L26
[2] https://github.com/emacs-lsp/lsp-mode/blob/master/test/lsp-integration-test.el#L674
[3] https://bugs.debian.org/1054494


In GNU Emacs 29.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.37,
 cairo version 1.16.0) of 2023-09-19, modified by Debian built on
 debian-hx90
System Description: Debian GNU/Linux 12 (bookworm)

Configured using:
 'configure --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/libexec
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --with-libsystemd --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/29.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/29.1/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils
 --with-native-compilation --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/libexec
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --with-libsystemd --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/29.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/29.1/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils
 --with-native-compilation --with-cairo --with-x=yes
 --with-x-toolkit=gtk3 --with-toolkit-scroll-bars 'CFLAGS=-g -O2
 -ffile-prefix-map=/build/emacs-bYKTEl/emacs-29.1+1=. -fstack-protector-strong
 -Wformat -Werror=format-security -Wall' 'CPPFLAGS=-Wdate-time
 -D_FORTIFY_SOURCE=2' LDFLAGS=-Wl,-z,relro'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES
NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3
THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER WEBP X11 XDBE XIM XINPUT2
XPM GTK3 ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: ELisp/d

Minor modes in effect:
  server-mode: t
  shell-dirtrack-mode: t
  windmove-mode: t
  subword-mode: t
  whitespace-mode: t
  yas-minor-mode: t
  icomplete-mode: t
  global-company-mode: t
  company-mode: t
  rcirc-track-minor-mode: t
  erc-list-mode: t
  erc-menu-mode: t
  erc-autojoin-mode: t
  erc-ring-mode: t
  erc-track-mode: t
  erc-match-mode: t
  erc-button-mode: t
  erc-fill-mode: t
  erc-stamp-mode: t
  erc-netsplit-mode: t
  erc-spelling-mode: t
  flyspell-mode: t
  erc-log-mode: t
  erc-irccontrols-mode: t
  erc-noncommands-mode: t
  erc-move-to-prompt-mode: t
  erc-readonly-mode: t
  erc-networks-mode: t
  override-global-mode: t
  global-display-line-numbers-mode: t
  display-line-numbers-mode: t
  global-auto-revert-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t

Load-path shadows:
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-site hides /usr/share/emacs/site-lisp/tex-site
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/auctex hides /usr/share/emacs/site-lisp/auctex
/home/xiyueden/.config/emacs/elpa/bar-cursor-20201204.2244/bar-cursor-pkg hides /usr/share/emacs/site-lisp/elpa/bar-cursor-2.0/bar-cursor-pkg
/home/xiyueden/.config/emacs/elpa/bar-cursor-20201204.2244/bar-cursor hides /usr/share/emacs/site-lisp/elpa/bar-cursor-2.0/bar-cursor
/home/xiyueden/.config/emacs/elpa/bar-cursor-20201204.2244/bar-cursor-autoloads hides /usr/share/emacs/site-lisp/elpa/bar-cursor-2.0/bar-cursor-autoloads
/home/xiyueden/.config/emacs/elpa/boxquote-2.3/boxquote hides /usr/share/emacs/site-lisp/elpa/boxquote-2.2/boxquote
/home/xiyueden/.config/emacs/elpa/boxquote-2.3/boxquote-autoloads hides /usr/share/emacs/site-lisp/elpa/boxquote-2.2/boxquote-autoloads
/home/xiyueden/.config/emacs/elpa/boxquote-2.3/boxquote-pkg hides /usr/share/emacs/site-lisp/elpa/boxquote-2.2/boxquote-pkg
/home/xiyueden/.config/emacs/elpa/buttercup-1.31/buttercup hides /usr/share/emacs/site-lisp/elpa/buttercup-1.26/buttercup
/home/xiyueden/.config/emacs/elpa/buttercup-1.31/buttercup-pkg hides /usr/share/emacs/site-lisp/elpa/buttercup-1.26/buttercup-pkg
/home/xiyueden/.config/emacs/elpa/buttercup-1.31/buttercup-compat hides /usr/share/emacs/site-lisp/elpa/buttercup-1.26/buttercup-compat
/home/xiyueden/.config/emacs/elpa/buttercup-1.31/buttercup-autoloads hides /usr/share/emacs/site-lisp/elpa/buttercup-1.26/buttercup-autoloads
/home/xiyueden/.config/emacs/elpa/cmake-mode-3.27.6/cmake-mode hides /usr/share/emacs/site-lisp/elpa/cmake-mode-3.25.1/cmake-mode
/home/xiyueden/.config/emacs/elpa/cmake-mode-3.27.6/cmake-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/cmake-mode-3.25.1/cmake-mode-autoloads
/home/xiyueden/.config/emacs/elpa/cmake-mode-3.27.6/cmake-mode-pkg hides /usr/share/emacs/site-lisp/elpa/cmake-mode-3.25.1/cmake-mode-pkg
/home/xiyueden/.config/emacs/elpa/diminish-0.46/diminish-pkg hides /usr/share/emacs/site-lisp/elpa/diminish-0.45/diminish-pkg
/home/xiyueden/.config/emacs/elpa/diminish-0.46/diminish hides /usr/share/emacs/site-lisp/elpa/diminish-0.45/diminish
/home/xiyueden/.config/emacs/elpa/diminish-0.46/diminish-autoloads hides /usr/share/emacs/site-lisp/elpa/diminish-0.45/diminish-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-autoloads hides /usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/debian-autoloads
/home/xiyueden/.config/emacs/elpa/folding-20230919.1053/folding hides /usr/share/emacs/site-lisp/elpa/folding-20220110.1718/folding
/home/xiyueden/.config/emacs/elpa/folding-20230919.1053/folding-autoloads hides /usr/share/emacs/site-lisp/elpa/folding-20220110.1718/folding-autoloads
/home/xiyueden/.config/emacs/elpa/folding-20230919.1053/folding-pkg hides /usr/share/emacs/site-lisp/elpa/folding-20220110.1718/folding-pkg
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/git-modes hides /usr/share/emacs/site-lisp/elpa/git-modes-1.4.0/git-modes
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/git-modes-pkg hides /usr/share/emacs/site-lisp/elpa/git-modes-1.4.0/git-modes-pkg
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/git-modes-autoloads hides /usr/share/emacs/site-lisp/elpa/git-modes-1.4.0/git-modes-autoloads
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/gitattributes-mode hides /usr/share/emacs/site-lisp/elpa/gitattributes-mode-1.4.0/gitattributes-mode
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/gitconfig-mode hides /usr/share/emacs/site-lisp/elpa/gitconfig-mode-1.4.0/gitconfig-mode
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/gitignore-mode hides /usr/share/emacs/site-lisp/elpa/gitignore-mode-1.4.0/gitignore-mode
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot-context hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot-context
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot-gui hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot-gui
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot-autoloads hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-autoloads hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/debian-autoloads
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot-pkg hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot-pkg
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm hides /usr/share/emacs/site-lisp/elpa/helm-core-3.8.4/helm
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-core-pkg hides /usr/share/emacs/site-lisp/elpa/helm-core-3.8.4/helm-core-pkg
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-multi-match hides /usr/share/emacs/site-lisp/elpa/helm-core-3.8.4/helm-multi-match
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-lib hides /usr/share/emacs/site-lisp/elpa/helm-core-3.8.4/helm-lib
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-source hides /usr/share/emacs/site-lisp/elpa/helm-core-3.8.4/helm-source
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-core-autoloads hides /usr/share/emacs/site-lisp/elpa/helm-core-3.8.4/helm-core-autoloads
/home/xiyueden/.config/emacs/elpa/htmlize-1.57/htmlize hides /usr/share/emacs/site-lisp/elpa/htmlize-1.56/htmlize
/home/xiyueden/.config/emacs/elpa/htmlize-1.57/htmlize-autoloads hides /usr/share/emacs/site-lisp/elpa/htmlize-1.56/htmlize-autoloads
/home/xiyueden/.config/emacs/elpa/htmlize-1.57/htmlize-pkg hides /usr/share/emacs/site-lisp/elpa/htmlize-1.56/htmlize-pkg
/home/xiyueden/.config/emacs/elpa/initsplit-20160919.1818/initsplit hides /usr/share/emacs/site-lisp/elpa/initsplit-1.8/initsplit
/home/xiyueden/.config/emacs/elpa/initsplit-20160919.1818/initsplit-autoloads hides /usr/share/emacs/site-lisp/elpa/initsplit-1.8/initsplit-autoloads
/home/xiyueden/.config/emacs/elpa/initsplit-20160919.1818/initsplit-pkg hides /usr/share/emacs/site-lisp/elpa/initsplit-1.8/initsplit-pkg
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-imenu-extras hides /usr/share/emacs/site-lisp/elpa/js2-mode-20201220/js2-imenu-extras
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-old-indent hides /usr/share/emacs/site-lisp/elpa/js2-mode-20201220/js2-old-indent
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-mode hides /usr/share/emacs/site-lisp/elpa/js2-mode-20201220/js2-mode
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-mode-pkg hides /usr/share/emacs/site-lisp/elpa/js2-mode-20201220/js2-mode-pkg
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/js2-mode-20201220/js2-mode-autoloads
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-section hides /usr/share/emacs/site-lisp/elpa/magit-section-3.3.0/magit-section
/home/xiyueden/.config/emacs/elpa/markdown-mode-2.6/markdown-mode hides /usr/share/emacs/site-lisp/elpa/markdown-mode-2.5/markdown-mode
/home/xiyueden/.config/emacs/elpa/markdown-mode-2.6/markdown-mode-pkg hides /usr/share/emacs/site-lisp/elpa/markdown-mode-2.5/markdown-mode-pkg
/home/xiyueden/.config/emacs/elpa/markdown-mode-2.6/markdown-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/markdown-mode-2.5/markdown-mode-autoloads
/home/xiyueden/.config/emacs/elpa/meson-mode-0.3/meson-mode hides /usr/share/emacs/site-lisp/elpa/meson-mode-0.2/meson-mode
/home/xiyueden/.config/emacs/elpa/meson-mode-0.3/utils hides /usr/share/emacs/site-lisp/elpa/meson-mode-0.2/utils
/home/xiyueden/.config/emacs/elpa/meson-mode-0.3/meson-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/meson-mode-0.2/meson-mode-autoloads
/home/xiyueden/.config/emacs/elpa/meson-mode-0.3/meson-mode-pkg hides /usr/share/emacs/site-lisp/elpa/meson-mode-0.2/meson-mode-pkg
/home/xiyueden/.config/emacs/elpa/popup-0.5.9/popup hides /usr/share/emacs/site-lisp/elpa/popup-0.5.8/popup
/home/xiyueden/.config/emacs/elpa/popup-0.5.9/popup-pkg hides /usr/share/emacs/site-lisp/elpa/popup-0.5.8/popup-pkg
/home/xiyueden/.config/emacs/elpa/popup-0.5.9/popup-autoloads hides /usr/share/emacs/site-lisp/elpa/popup-0.5.8/popup-autoloads
/home/xiyueden/.config/emacs/elpa/rust-mode-1.0.5/rust-mode hides /usr/share/emacs/site-lisp/elpa/rust-mode-0.4.0/rust-mode
/home/xiyueden/.config/emacs/elpa/rust-mode-1.0.5/rust-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/rust-mode-0.4.0/rust-mode-autoloads
/home/xiyueden/.config/emacs/elpa/rust-mode-1.0.5/rust-mode-pkg hides /usr/share/emacs/site-lisp/elpa/rust-mode-0.4.0/rust-mode-pkg
/home/xiyueden/.config/emacs/elpa/session-20210422.53/session-autoloads hides /usr/share/emacs/site-lisp/elpa/session-2.4.2/session-autoloads
/home/xiyueden/.config/emacs/elpa/session-20210422.53/session-pkg hides /usr/share/emacs/site-lisp/elpa/session-2.4.2/session-pkg
/home/xiyueden/.config/emacs/elpa/session-20210422.53/session hides /usr/share/emacs/site-lisp/elpa/session-2.4.2/session
/home/xiyueden/.config/emacs/elpa/tabbar-20180726.1735/tabbar-pkg hides /usr/share/emacs/site-lisp/elpa/tabbar-20160524/tabbar-pkg
/home/xiyueden/.config/emacs/elpa/tabbar-20180726.1735/tabbar-autoloads hides /usr/share/emacs/site-lisp/elpa/tabbar-20160524/tabbar-autoloads
/home/xiyueden/.config/emacs/elpa/tabbar-20180726.1735/tabbar hides /usr/share/emacs/site-lisp/elpa/tabbar-20160524/tabbar
/home/xiyueden/.config/emacs/elpa/vterm-20230417.424/vterm hides /usr/share/emacs/site-lisp/elpa/vterm-0.0.2/vterm
/home/xiyueden/.config/emacs/elpa/vterm-20230417.424/vterm-pkg hides /usr/share/emacs/site-lisp/elpa/vterm-0.0.2/vterm-pkg
/home/xiyueden/.config/emacs/elpa/vterm-20230417.424/vterm-autoloads hides /usr/share/emacs/site-lisp/elpa/vterm-0.0.2/vterm-autoloads
/home/xiyueden/.config/emacs/elpa/web-mode-17.3.14/web-mode-pkg hides /usr/share/emacs/site-lisp/elpa/web-mode-17.0.2/web-mode-pkg
/home/xiyueden/.config/emacs/elpa/web-mode-17.3.14/web-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/web-mode-17.0.2/web-mode-autoloads
/home/xiyueden/.config/emacs/elpa/web-mode-17.3.14/web-mode hides /usr/share/emacs/site-lisp/elpa/web-mode-17.0.2/web-mode
/home/xiyueden/.config/emacs/elpa/with-editor-3.3.2/with-editor-pkg hides /usr/share/emacs/site-lisp/elpa/with-editor-3.0.5/with-editor-pkg
/home/xiyueden/.config/emacs/elpa/with-editor-3.3.2/with-editor hides /usr/share/emacs/site-lisp/elpa/with-editor-3.0.5/with-editor
/home/xiyueden/.config/emacs/elpa/with-editor-3.3.2/with-editor-autoloads hides /usr/share/emacs/site-lisp/elpa/with-editor-3.0.5/with-editor-autoloads
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20230815.820/yasnippet-snippets hides /usr/share/emacs/site-lisp/elpa/yasnippet-snippets-20220713/yasnippet-snippets
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20230815.820/yasnippet-snippets-pkg hides /usr/share/emacs/site-lisp/elpa/yasnippet-snippets-20220713/yasnippet-snippets-pkg
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20230815.820/yasnippet-snippets-autoloads hides /usr/share/emacs/site-lisp/elpa/yasnippet-snippets-20220713/yasnippet-snippets-autoloads
/home/xiyueden/.config/emacs/elpa/zenburn-theme-2.8.0/zenburn-theme hides /usr/share/emacs/site-lisp/elpa/zenburn-theme-2.7.0/zenburn-theme
/home/xiyueden/.config/emacs/elpa/zenburn-theme-2.8.0/zenburn-theme-pkg hides /usr/share/emacs/site-lisp/elpa/zenburn-theme-2.7.0/zenburn-theme-pkg
/home/xiyueden/.config/emacs/elpa/zenburn-theme-2.8.0/zenburn-theme-autoloads hides /usr/share/emacs/site-lisp/elpa/zenburn-theme-2.7.0/zenburn-theme-autoloads
/usr/share/emacs/site-lisp/elpa/apache-mode-2.2.0/apache-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/apache-mode-2.2.0/apache-mode-autoloads
/usr/share/emacs/site-lisp/elpa/apache-mode-2.2.0/apache-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/apache-mode-2.2.0/apache-mode-pkg
/usr/share/emacs/site-lisp/elpa/apache-mode-2.2.0/apache-mode hides /usr/share/emacs/site-lisp/elpa-src/apache-mode-2.2.0/apache-mode
/usr/share/emacs/site-lisp/elpa/async-1.9.7/smtpmail-async hides /usr/share/emacs/site-lisp/elpa-src/async-1.9.7/smtpmail-async
/usr/share/emacs/site-lisp/elpa/async-1.9.7/dired-async hides /usr/share/emacs/site-lisp/elpa-src/async-1.9.7/dired-async
/usr/share/emacs/site-lisp/elpa/async-1.9.7/async hides /usr/share/emacs/site-lisp/elpa-src/async-1.9.7/async
/usr/share/emacs/site-lisp/elpa/async-1.9.7/async-pkg hides /usr/share/emacs/site-lisp/elpa-src/async-1.9.7/async-pkg
/usr/share/emacs/site-lisp/elpa/async-1.9.7/async-autoloads hides /usr/share/emacs/site-lisp/elpa-src/async-1.9.7/async-autoloads
/usr/share/emacs/site-lisp/elpa/async-1.9.7/async-bytecomp hides /usr/share/emacs/site-lisp/elpa-src/async-1.9.7/async-bytecomp
/home/xiyueden/.config/emacs/elpa/bar-cursor-20201204.2244/bar-cursor-pkg hides /usr/share/emacs/site-lisp/elpa-src/bar-cursor-2.0/bar-cursor-pkg
/home/xiyueden/.config/emacs/elpa/bar-cursor-20201204.2244/bar-cursor hides /usr/share/emacs/site-lisp/elpa-src/bar-cursor-2.0/bar-cursor
/home/xiyueden/.config/emacs/elpa/bar-cursor-20201204.2244/bar-cursor-autoloads hides /usr/share/emacs/site-lisp/elpa-src/bar-cursor-2.0/bar-cursor-autoloads
/usr/share/emacs/site-lisp/elpa/bind-key-2.4.1/bind-key-autoloads hides /usr/share/emacs/site-lisp/elpa-src/bind-key-2.4.1/bind-key-autoloads
/usr/share/emacs/site-lisp/elpa/bind-key-2.4.1/bind-key-pkg hides /usr/share/emacs/site-lisp/elpa-src/bind-key-2.4.1/bind-key-pkg
/usr/share/emacs/site-lisp/elpa/bind-key-2.4.1/bind-key hides /usr/share/emacs/site-lisp/elpa-src/bind-key-2.4.1/bind-key
/usr/share/emacs/site-lisp/elpa/bm-201905/bm-sync hides /usr/share/emacs/site-lisp/elpa-src/bm-201905/bm-sync
/usr/share/emacs/site-lisp/elpa/bm-201905/bm-pkg hides /usr/share/emacs/site-lisp/elpa-src/bm-201905/bm-pkg
/usr/share/emacs/site-lisp/elpa/bm-201905/bm-autoloads hides /usr/share/emacs/site-lisp/elpa-src/bm-201905/bm-autoloads
/usr/share/emacs/site-lisp/elpa/bm-201905/bm hides /usr/share/emacs/site-lisp/elpa-src/bm-201905/bm
/home/xiyueden/.config/emacs/elpa/boxquote-2.3/boxquote hides /usr/share/emacs/site-lisp/elpa-src/boxquote-2.2/boxquote
/home/xiyueden/.config/emacs/elpa/boxquote-2.3/boxquote-autoloads hides /usr/share/emacs/site-lisp/elpa-src/boxquote-2.2/boxquote-autoloads
/home/xiyueden/.config/emacs/elpa/boxquote-2.3/boxquote-pkg hides /usr/share/emacs/site-lisp/elpa-src/boxquote-2.2/boxquote-pkg
/usr/share/emacs/site-lisp/elpa/browse-kill-ring-2.0.0/browse-kill-ring-pkg hides /usr/share/emacs/site-lisp/elpa-src/browse-kill-ring-2.0.0/browse-kill-ring-pkg
/usr/share/emacs/site-lisp/elpa/browse-kill-ring-2.0.0/browse-kill-ring hides /usr/share/emacs/site-lisp/elpa-src/browse-kill-ring-2.0.0/browse-kill-ring
/usr/share/emacs/site-lisp/elpa/browse-kill-ring-2.0.0/browse-kill-ring-autoloads hides /usr/share/emacs/site-lisp/elpa-src/browse-kill-ring-2.0.0/browse-kill-ring-autoloads
/home/xiyueden/.config/emacs/elpa/buttercup-1.31/buttercup-pkg hides /usr/share/emacs/site-lisp/elpa-src/buttercup-1.26/buttercup-pkg
/home/xiyueden/.config/emacs/elpa/buttercup-1.31/buttercup hides /usr/share/emacs/site-lisp/elpa-src/buttercup-1.26/buttercup
/home/xiyueden/.config/emacs/elpa/buttercup-1.31/buttercup-autoloads hides /usr/share/emacs/site-lisp/elpa-src/buttercup-1.26/buttercup-autoloads
/home/xiyueden/.config/emacs/elpa/buttercup-1.31/buttercup-compat hides /usr/share/emacs/site-lisp/elpa-src/buttercup-1.26/buttercup-compat
/home/xiyueden/.config/emacs/elpa/cmake-mode-3.27.6/cmake-mode hides /usr/share/emacs/site-lisp/elpa-src/cmake-mode-3.25.1/cmake-mode
/home/xiyueden/.config/emacs/elpa/cmake-mode-3.27.6/cmake-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/cmake-mode-3.25.1/cmake-mode-autoloads
/home/xiyueden/.config/emacs/elpa/cmake-mode-3.27.6/cmake-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/cmake-mode-3.25.1/cmake-mode-pkg
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-dabbrev hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-dabbrev
/usr/share/emacs/site-lisp/elpa/company-0.9.13/async-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/async-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-capf hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-capf
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-yasnippet hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-yasnippet
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-ispell hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-ispell
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-etags hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-etags
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-template hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-template
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-abbrev hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-abbrev
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-files hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-files
/usr/share/emacs/site-lisp/elpa/company-0.9.13/template-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/template-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-xcode hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-xcode
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-css hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-css
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/bbdb-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/bbdb-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-dabbrev-code hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-dabbrev-code
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-pkg hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-pkg
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-oddmuse hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-oddmuse
/usr/share/emacs/site-lisp/elpa/company-0.9.13/clang-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/clang-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-bbdb hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-bbdb
/usr/share/emacs/site-lisp/elpa/company-0.9.13/transformers-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/transformers-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/frontends-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/frontends-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/core-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/core-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-clang hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-clang
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-nxml hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-nxml
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-gtags hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-gtags
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-tempo hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-tempo
/usr/share/emacs/site-lisp/elpa/company-0.9.13/capf-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/capf-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-autoloads hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-autoloads
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-cmake hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-cmake
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-tng hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-tng
/usr/share/emacs/site-lisp/elpa/company-0.9.13/keywords-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/keywords-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-elisp hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-elisp
/usr/share/emacs/site-lisp/elpa/company-0.9.13/all hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/all
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-semantic hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-semantic
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-eclim hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-eclim
/usr/share/emacs/site-lisp/elpa/company-0.9.13/files-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/files-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/elisp-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/elisp-tests
/usr/share/emacs/site-lisp/elpa/company-0.9.13/company-keywords hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-keywords
/usr/share/emacs/site-lisp/elpa/company-0.9.13/cmake-tests hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/cmake-tests
/usr/share/emacs/site-lisp/elpa/csv-mode-1.22/csv-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/csv-mode-1.22/csv-mode-autoloads
/usr/share/emacs/site-lisp/elpa/csv-mode-1.22/csv-mode hides /usr/share/emacs/site-lisp/elpa-src/csv-mode-1.22/csv-mode
/usr/share/emacs/site-lisp/elpa/csv-mode-1.22/csv-mode-tests hides /usr/share/emacs/site-lisp/elpa-src/csv-mode-1.22/csv-mode-tests
/usr/share/emacs/site-lisp/elpa/csv-mode-1.22/csv-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/csv-mode-1.22/csv-mode-pkg
/usr/share/emacs/site-lisp/elpa/dash-2.19.1/dash hides /usr/share/emacs/site-lisp/elpa-src/dash-2.19.1/dash
/usr/share/emacs/site-lisp/elpa/dash-2.19.1/dash-pkg hides /usr/share/emacs/site-lisp/elpa-src/dash-2.19.1/dash-pkg
/usr/share/emacs/site-lisp/elpa/dash-2.19.1/dash-autoloads hides /usr/share/emacs/site-lisp/elpa-src/dash-2.19.1/dash-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-el-autoloads hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-el-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37/apt-sources hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/apt-sources
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-bug hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-bug
/usr/share/emacs/site-lisp/elpa/debian-el-37/apt-utils hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/apt-utils
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-el-pkg hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-el-pkg
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-autoloads hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37/gnus-BTS hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/gnus-BTS
/usr/share/emacs/site-lisp/elpa/debian-el-37/deb-view hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/deb-view
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-el hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/debian-el
/usr/share/emacs/site-lisp/elpa/debian-el-37/preseed hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37/preseed
/usr/share/emacs/site-lisp/elpa/devscripts-40/devscripts hides /usr/share/emacs/site-lisp/elpa-src/devscripts-40/devscripts
/usr/share/emacs/site-lisp/elpa/devscripts-40/devscripts-autoloads hides /usr/share/emacs/site-lisp/elpa-src/devscripts-40/devscripts-autoloads
/usr/share/emacs/site-lisp/elpa/devscripts-40/pbuilder-mode hides /usr/share/emacs/site-lisp/elpa-src/devscripts-40/pbuilder-mode
/usr/share/emacs/site-lisp/elpa/devscripts-40/devscripts-pkg hides /usr/share/emacs/site-lisp/elpa-src/devscripts-40/devscripts-pkg
/usr/share/emacs/site-lisp/elpa/devscripts-40/pbuilder-log-view-mode hides /usr/share/emacs/site-lisp/elpa-src/devscripts-40/pbuilder-log-view-mode
/home/xiyueden/.config/emacs/elpa/diminish-0.46/diminish-pkg hides /usr/share/emacs/site-lisp/elpa-src/diminish-0.45/diminish-pkg
/home/xiyueden/.config/emacs/elpa/diminish-0.46/diminish hides /usr/share/emacs/site-lisp/elpa-src/diminish-0.45/diminish
/home/xiyueden/.config/emacs/elpa/diminish-0.46/diminish-autoloads hides /usr/share/emacs/site-lisp/elpa-src/diminish-0.45/diminish-autoloads
/usr/share/emacs/site-lisp/elpa/dockerfile-mode-1.7/dockerfile-mode hides /usr/share/emacs/site-lisp/elpa-src/dockerfile-mode-1.7/dockerfile-mode
/usr/share/emacs/site-lisp/elpa/dockerfile-mode-1.7/dockerfile-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/dockerfile-mode-1.7/dockerfile-mode-autoloads
/usr/share/emacs/site-lisp/elpa/dockerfile-mode-1.7/dockerfile-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/dockerfile-mode-1.7/dockerfile-mode-pkg
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/debian-bts-control hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/debian-bts-control
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/debian-changelog-mode hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/debian-changelog-mode
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/dpkg-dev-el-autoloads hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/dpkg-dev-el-autoloads
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/dpkg-dev-el-pkg hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/dpkg-dev-el-pkg
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-autoloads hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/debian-autoloads
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/dpkg-dev-el hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/dpkg-dev-el
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/debian-control-mode hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/debian-control-mode
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/debian-copyright hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/debian-copyright
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.0/readme-debian hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.0/readme-debian
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-perl hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-perl
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-javascript-bower hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-javascript-bower
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-autoloads hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-autoloads
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-javascript-grunt hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-javascript-grunt
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-tests hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-tests
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-ruby hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-ruby
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-clojure-leiningen hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-clojure-leiningen
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-extras hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-extras
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-python hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-python
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-javascript-npm hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-javascript-npm
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-php-composer hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-php-composer
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-arduino hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-arduino
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-ruby-on-rails hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-ruby-on-rails
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-pkg hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-pkg
/usr/share/emacs/site-lisp/elpa/eproject-1.5/eproject-android hides /usr/share/emacs/site-lisp/elpa-src/eproject-1.5/eproject-android
/home/xiyueden/.config/emacs/elpa/folding-20230919.1053/folding hides /usr/share/emacs/site-lisp/elpa-src/folding-20220110.1718/folding
/home/xiyueden/.config/emacs/elpa/folding-20230919.1053/folding-autoloads hides /usr/share/emacs/site-lisp/elpa-src/folding-20220110.1718/folding-autoloads
/home/xiyueden/.config/emacs/elpa/folding-20230919.1053/folding-pkg hides /usr/share/emacs/site-lisp/elpa-src/folding-20220110.1718/folding-pkg
/usr/share/emacs/site-lisp/elpa/git-commit-3.3.0/git-commit hides /usr/share/emacs/site-lisp/elpa-src/git-commit-3.3.0/git-commit
/usr/share/emacs/site-lisp/elpa/git-commit-3.3.0/git-commit-autoloads hides /usr/share/emacs/site-lisp/elpa-src/git-commit-3.3.0/git-commit-autoloads
/usr/share/emacs/site-lisp/elpa/git-commit-3.3.0/git-commit-pkg hides /usr/share/emacs/site-lisp/elpa-src/git-commit-3.3.0/git-commit-pkg
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/git-modes hides /usr/share/emacs/site-lisp/elpa-src/git-modes-1.4.0/git-modes
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/git-modes-pkg hides /usr/share/emacs/site-lisp/elpa-src/git-modes-1.4.0/git-modes-pkg
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/git-modes-autoloads hides /usr/share/emacs/site-lisp/elpa-src/git-modes-1.4.0/git-modes-autoloads
/usr/share/emacs/site-lisp/elpa/gitattributes-mode-1.4.0/gitattributes-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/gitattributes-mode-1.4.0/gitattributes-mode-pkg
/usr/share/emacs/site-lisp/elpa/gitattributes-mode-1.4.0/gitattributes-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/gitattributes-mode-1.4.0/gitattributes-mode-autoloads
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/gitattributes-mode hides /usr/share/emacs/site-lisp/elpa-src/gitattributes-mode-1.4.0/gitattributes-mode
/usr/share/emacs/site-lisp/elpa/gitconfig-mode-1.4.0/gitconfig-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/gitconfig-mode-1.4.0/gitconfig-mode-autoloads
/usr/share/emacs/site-lisp/elpa/gitconfig-mode-1.4.0/gitconfig-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/gitconfig-mode-1.4.0/gitconfig-mode-pkg
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/gitconfig-mode hides /usr/share/emacs/site-lisp/elpa-src/gitconfig-mode-1.4.0/gitconfig-mode
/usr/share/emacs/site-lisp/elpa/gitignore-mode-1.4.0/gitignore-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/gitignore-mode-1.4.0/gitignore-mode-pkg
/usr/share/emacs/site-lisp/elpa/gitignore-mode-1.4.0/gitignore-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/gitignore-mode-1.4.0/gitignore-mode-autoloads
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.1/gitignore-mode hides /usr/share/emacs/site-lisp/elpa-src/gitignore-mode-1.4.0/gitignore-mode
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/gnuplot
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot-autoloads hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/gnuplot-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37/debian-autoloads hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/debian-autoloads
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot-pkg hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/gnuplot-pkg
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot-context hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/gnuplot-context
/home/xiyueden/.config/emacs/elpa/gnuplot-0.8.1/gnuplot-gui hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/gnuplot-gui
/usr/share/emacs/site-lisp/elpa/go-mode-1.6.0/go-mode hides /usr/share/emacs/site-lisp/elpa-src/go-mode-1.6.0/go-mode
/usr/share/emacs/site-lisp/elpa/go-mode-1.6.0/go-guru hides /usr/share/emacs/site-lisp/elpa-src/go-mode-1.6.0/go-guru
/usr/share/emacs/site-lisp/elpa/go-mode-1.6.0/go-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/go-mode-1.6.0/go-mode-pkg
/usr/share/emacs/site-lisp/elpa/go-mode-1.6.0/go-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/go-mode-1.6.0/go-mode-autoloads
/usr/share/emacs/site-lisp/elpa/go-mode-1.6.0/go-rename hides /usr/share/emacs/site-lisp/elpa-src/go-mode-1.6.0/go-rename
/usr/share/emacs/site-lisp/elpa/graphviz-dot-mode-0.4.2/graphviz-dot-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/graphviz-dot-mode-0.4.2/graphviz-dot-mode-autoloads
/usr/share/emacs/site-lisp/elpa/graphviz-dot-mode-0.4.2/company-graphviz-dot hides /usr/share/emacs/site-lisp/elpa-src/graphviz-dot-mode-0.4.2/company-graphviz-dot
/usr/share/emacs/site-lisp/elpa/graphviz-dot-mode-0.4.2/graphviz-dot-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/graphviz-dot-mode-0.4.2/graphviz-dot-mode-pkg
/usr/share/emacs/site-lisp/elpa/graphviz-dot-mode-0.4.2/graphviz-dot-mode hides /usr/share/emacs/site-lisp/elpa-src/graphviz-dot-mode-0.4.2/graphviz-dot-mode
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-font hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-font
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-locate hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-locate
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-net hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-net
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-id-utils hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-id-utils
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-x-files hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-x-files
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-eval hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-eval
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-eshell hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-eshell
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-find hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-find
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-global-bindings hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-global-bindings
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-occur hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-occur
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-comint hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-comint
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-info hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-info
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-mode hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-mode
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-bookmark hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-bookmark
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-config hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-config
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-tags hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-tags
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-imenu hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-imenu
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-color hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-color
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-regexp hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-regexp
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-external hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-external
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-types hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-types
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-pkg hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-pkg
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-misc hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-misc
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-ring hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-ring
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-sys hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-sys
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-semantic hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-semantic
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-easymenu hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-easymenu
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-grep hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-grep
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-autoloads hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-autoloads
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-man hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-man
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-adaptive hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-adaptive
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-files hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-files
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-elisp hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-elisp
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-help hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-help
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-shell hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-shell
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-utils hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-utils
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-dabbrev hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-dabbrev
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-elisp-package hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-elisp-package
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-command hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-command
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-buffers hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-buffers
/usr/share/emacs/site-lisp/elpa/helm-3.8.4/helm-for-files hides /usr/share/emacs/site-lisp/elpa-src/helm-3.8.4/helm-for-files
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm hides /usr/share/emacs/site-lisp/elpa-src/helm-core-3.8.4/helm
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-core-pkg hides /usr/share/emacs/site-lisp/elpa-src/helm-core-3.8.4/helm-core-pkg
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-lib hides /usr/share/emacs/site-lisp/elpa-src/helm-core-3.8.4/helm-lib
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-source hides /usr/share/emacs/site-lisp/elpa-src/helm-core-3.8.4/helm-source
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-core-autoloads hides /usr/share/emacs/site-lisp/elpa-src/helm-core-3.8.4/helm-core-autoloads
/home/xiyueden/.config/emacs/elpa/helm-core-3.9.5/helm-multi-match hides /usr/share/emacs/site-lisp/elpa-src/helm-core-3.8.4/helm-multi-match
/home/xiyueden/.config/emacs/elpa/htmlize-1.57/htmlize hides /usr/share/emacs/site-lisp/elpa-src/htmlize-1.56/htmlize
/home/xiyueden/.config/emacs/elpa/htmlize-1.57/htmlize-autoloads hides /usr/share/emacs/site-lisp/elpa-src/htmlize-1.56/htmlize-autoloads
/home/xiyueden/.config/emacs/elpa/htmlize-1.57/htmlize-pkg hides /usr/share/emacs/site-lisp/elpa-src/htmlize-1.56/htmlize-pkg
/home/xiyueden/.config/emacs/elpa/initsplit-20160919.1818/initsplit hides /usr/share/emacs/site-lisp/elpa-src/initsplit-1.8/initsplit
/usr/share/emacs/site-lisp/elpa/initsplit-1.8/initsplit-test hides /usr/share/emacs/site-lisp/elpa-src/initsplit-1.8/initsplit-test
/home/xiyueden/.config/emacs/elpa/initsplit-20160919.1818/initsplit-autoloads hides /usr/share/emacs/site-lisp/elpa-src/initsplit-1.8/initsplit-autoloads
/home/xiyueden/.config/emacs/elpa/initsplit-20160919.1818/initsplit-pkg hides /usr/share/emacs/site-lisp/elpa-src/initsplit-1.8/initsplit-pkg
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-old-indent hides /usr/share/emacs/site-lisp/elpa-src/js2-mode-20201220/js2-old-indent
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-mode hides /usr/share/emacs/site-lisp/elpa-src/js2-mode-20201220/js2-mode
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-imenu-extras hides /usr/share/emacs/site-lisp/elpa-src/js2-mode-20201220/js2-imenu-extras
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/js2-mode-20201220/js2-mode-pkg
/home/xiyueden/.config/emacs/elpa/js2-mode-20230408/js2-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/js2-mode-20201220/js2-mode-autoloads
/usr/share/emacs/site-lisp/elpa/lintian-0.1/lintian-pkg hides /usr/share/emacs/site-lisp/elpa-src/lintian-0.1/lintian-pkg
/usr/share/emacs/site-lisp/elpa/lintian-0.1/lintian-autoloads hides /usr/share/emacs/site-lisp/elpa-src/lintian-0.1/lintian-autoloads
/usr/share/emacs/site-lisp/elpa/lintian-0.1/lintian hides /usr/share/emacs/site-lisp/elpa-src/lintian-0.1/lintian
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-remote hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-remote
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/git-rebase hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/git-rebase
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-bisect hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-bisect
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-margin hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-margin
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-merge hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-merge
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-section hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-section
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-patch hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-patch
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-commit hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-commit
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-autoloads hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-autoloads
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-files hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-files
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-stash hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-stash
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-bookmark hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-bookmark
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-submodule hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-submodule
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-apply hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-apply
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-repos hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-repos
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-core hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-core
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-subtree hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-subtree
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-autorevert hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-autorevert
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-gitignore hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-gitignore
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-transient hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-transient
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-extras hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-extras
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-git hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-git
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-notes hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-notes
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-reflog hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-reflog
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-mode hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-mode
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-push hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-push
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-tag hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-tag
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-process hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-process
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-ediff hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-ediff
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-imenu hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-imenu
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-diff hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-diff
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-clone hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-clone
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-log hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-log
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-utils hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-utils
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-wip hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-wip
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-branch hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-branch
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-pull hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-pull
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-reset hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-reset
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-sequence hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-sequence
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-status hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-status
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-refs hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-refs
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-obsolete hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-obsolete
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-fetch hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-fetch
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-worktree hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-worktree
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-blame hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-blame
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-pkg hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-pkg
/usr/share/emacs/site-lisp/elpa/magit-section-3.3.0/magit-section-autoloads hides /usr/share/emacs/site-lisp/elpa-src/magit-section-3.3.0/magit-section-autoloads
/usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-section hides /usr/share/emacs/site-lisp/elpa-src/magit-section-3.3.0/magit-section
/usr/share/emacs/site-lisp/elpa/magit-section-3.3.0/magit-section-pkg hides /usr/share/emacs/site-lisp/elpa-src/magit-section-3.3.0/magit-section-pkg
/home/xiyueden/.config/emacs/elpa/markdown-mode-2.6/markdown-mode hides /usr/share/emacs/site-lisp/elpa-src/markdown-mode-2.5/markdown-mode
/home/xiyueden/.config/emacs/elpa/markdown-mode-2.6/markdown-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/markdown-mode-2.5/markdown-mode-pkg
/home/xiyueden/.config/emacs/elpa/markdown-mode-2.6/markdown-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/markdown-mode-2.5/markdown-mode-autoloads
/home/xiyueden/.config/emacs/elpa/meson-mode-0.3/meson-mode hides /usr/share/emacs/site-lisp/elpa-src/meson-mode-0.2/meson-mode
/home/xiyueden/.config/emacs/elpa/meson-mode-0.3/utils hides /usr/share/emacs/site-lisp/elpa-src/meson-mode-0.2/utils
/home/xiyueden/.config/emacs/elpa/meson-mode-0.3/meson-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/meson-mode-0.2/meson-mode-autoloads
/home/xiyueden/.config/emacs/elpa/meson-mode-0.3/meson-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/meson-mode-0.2/meson-mode-pkg
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-draft hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-draft
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-view hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-view
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-message hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-message
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-helpers hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-helpers
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-pkg hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-pkg
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-bookmarks hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-bookmarks
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-server hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-server
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-contrib hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-contrib
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-config hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-config
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-autoloads hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-autoloads
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-icalendar hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-icalendar
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-mark hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-mark
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-headers hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-headers
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-org hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-org
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-contacts hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-contacts
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-speedbar hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-speedbar
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-vars hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-vars
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-actions hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-actions
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-main hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-main
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-search hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-search
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-context hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-context
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-compose hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-compose
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-lists hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-lists
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-folders hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-folders
/usr/share/emacs/site-lisp/elpa/mu4e-1.8.14/mu4e-update hides /usr/share/emacs/site-lisp/elpa-src/mu4e-1.8.14/mu4e-update
/usr/share/emacs/site-lisp/elpa/mutt-alias-1.4/mutt-alias hides /usr/share/emacs/site-lisp/elpa-src/mutt-alias-1.4/mutt-alias
/usr/share/emacs/site-lisp/elpa/mutt-alias-1.4/mutt-alias-pkg hides /usr/share/emacs/site-lisp/elpa-src/mutt-alias-1.4/mutt-alias-pkg
/usr/share/emacs/site-lisp/elpa/mutt-alias-1.4/mutt-alias-autoloads hides /usr/share/emacs/site-lisp/elpa-src/mutt-alias-1.4/mutt-alias-autoloads
/usr/share/emacs/site-lisp/elpa/muttrc-mode-1.2.1/muttrc-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/muttrc-mode-1.2.1/muttrc-mode-autoloads
/usr/share/emacs/site-lisp/elpa/muttrc-mode-1.2.1/muttrc-mode hides /usr/share/emacs/site-lisp/elpa-src/muttrc-mode-1.2.1/muttrc-mode
/usr/share/emacs/site-lisp/elpa/muttrc-mode-1.2.1/muttrc-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/muttrc-mode-1.2.1/muttrc-mode-pkg
/usr/share/emacs/site-lisp/elpa/po-mode-0.21/po-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/po-mode-0.21/po-mode-pkg
/usr/share/emacs/site-lisp/elpa/po-mode-0.21/po-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/po-mode-0.21/po-mode-autoloads
/usr/share/emacs/site-lisp/elpa/po-mode-0.21/po-mode hides /usr/share/emacs/site-lisp/elpa-src/po-mode-0.21/po-mode
/usr/share/emacs/site-lisp/elpa/pod-mode-1.3/pod-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/pod-mode-1.3/pod-mode-pkg
/usr/share/emacs/site-lisp/elpa/pod-mode-1.3/pod-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/pod-mode-1.3/pod-mode-autoloads
/usr/share/emacs/site-lisp/elpa/pod-mode-1.3/pod-mode hides /usr/share/emacs/site-lisp/elpa-src/pod-mode-1.3/pod-mode
/home/xiyueden/.config/emacs/elpa/popup-0.5.9/popup hides /usr/share/emacs/site-lisp/elpa-src/popup-0.5.8/popup
/home/xiyueden/.config/emacs/elpa/popup-0.5.9/popup-pkg hides /usr/share/emacs/site-lisp/elpa-src/popup-0.5.8/popup-pkg
/home/xiyueden/.config/emacs/elpa/popup-0.5.9/popup-autoloads hides /usr/share/emacs/site-lisp/elpa-src/popup-0.5.8/popup-autoloads
/usr/share/emacs/site-lisp/elpa/py-isort-2016.1/py-isort hides /usr/share/emacs/site-lisp/elpa-src/py-isort-2016.1/py-isort
/usr/share/emacs/site-lisp/elpa/py-isort-2016.1/py-isort-autoloads hides /usr/share/emacs/site-lisp/elpa-src/py-isort-2016.1/py-isort-autoloads
/usr/share/emacs/site-lisp/elpa/py-isort-2016.1/py-isort-pkg hides /usr/share/emacs/site-lisp/elpa-src/py-isort-2016.1/py-isort-pkg
/home/xiyueden/.config/emacs/elpa/rust-mode-1.0.5/rust-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/rust-mode-0.4.0/rust-mode-autoloads
/home/xiyueden/.config/emacs/elpa/rust-mode-1.0.5/rust-mode hides /usr/share/emacs/site-lisp/elpa-src/rust-mode-0.4.0/rust-mode
/home/xiyueden/.config/emacs/elpa/rust-mode-1.0.5/rust-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/rust-mode-0.4.0/rust-mode-pkg
/home/xiyueden/.config/emacs/elpa/session-20210422.53/session-autoloads hides /usr/share/emacs/site-lisp/elpa-src/session-2.4.2/session-autoloads
/home/xiyueden/.config/emacs/elpa/session-20210422.53/session hides /usr/share/emacs/site-lisp/elpa-src/session-2.4.2/session
/home/xiyueden/.config/emacs/elpa/session-20210422.53/session-pkg hides /usr/share/emacs/site-lisp/elpa-src/session-2.4.2/session-pkg
/home/xiyueden/.config/emacs/elpa/tabbar-20180726.1735/tabbar-pkg hides /usr/share/emacs/site-lisp/elpa-src/tabbar-20160524/tabbar-pkg
/usr/share/emacs/site-lisp/elpa/tabbar-20160524/tabbar-window hides /usr/share/emacs/site-lisp/elpa-src/tabbar-20160524/tabbar-window
/usr/share/emacs/site-lisp/elpa/tabbar-20160524/one-buffer-one-frame hides /usr/share/emacs/site-lisp/elpa-src/tabbar-20160524/one-buffer-one-frame
/usr/share/emacs/site-lisp/elpa/tabbar-20160524/aquamacs-tools hides /usr/share/emacs/site-lisp/elpa-src/tabbar-20160524/aquamacs-tools
/usr/share/emacs/site-lisp/elpa/tabbar-20160524/aquamacs-compat hides /usr/share/emacs/site-lisp/elpa-src/tabbar-20160524/aquamacs-compat
/home/xiyueden/.config/emacs/elpa/tabbar-20180726.1735/tabbar-autoloads hides /usr/share/emacs/site-lisp/elpa-src/tabbar-20160524/tabbar-autoloads
/usr/share/emacs/site-lisp/elpa/tabbar-20160524/aquamacs-tabbar hides /usr/share/emacs/site-lisp/elpa-src/tabbar-20160524/aquamacs-tabbar
/home/xiyueden/.config/emacs/elpa/tabbar-20180726.1735/tabbar hides /usr/share/emacs/site-lisp/elpa-src/tabbar-20160524/tabbar
/usr/share/emacs/site-lisp/elpa/vterm-0.0.2/vterm-load-path hides /usr/share/emacs/site-lisp/elpa-src/vterm-0.0.2/vterm-load-path
/home/xiyueden/.config/emacs/elpa/vterm-20230417.424/vterm hides /usr/share/emacs/site-lisp/elpa-src/vterm-0.0.2/vterm
/home/xiyueden/.config/emacs/elpa/vterm-20230417.424/vterm-pkg hides /usr/share/emacs/site-lisp/elpa-src/vterm-0.0.2/vterm-pkg
/home/xiyueden/.config/emacs/elpa/vterm-20230417.424/vterm-autoloads hides /usr/share/emacs/site-lisp/elpa-src/vterm-0.0.2/vterm-autoloads
/home/xiyueden/.config/emacs/elpa/web-mode-17.3.14/web-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/web-mode-17.0.2/web-mode-pkg
/home/xiyueden/.config/emacs/elpa/web-mode-17.3.14/web-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/web-mode-17.0.2/web-mode-autoloads
/home/xiyueden/.config/emacs/elpa/web-mode-17.3.14/web-mode hides /usr/share/emacs/site-lisp/elpa-src/web-mode-17.0.2/web-mode
/home/xiyueden/.config/emacs/elpa/with-editor-3.3.2/with-editor-pkg hides /usr/share/emacs/site-lisp/elpa-src/with-editor-3.0.5/with-editor-pkg
/home/xiyueden/.config/emacs/elpa/with-editor-3.3.2/with-editor-autoloads hides /usr/share/emacs/site-lisp/elpa-src/with-editor-3.0.5/with-editor-autoloads
/home/xiyueden/.config/emacs/elpa/with-editor-3.3.2/with-editor hides /usr/share/emacs/site-lisp/elpa-src/with-editor-3.0.5/with-editor
/usr/share/emacs/site-lisp/elpa/yaml-mode-0.0.15/yaml-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/yaml-mode-0.0.15/yaml-mode-pkg
/usr/share/emacs/site-lisp/elpa/yaml-mode-0.0.15/yaml-mode hides /usr/share/emacs/site-lisp/elpa-src/yaml-mode-0.0.15/yaml-mode
/usr/share/emacs/site-lisp/elpa/yaml-mode-0.0.15/yaml-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/yaml-mode-0.0.15/yaml-mode-autoloads
/usr/share/emacs/site-lisp/elpa/yasnippet-0.14.0/yasnippet-autoloads hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-0.14.0/yasnippet-autoloads
/usr/share/emacs/site-lisp/elpa/yasnippet-0.14.0/yasnippet-pkg hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-0.14.0/yasnippet-pkg
/usr/share/emacs/site-lisp/elpa/yasnippet-0.14.0/yasnippet hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-0.14.0/yasnippet
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20230815.820/yasnippet-snippets hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-snippets-20220713/yasnippet-snippets
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20230815.820/yasnippet-snippets-pkg hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-snippets-20220713/yasnippet-snippets-pkg
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20230815.820/yasnippet-snippets-autoloads hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-snippets-20220713/yasnippet-snippets-autoloads
/home/xiyueden/.config/emacs/elpa/zenburn-theme-2.8.0/zenburn-theme hides /usr/share/emacs/site-lisp/elpa-src/zenburn-theme-2.7.0/zenburn-theme
/home/xiyueden/.config/emacs/elpa/zenburn-theme-2.8.0/zenburn-theme-pkg hides /usr/share/emacs/site-lisp/elpa-src/zenburn-theme-2.7.0/zenburn-theme-pkg
/home/xiyueden/.config/emacs/elpa/zenburn-theme-2.8.0/zenburn-theme-autoloads hides /usr/share/emacs/site-lisp/elpa-src/zenburn-theme-2.7.0/zenburn-theme-autoloads
/usr/share/emacs/site-lisp/elpa/bind-key-2.4.1/bind-key hides /usr/share/emacs/29.1/lisp/use-package/bind-key
/home/xiyueden/.config/emacs/elpa/project-0.10.0/project hides /usr/share/emacs/29.1/lisp/progmodes/project
/home/xiyueden/.config/emacs/elpa/eldoc-1.14.0/eldoc hides /usr/share/emacs/29.1/lisp/emacs-lisp/eldoc
/home/xiyueden/.config/emacs/elpa/seq-2.24/seq hides /usr/share/emacs/29.1/lisp/emacs-lisp/seq
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-info hides /usr/share/auctex/tex-info
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/latex-flymake hides /usr/share/auctex/latex-flymake
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/texmathp hides /usr/share/auctex/texmathp
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/toolbar-x hides /usr/share/auctex/toolbar-x
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-style hides /usr/share/auctex/tex-style
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-font hides /usr/share/auctex/tex-font
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-jp hides /usr/share/auctex/tex-jp
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-mik hides /usr/share/auctex/tex-mik
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/plain-tex hides /usr/share/auctex/plain-tex
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-fold hides /usr/share/auctex/tex-fold
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-ispell hides /usr/share/auctex/tex-ispell
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex-bar hides /usr/share/auctex/tex-bar
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/bib-cite hides /usr/share/auctex/bib-cite
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/preview hides /usr/share/auctex/preview
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/context-nl hides /usr/share/auctex/context-nl
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/multi-prompt hides /usr/share/auctex/multi-prompt
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/context-en hides /usr/share/auctex/context-en
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/tex hides /usr/share/auctex/tex
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/font-latex hides /usr/share/auctex/font-latex
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/context hides /usr/share/auctex/context
/home/xiyueden/.config/emacs/elpa/auctex-13.2.1/latex hides /usr/share/auctex/latex

Features:
(shadow sort mail-extr emacsbug message yank-media puny rfc822 mml
mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev
gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums with-editor
server vterm bookmark tramp tramp-loaddefs trampver tramp-integration
files-x tramp-compat face-remap color term shell ehelp vterm-module
windmove mule-util jka-compr magit-utils crm dash misearch multi-isearch
comp comp-cstr rx eglot external-completion array jsonrpc ert ewoc debug
backtrace find-func imenu term/xterm xterm cap-words superword subword
disp-table whitespace yasnippet-snippets yasnippet icomplete
company-oddmuse company-keywords company-etags etags fileloop generator
xref company-gtags company-dabbrev-code company-dabbrev company-files
company-capf company-cmake company-xcode company-clang company-semantic
company-eclim company-template company-bbdb diminish company edmacro
kmacro pcase init zenburn-theme keychain-environment gnus nnheader
gnus-util mail-utils range mm-util mail-prsvr flymake-proc flymake
project compile text-property-search warnings icons epa derived epg
rfc6068 epg-config rcirc parse-time advice erc-list erc-menu erc-join
erc-ring erc-pcomplete pcomplete comint ansi-osc ansi-color ring
erc-track erc-match erc-button wid-edit erc-fill erc-stamp erc-netsplit
erc-spelling flyspell ispell erc-log erc-goodies erc iso8601 time-date
thingatpt pp format-spec erc-backend erc-networks erc-common erc-compat
compat erc-loaddefs cl-extra help-mode use-package use-package-ensure
use-package-delight use-package-diminish use-package-bind-key bind-key
easy-mmode use-package-core display-line-numbers autorevert filenotify
preview-latex tex-site bar-cursor-autoloads boxquote-autoloads
buttercup-autoloads cmake-mode-autoloads diminish-autoloads
eldoc-autoloads flutter-autoloads folding-autoloads git-modes-autoloads
gnuplot-autoloads helm-core-autoloads htmlize-autoloads
initsplit-autoloads js2-mode-autoloads markdown-mode-autoloads
meson-mode-autoloads popup-autoloads project-autoloads
rust-mode-autoloads session-autoloads tabbar-autoloads vterm-autoloads
web-mode-autoloads yasnippet-snippets-autoloads zenburn-theme-autoloads
dpkg-dev-el debian-el-autoloads debian-el dired dired-loaddefs
finder-inf with-editor-autoloads info compat-autoloads seq-autoloads
package browse-url url url-proxy url-privacy url-expand url-methods
url-history url-cookie generate-lisp-file url-domsuf url-util mailcap
url-handlers url-parse auth-source cl-seq eieio eieio-core cl-macs
password-cache json subr-x map byte-opt gv bytecomp byte-compile
url-vars cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren
electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel
term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode
prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu
timer select scroll-bar mouse jit-lock font-lock syntax font-core
term/tty-colors frame minibuffer nadvice seq simple cl-generic
indonesian philippine cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek
romanian slovak czech european ethiopic indian cyrillic chinese
composite emoji-zwj charscript charprop case-table epa-hook
jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs
theme-loaddefs faces cus-face macroexp files window text-properties
overlay sha1 md5 base64 format env code-pages mule custom widget keymap
hashtable-print-readable backquote threads dbusbind inotify lcms2
dynamic-setting system-font-setting font-render-setting cairo
move-toolbar gtk x-toolkit xinput2 x multi-tty make-network-process
native-compile emacs)

Memory information:
((conses 16 307913 16767)
 (symbols 48 24491 0)
 (strings 32 75705 7313)
 (string-bytes 1 2561105)
 (vectors 16 40749)
 (vector-slots 8 778130 14226)
 (floats 8 214 912)
 (intervals 56 1125 606)
 (buffers 984 18))





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests reports test redefined depending on loading sequence
  2023-10-27 20:59 bug#66782: 29.1; ERT tests reports test redefined depending on loading sequence Xiyue Deng
@ 2023-10-28  6:32 ` Eli Zaretskii
  2023-10-28  9:39   ` bug#66782: 29.1; ERT tests report " Xiyue Deng
  0 siblings, 1 reply; 21+ messages in thread
From: Eli Zaretskii @ 2023-10-28  6:32 UTC (permalink / raw)
  To: Xiyue Deng, Mattias Engdegård; +Cc: 66782

> From: Xiyue Deng <manphiz@gmail.com>
> Date: Fri, 27 Oct 2023 13:59:07 -0700
> 
> As you can see there's only one `first-test' defined.  The error message
> is misleading.
> 
> A real world example of this can be found in lsp-mode, where
> test/lsp-clangd-test.el[1] requires test/lsp-integration-test.el[2].
> See also the discussion on an Debian bug[3].

If test2 requires test1, why are both of them explicitly run from the
command line?  Isn't that redundant, since running test2 will also run
the tests defined by test1?

> However, I'd like to see whether upstream considers this type of usage
> well-formed and should be supported.  If not, upstream should give a
> warning on such usage, such as printing a warning when requiring other
> modules that has `ert-deftest'.  Meanwhile, an improved error message
> would also be great.

I could agree to improving the error message, but I don't see why we
should do anything beyond that, FWIW.

Adding Mattias, who added this check 2 years ago.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28  6:32 ` Eli Zaretskii
@ 2023-10-28  9:39   ` Xiyue Deng
  2023-10-28  9:48     ` Eli Zaretskii
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-10-28  9:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Mattias Engdegård, 66782

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Xiyue Deng <manphiz@gmail.com>
>> Date: Fri, 27 Oct 2023 13:59:07 -0700
>> 
>> As you can see there's only one `first-test' defined.  The error message
>> is misleading.
>> 
>> A real world example of this can be found in lsp-mode, where
>> test/lsp-clangd-test.el[1] requires test/lsp-integration-test.el[2].
>> See also the discussion on an Debian bug[3].
>
> If test2 requires test1, why are both of them explicitly run from the
> command line?  Isn't that redundant, since running test2 will also run
> the tests defined by test1?
>

IIUC most projects just run all tests without explicit dependency
detection.  For example, in lsp-mode it uses eask ert-runner to run all
tests[1].  In Debian it doesn't support cask or eask, so it also has a
custom script that detects all test files and loads them all to run
under ert[2].  In those cases the loading sequence of the test files is
random.  I think few projects actually check for such dependency, which
is not worth the trouble when the test file count is large.

On the other hand, such use is pretty rare if not wrong.  As in the case
of lsp-mode, lsp-clangd-test actually just requires lsp-integration-test
just for a macro, which could have been defined elsewhere in a helper
module and be required from both tests and the problem would be solved.

As an alternative exists, I wonder whether upstream may consider
requiring a file containing ert tests a misuse in ert tests and should
be discouraged, as it may lead to unexpected side effects depending on
loading sequence.

>> However, I'd like to see whether upstream considers this type of usage
>> well-formed and should be supported.  If not, upstream should give a
>> warning on such usage, such as printing a warning when requiring other
>> modules that has `ert-deftest'.  Meanwhile, an improved error message
>> would also be great.
>
> I could agree to improving the error message, but I don't see why we
> should do anything beyond that, FWIW.
>

This would also be better.

> Adding Mattias, who added this check 2 years ago.


[1] https://github.com/emacs-lsp/lsp-mode/blob/master/Makefile#L42
[2] https://salsa.debian.org/emacsen-team/dh-elpa/-/blob/master/dh_elpa_test#L386-396
-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28  9:39   ` bug#66782: 29.1; ERT tests report " Xiyue Deng
@ 2023-10-28  9:48     ` Eli Zaretskii
  2023-10-28 11:14       ` Xiyue Deng
  0 siblings, 1 reply; 21+ messages in thread
From: Eli Zaretskii @ 2023-10-28  9:48 UTC (permalink / raw)
  To: Xiyue Deng; +Cc: mattiase, 66782

> From: Xiyue Deng <manphiz@gmail.com>
> Cc: Mattias Engdegård <mattiase@acm.org>,
>   66782@debbugs.gnu.org
> Date: Sat, 28 Oct 2023 02:39:46 -0700
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > If test2 requires test1, why are both of them explicitly run from the
> > command line?  Isn't that redundant, since running test2 will also run
> > the tests defined by test1?
> 
> IIUC most projects just run all tests without explicit dependency
> detection.  For example, in lsp-mode it uses eask ert-runner to run all
> tests[1].

OK, but why do that in a single Emacs session?  That is unclean for
much more important reasons: some left-overs from previous tests could
affect the following tests.  IMO, each test should be run in a fresh
Emacs session, i.e. no command line should ever load more than a
single test file.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28  9:48     ` Eli Zaretskii
@ 2023-10-28 11:14       ` Xiyue Deng
  2023-10-28 11:34         ` Eli Zaretskii
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-10-28 11:14 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: mattiase, 66782

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Xiyue Deng <manphiz@gmail.com>
>> Cc: Mattias Engdegård <mattiase@acm.org>,
>>   66782@debbugs.gnu.org
>> Date: Sat, 28 Oct 2023 02:39:46 -0700
>> 
>> Eli Zaretskii <eliz@gnu.org> writes:
>> 
>> > If test2 requires test1, why are both of them explicitly run from the
>> > command line?  Isn't that redundant, since running test2 will also run
>> > the tests defined by test1?
>> 
>> IIUC most projects just run all tests without explicit dependency
>> detection.  For example, in lsp-mode it uses eask ert-runner to run all
>> tests[1].
>
> OK, but why do that in a single Emacs session?  That is unclean for
> much more important reasons: some left-overs from previous tests could
> affect the following tests.  IMO, each test should be run in a fresh
> Emacs session, i.e. no command line should ever load more than a
> single test file.

I think one reason is that doing all test in one session gives you a
nice summary of how many tests passed and which ones failed in the end.
If you run just one test per session you'll have to inspect the results
manually which could be much more time consuming for large test suites,
and plus it may be slower.

-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28 11:14       ` Xiyue Deng
@ 2023-10-28 11:34         ` Eli Zaretskii
  2023-10-28 11:50           ` Xiyue Deng
  0 siblings, 1 reply; 21+ messages in thread
From: Eli Zaretskii @ 2023-10-28 11:34 UTC (permalink / raw)
  To: Xiyue Deng; +Cc: mattiase, 66782

> From: Xiyue Deng <manphiz@gmail.com>
> Cc: mattiase@acm.org,  66782@debbugs.gnu.org
> Date: Sat, 28 Oct 2023 04:14:15 -0700
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > OK, but why do that in a single Emacs session?  That is unclean for
> > much more important reasons: some left-overs from previous tests could
> > affect the following tests.  IMO, each test should be run in a fresh
> > Emacs session, i.e. no command line should ever load more than a
> > single test file.
> 
> I think one reason is that doing all test in one session gives you a
> nice summary of how many tests passed and which ones failed in the end.
> If you run just one test per session you'll have to inspect the results
> manually which could be much more time consuming for large test suites,
> and plus it may be slower.

The usual way of doing this is to generate summary by some shell
script, which runs all the tests one by one.  Emacs is not the only
program that can count ;-)






^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28 11:34         ` Eli Zaretskii
@ 2023-10-28 11:50           ` Xiyue Deng
  2023-10-28 12:03             ` Eli Zaretskii
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-10-28 11:50 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: mattiase, 66782

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Xiyue Deng <manphiz@gmail.com>
>> Cc: mattiase@acm.org,  66782@debbugs.gnu.org
>> Date: Sat, 28 Oct 2023 04:14:15 -0700
>> 
>> Eli Zaretskii <eliz@gnu.org> writes:
>> 
>> > OK, but why do that in a single Emacs session?  That is unclean for
>> > much more important reasons: some left-overs from previous tests could
>> > affect the following tests.  IMO, each test should be run in a fresh
>> > Emacs session, i.e. no command line should ever load more than a
>> > single test file.
>> 
>> I think one reason is that doing all test in one session gives you a
>> nice summary of how many tests passed and which ones failed in the end.
>> If you run just one test per session you'll have to inspect the results
>> manually which could be much more time consuming for large test suites,
>> and plus it may be slower.
>
> The usual way of doing this is to generate summary by some shell
> script, which runs all the tests one by one.  Emacs is not the only
> program that can count ;-)
>

That also works of course, though personally I would prefer the good and
reliable `ert-summarize-tests-batch-and-exit'[1] so that I don't have to
reinvent the wheel ;-)

[1] https://www.gnu.org/software/emacs/manual/html_node/ert/Running-Tests-in-Batch-Mode.html

P.S. I also thought of another potential counter-example of preferring
running one test file over running many in one batch: the tests within
the same test file may also leave garbage for the rest of the tests, so
to avoid that we would have to prefer running one test per session (do
we have such a filter?), which may become even slower.

-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28 11:50           ` Xiyue Deng
@ 2023-10-28 12:03             ` Eli Zaretskii
  2023-10-28 12:46               ` Mattias Engdegård
  2023-10-28 19:41               ` Xiyue Deng
  0 siblings, 2 replies; 21+ messages in thread
From: Eli Zaretskii @ 2023-10-28 12:03 UTC (permalink / raw)
  To: Xiyue Deng; +Cc: mattiase, 66782

> From: Xiyue Deng <manphiz@gmail.com>
> Cc: mattiase@acm.org,  66782@debbugs.gnu.org
> Date: Sat, 28 Oct 2023 04:50:37 -0700
> 
> P.S. I also thought of another potential counter-example of preferring
> running one test file over running many in one batch: the tests within
> the same test file may also leave garbage for the rest of the tests

We could reasonably expect from the author of a single .el test file
to make sure the tests in that file don't interfere with one another
and make the necessary cleanups for that purpose.  But it is much
harder to expect the same from several disparate test files, which can
quite frequently be written and maintained by different people.





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28 12:03             ` Eli Zaretskii
@ 2023-10-28 12:46               ` Mattias Engdegård
  2023-10-28 21:19                 ` Xiyue Deng
  2023-10-28 19:41               ` Xiyue Deng
  1 sibling, 1 reply; 21+ messages in thread
From: Mattias Engdegård @ 2023-10-28 12:46 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 66782, Xiyue Deng

28 okt. 2023 kl. 14.03 skrev Eli Zaretskii <eliz@gnu.org>:

> We could reasonably expect from the author of a single .el test file
> to make sure the tests in that file don't interfere with one another
> and make the necessary cleanups for that purpose.  But it is much
> harder to expect the same from several disparate test files, which can
> quite frequently be written and maintained by different people.

I agree, and I have found this to be far from uncommon in practice.

Treating redefined test cases as errors found and still finds serious testing bugs, so we definitely want to keep the check as it is or in some equivalent form (a warning wouldn't be nearly as good).

And I also agree that the way this test runner explicitly loads .el files without any concern for whether they logically represent a single test collection or are just sub-modules for use in other tests, is quite questionable. 

I may be missing the point entirely, but what about using a file name convention like Emacs, where only *-tests.el are considered to be actual tests?







^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28 12:03             ` Eli Zaretskii
  2023-10-28 12:46               ` Mattias Engdegård
@ 2023-10-28 19:41               ` Xiyue Deng
  1 sibling, 0 replies; 21+ messages in thread
From: Xiyue Deng @ 2023-10-28 19:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: mattiase, 66782

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Xiyue Deng <manphiz@gmail.com>
>> Cc: mattiase@acm.org,  66782@debbugs.gnu.org
>> Date: Sat, 28 Oct 2023 04:50:37 -0700
>> 
>> P.S. I also thought of another potential counter-example of preferring
>> running one test file over running many in one batch: the tests within
>> the same test file may also leave garbage for the rest of the tests
>
> We could reasonably expect from the author of a single .el test file
> to make sure the tests in that file don't interfere with one another
> and make the necessary cleanups for that purpose.  But it is much
> harder to expect the same from several disparate test files, which can
> quite frequently be written and maintained by different people.

Fair enough.  And of course ideally each test should be able to run
either independently and batched together so that running everything in
batch is possible with the nice summary :-)

-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28 12:46               ` Mattias Engdegård
@ 2023-10-28 21:19                 ` Xiyue Deng
  2023-10-29 12:09                   ` Mattias Engdegård
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-10-28 21:19 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, 66782

Mattias Engdegård <mattias.engdegard@gmail.com> writes:

> 28 okt. 2023 kl. 14.03 skrev Eli Zaretskii <eliz@gnu.org>:
>
>> We could reasonably expect from the author of a single .el test file
>> to make sure the tests in that file don't interfere with one another
>> and make the necessary cleanups for that purpose.  But it is much
>> harder to expect the same from several disparate test files, which can
>> quite frequently be written and maintained by different people.
>
> I agree, and I have found this to be far from uncommon in practice.
>
> Treating redefined test cases as errors found and still finds serious testing
> bugs, so we definitely want to keep the check as it is or in some equivalent
> form (a warning wouldn't be nearly as good).
>

I also agree, and I would definitely keep the current check.  At the
very least, duplicated test name makes identifying failed tests harder.

> And I also agree that the way this test runner explicitly loads .el files
> without any concern for whether they logically represent a single test
> collection or are just sub-modules for use in other tests, is quite
> questionable.
>

Exactly.

> I may be missing the point entirely, but what about using a file name convention
> like Emacs, where only *-tests.el are considered to be actual tests?
>

Which is why I'm asking for upstream stance on whether it will consider
requiring other test modules as well-formed.  To clarify one of my
original proposals: if it makes no sense for a `ert-deftest' to depend
on other `ert-deftest', I would say there is no reason for such a
dependency, and people should move reusable components to a helper
module instead.  And of course a better error message such as forbidding
such requires would be better.

Wdyt?

>

-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-28 21:19                 ` Xiyue Deng
@ 2023-10-29 12:09                   ` Mattias Engdegård
  2023-10-29 21:53                     ` Xiyue Deng
  0 siblings, 1 reply; 21+ messages in thread
From: Mattias Engdegård @ 2023-10-29 12:09 UTC (permalink / raw)
  To: Xiyue Deng; +Cc: Eli Zaretskii, 66782

28 okt. 2023 kl. 23.19 skrev Xiyue Deng <manphiz@gmail.com>:

> To clarify one of my
> original proposals: if it makes no sense for a `ert-deftest' to depend
> on other `ert-deftest', I would say there is no reason for such a
> dependency, and people should move reusable components to a helper
> module instead.

There is no reason for one `ert-deftest` to make use of another, but was that the case here? I interpreted it as a test suite that spread its `ert-deftest` definitions over multiple .el files which isn't necessarily a bad way of organising them.

As said before, there is little sense in including the same individual tests from multiple 'root' .el files since that would run them more than once.

Perhaps that is what you meant? If so, please forgive me for the pedantry.






^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-29 12:09                   ` Mattias Engdegård
@ 2023-10-29 21:53                     ` Xiyue Deng
  2023-10-30 12:04                       ` Mattias Engdegård
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-10-29 21:53 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, 66782

Mattias Engdegård <mattias.engdegard@gmail.com> writes:

> 28 okt. 2023 kl. 23.19 skrev Xiyue Deng <manphiz@gmail.com>:
>
>> To clarify one of my
>> original proposals: if it makes no sense for a `ert-deftest' to depend
>> on other `ert-deftest', I would say there is no reason for such a
>> dependency, and people should move reusable components to a helper
>> module instead.
>
> There is no reason for one `ert-deftest` to make use of another, but was that
> the case here? I interpreted it as a test suite that spread its `ert-deftest`
> definitions over multiple .el files which isn't necessarily a bad way of
> organising them.
>

As they just use eask to run all tests under folder test in their
Makefile[1], I don't think spreading definitions is what they are doing.
To clarify, I think instead they are requiring lsp-integration-test just
because they want use the `lsp-test-wait' macro[2] in
lsp-clangd-test[3][4][5], which could have been done by putting those
macros in a separate file and requiring that from both tests.

> As said before, there is little sense in including the same individual tests from multiple 'root' .el files since that would run them more than once.
>
> Perhaps that is what you meant? If so, please forgive me for the pedantry.
>

Exactly, and no worries.

As far as I know, there is no practical use for a test case to depend on
another test case in any language I worked with as a test case provides
no reusable component.  On the other hand, there are alternatives that
makes more sense to do what they (e.g. lsp-mode) are doing.  Again, IMHO
I think it makes sense for ERT not to support it or to even forbid it.
Doing this also avoids such misleading error message I was reporting,
which got triggered depending on the loading sequence which may make
test suites flaky (as the loading sequence is not deterministic).

[1] https://github.com/emacs-lsp/lsp-mode/blob/master/Makefile#L42
[2] https://github.com/emacs-lsp/lsp-mode/blob/master/test/lsp-integration-test.el#L51
[3] https://github.com/emacs-lsp/lsp-mode/blob/master/test/lsp-clangd-test.el#L109
[4] https://github.com/emacs-lsp/lsp-mode/blob/master/test/lsp-clangd-test.el#L118
[5] https://github.com/emacs-lsp/lsp-mode/blob/master/test/lsp-clangd-test.el#L141

-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-29 21:53                     ` Xiyue Deng
@ 2023-10-30 12:04                       ` Mattias Engdegård
  2023-10-30 20:47                         ` Xiyue Deng
  0 siblings, 1 reply; 21+ messages in thread
From: Mattias Engdegård @ 2023-10-30 12:04 UTC (permalink / raw)
  To: Xiyue Deng; +Cc: Eli Zaretskii, 66782

29 okt. 2023 kl. 22.53 skrev Xiyue Deng <manphiz@gmail.com>:

> As far as I know, there is no practical use for a test case to depend on
> another test case in any language I worked with as a test case provides
> no reusable component.  On the other hand, there are alternatives that
> makes more sense to do what they (e.g. lsp-mode) are doing.  Again, IMHO
> I think it makes sense for ERT not to support it or to even forbid it.
> Doing this also avoids such misleading error message I was reporting,
> which got triggered depending on the loading sequence which may make
> test suites flaky (as the loading sequence is not deterministic).

I don't think ERT can forbid anyone from loading in the same .el file multiple times because it's none of its business. Or did you have something else in mind?

All in all, I'm not sure there is anything that we can do in Emacs right now that would help, but if you have any concrete suggestions, do tell.






^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-30 12:04                       ` Mattias Engdegård
@ 2023-10-30 20:47                         ` Xiyue Deng
  2023-11-02 17:17                           ` Xiyue Deng
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-10-30 20:47 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, 66782

Mattias Engdegård <mattias.engdegard@gmail.com> writes:

> 29 okt. 2023 kl. 22.53 skrev Xiyue Deng <manphiz@gmail.com>:
>
>> As far as I know, there is no practical use for a test case to depend on
>> another test case in any language I worked with as a test case provides
>> no reusable component.  On the other hand, there are alternatives that
>> makes more sense to do what they (e.g. lsp-mode) are doing.  Again, IMHO
>> I think it makes sense for ERT not to support it or to even forbid it.
>> Doing this also avoids such misleading error message I was reporting,
>> which got triggered depending on the loading sequence which may make
>> test suites flaky (as the loading sequence is not deterministic).
>
> I don't think ERT can forbid anyone from loading in the same .el file multiple times because it's none of its business. Or did you have something else in mind?
>

It's not that loading the same .el multiple times that caused this
error, but loading a module with `ert-deftest' and both .el modules are
passed to batch ert processing which is common practice.  But see below.

> All in all, I'm not sure there is anything that we can do in Emacs right now that would help, but if you have any concrete suggestions, do tell.
>

I understand if upstream don't want to complicate `require' logic too
much.  However I wonder whether it's OK to add warning if a required
module has `ert-deftest' in it, so that it can help people identify that
a `Test "foo" redefined' error is due to requiring other module instead
of an actual duplicated test name.  How does this sound?

-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-10-30 20:47                         ` Xiyue Deng
@ 2023-11-02 17:17                           ` Xiyue Deng
  2023-11-02 18:56                             ` Mattias Engdegård
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-11-02 17:17 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, 66782

[-- Attachment #1: Type: text/plain, Size: 1978 bytes --]

Xiyue Deng <manphiz@gmail.com> writes:

> Mattias Engdegård <mattias.engdegard@gmail.com> writes:
>
>> 29 okt. 2023 kl. 22.53 skrev Xiyue Deng <manphiz@gmail.com>:
>>
>>> As far as I know, there is no practical use for a test case to depend on
>>> another test case in any language I worked with as a test case provides
>>> no reusable component.  On the other hand, there are alternatives that
>>> makes more sense to do what they (e.g. lsp-mode) are doing.  Again, IMHO
>>> I think it makes sense for ERT not to support it or to even forbid it.
>>> Doing this also avoids such misleading error message I was reporting,
>>> which got triggered depending on the loading sequence which may make
>>> test suites flaky (as the loading sequence is not deterministic).
>>
>> I don't think ERT can forbid anyone from loading in the same .el file multiple times because it's none of its business. Or did you have something else in mind?
>>
>
> It's not that loading the same .el multiple times that caused this
> error, but loading a module with `ert-deftest' and both .el modules are
> passed to batch ert processing which is common practice.  But see below.
>
>> All in all, I'm not sure there is anything that we can do in Emacs right now that would help, but if you have any concrete suggestions, do tell.
>>
>
> I understand if upstream don't want to complicate `require' logic too
> much.  However I wonder whether it's OK to add warning if a required
> module has `ert-deftest' in it, so that it can help people identify that
> a `Test "foo" redefined' error is due to requiring other module instead
> of an actual duplicated test name.  How does this sound?

As I didn't get an answer I assume this was a no-go.  So instead I'd
like to propose a slight change to the error message to mention that it
may also be caused by an ert test being loaded multiple times.  Patch is
attached, please let me know whether this works.

-- 
Xiyue Deng

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Revise-test-redefined-error-message.patch --]
[-- Type: text/x-diff, Size: 1000 bytes --]

From 4efc6a84c4bb0758d67e2721fcb479494a312d69 Mon Sep 17 00:00:00 2001
From: Xiyue Deng <manphiz@gmail.com>
Date: Thu, 2 Nov 2023 10:08:48 -0700
Subject: [PATCH] Revise test redefined error message

Add the possibility that an ert test that is loaded multiple times may
trigger the same error (Bug#66782).
* lisp/emacs-lisp/ert.el (ert-set-test): Update error message.
---
 lisp/emacs-lisp/ert.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index d727bc94ec5..4d189ed614e 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -152,7 +152,7 @@ mode.")
   (when (and noninteractive (get symbol 'ert--test))
     ;; Make sure duplicated tests are discovered since the older test would
     ;; be ignored silently otherwise.
-    (error "Test `%s' redefined" symbol))
+    (error "Test `%s' redefined or loaded multiple times" symbol))
   (define-symbol-prop symbol 'ert--test definition)
   definition)
 
-- 
2.39.2


^ permalink raw reply related	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-11-02 17:17                           ` Xiyue Deng
@ 2023-11-02 18:56                             ` Mattias Engdegård
  2023-11-02 22:00                               ` Xiyue Deng
  0 siblings, 1 reply; 21+ messages in thread
From: Mattias Engdegård @ 2023-11-02 18:56 UTC (permalink / raw)
  To: Xiyue Deng; +Cc: Eli Zaretskii, 66782

2 nov. 2023 kl. 18.17 skrev Xiyue Deng <manphiz@gmail.com>:

>> I understand if upstream don't want to complicate `require' logic too
>> much.  However I wonder whether it's OK to add warning if a required
>> module has `ert-deftest' in it, so that it can help people identify that
>> a `Test "foo" redefined' error is due to requiring other module instead
>> of an actual duplicated test name.  How does this sound?
> 
> As I didn't get an answer I assume this was a no-go.

No, please don't make such an assumption -- I was just busy elsewhere and hadn't given your message the attention it deserved. Sorry about that.

That said, in this case I'm not sure how to implement your suggestion in a clean way and if all that effort is really worth the trouble, so perhaps the answer would be the same anyway. And we probably don't want to prohibit `ert-deftest` in  required modules in general for reasons mentioned -- they could be used with perfectly fine discipline elsewhere.

>  So instead I'd
> like to propose a slight change to the error message to mention that it
> may also be caused by an ert test being loaded multiple times.  Patch is
> attached, please let me know whether this works.

I wouldn't mind such a change if it really would help. Would it? Isn't it just restating the problem in other words?







^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-11-02 18:56                             ` Mattias Engdegård
@ 2023-11-02 22:00                               ` Xiyue Deng
  2023-11-03 17:14                                 ` Mattias Engdegård
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-11-02 22:00 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, 66782

Hi Mattias,

Mattias Engdegård <mattias.engdegard@gmail.com> writes:

> 2 nov. 2023 kl. 18.17 skrev Xiyue Deng <manphiz@gmail.com>:
>
>>> I understand if upstream don't want to complicate `require' logic too
>>> much.  However I wonder whether it's OK to add warning if a required
>>> module has `ert-deftest' in it, so that it can help people identify that
>>> a `Test "foo" redefined' error is due to requiring other module instead
>>> of an actual duplicated test name.  How does this sound?
>> 
>> As I didn't get an answer I assume this was a no-go.
>
> No, please don't make such an assumption -- I was just busy elsewhere and hadn't given your message the attention it deserved. Sorry about that.
>

Sorry if I sounded pushy which I didn't intend to, ...

> That said, in this case I'm not sure how to implement your suggestion in a clean
> way and if all that effort is really worth the trouble, so perhaps the answer
> would be the same anyway. And we probably don't want to prohibit `ert-deftest`
> in required modules in general for reasons mentioned -- they could be used with
> perfectly fine discipline elsewhere.
>

And glad we are in agreement here, as I realizing adding this extra
checking to require may add some unnecessary complexity.

>>  So instead I'd
>> like to propose a slight change to the error message to mention that it
>> may also be caused by an ert test being loaded multiple times.  Patch is
>> attached, please let me know whether this works.
>
> I wouldn't mind such a change if it really would help. Would it? Isn't it just restating the problem in other words?
>

Let me clarify my intent, which is trying to do is to distinguish the
two possible scenarios that cause this error:

1) Tests that are different but use the same test name.

2) There is no tests sharing the same name, but caused by double loading
the same test unit through a dependency by require.

Case 1 happens a lot in the wild and has caused many FTBFS bugs in
Debian after upgrading Emacs to 29.1 (e.g. [1][2]), and the fix is
simply to rename the tests.

Case 2 is kinda tricky as there are no tests actually sharing a name
here.  See also in [3], which had many test with same name as in case 1
but for the specific error on `lsp-text-document-hover-request' it's
actually case 2.  As a matter of fact I've spent a non-trivial time
trying to debug this one as it depends on the loading sequence which
caused the failure to be flaky.  So I hope my proposed change can help
people on realizing that it's case 2 a bit faster.

>

[1] https://bugs.debian.org/1052865
[2] https://bugs.debian.org/1052922
[3] https://bugs.debian.org/1052939

-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-11-02 22:00                               ` Xiyue Deng
@ 2023-11-03 17:14                                 ` Mattias Engdegård
  2023-11-03 17:56                                   ` Xiyue Deng
  0 siblings, 1 reply; 21+ messages in thread
From: Mattias Engdegård @ 2023-11-03 17:14 UTC (permalink / raw)
  To: Xiyue Deng; +Cc: Eli Zaretskii, 66782-done

2 nov. 2023 kl. 23.00 skrev Xiyue Deng <manphiz@gmail.com>:

> 1) Tests that are different but use the same test name.
> 
> 2) There is no tests sharing the same name, but caused by double loading
> the same test unit through a dependency by require.
> 
> Case 1 happens a lot in the wild and has caused many FTBFS bugs in
> Debian after upgrading Emacs to 29.1 (e.g. [1][2]), and the fix is
> simply to rename the tests.

Thank you, I'm happy to hear that the check actually caught the kind of errors it was supposed to find.

> As a matter of fact I've spent a non-trivial time
> trying to debug this one as it depends on the loading sequence which
> caused the failure to be flaky.  So I hope my proposed change can help
> people on realizing that it's case 2 a bit faster.

That's fine, adding something like what you suggested doesn't cost us anything: now done on master (425d23fbea).

I'm closing the bug now, but do say if there is something I forgot.






^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-11-03 17:14                                 ` Mattias Engdegård
@ 2023-11-03 17:56                                   ` Xiyue Deng
  2023-11-04  8:51                                     ` Eli Zaretskii
  0 siblings, 1 reply; 21+ messages in thread
From: Xiyue Deng @ 2023-11-03 17:56 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Eli Zaretskii, 66782-done

Mattias Engdegård <mattias.engdegard@gmail.com> writes:

> 2 nov. 2023 kl. 23.00 skrev Xiyue Deng <manphiz@gmail.com>:
>
>> 1) Tests that are different but use the same test name.
>> 
>> 2) There is no tests sharing the same name, but caused by double loading
>> the same test unit through a dependency by require.
>> 
>> Case 1 happens a lot in the wild and has caused many FTBFS bugs in
>> Debian after upgrading Emacs to 29.1 (e.g. [1][2]), and the fix is
>> simply to rename the tests.
>
> Thank you, I'm happy to hear that the check actually caught the kind of errors it was supposed to find.
>
>> As a matter of fact I've spent a non-trivial time
>> trying to debug this one as it depends on the loading sequence which
>> caused the failure to be flaky.  So I hope my proposed change can help
>> people on realizing that it's case 2 a bit faster.
>
> That's fine, adding something like what you suggested doesn't cost us anything: now done on master (425d23fbea).
>
> I'm closing the bug now, but do say if there is something I forgot.
>

Thanks Mattias!  Would be better if this can be applied to 29 branch as
well now that 29.2 is around the corner :-)

-- 
Xiyue Deng





^ permalink raw reply	[flat|nested] 21+ messages in thread

* bug#66782: 29.1; ERT tests report test redefined depending on loading sequence
  2023-11-03 17:56                                   ` Xiyue Deng
@ 2023-11-04  8:51                                     ` Eli Zaretskii
  0 siblings, 0 replies; 21+ messages in thread
From: Eli Zaretskii @ 2023-11-04  8:51 UTC (permalink / raw)
  To: Xiyue Deng; +Cc: mattias.engdegard, 66782-done

> From: Xiyue Deng <manphiz@gmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>,  66782-done@debbugs.gnu.org
> Date: Fri, 03 Nov 2023 10:56:00 -0700
> 
> Mattias Engdegård <mattias.engdegard@gmail.com> writes:
> 
> > That's fine, adding something like what you suggested doesn't cost us anything: now done on master (425d23fbea).
> >
> > I'm closing the bug now, but do say if there is something I forgot.
> >
> 
> Thanks Mattias!  Would be better if this can be applied to 29 branch as
> well now that 29.2 is around the corner :-)

I cherry-picked the change to the emacs-29 branch.





^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2023-11-04  8:51 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-27 20:59 bug#66782: 29.1; ERT tests reports test redefined depending on loading sequence Xiyue Deng
2023-10-28  6:32 ` Eli Zaretskii
2023-10-28  9:39   ` bug#66782: 29.1; ERT tests report " Xiyue Deng
2023-10-28  9:48     ` Eli Zaretskii
2023-10-28 11:14       ` Xiyue Deng
2023-10-28 11:34         ` Eli Zaretskii
2023-10-28 11:50           ` Xiyue Deng
2023-10-28 12:03             ` Eli Zaretskii
2023-10-28 12:46               ` Mattias Engdegård
2023-10-28 21:19                 ` Xiyue Deng
2023-10-29 12:09                   ` Mattias Engdegård
2023-10-29 21:53                     ` Xiyue Deng
2023-10-30 12:04                       ` Mattias Engdegård
2023-10-30 20:47                         ` Xiyue Deng
2023-11-02 17:17                           ` Xiyue Deng
2023-11-02 18:56                             ` Mattias Engdegård
2023-11-02 22:00                               ` Xiyue Deng
2023-11-03 17:14                                 ` Mattias Engdegård
2023-11-03 17:56                                   ` Xiyue Deng
2023-11-04  8:51                                     ` Eli Zaretskii
2023-10-28 19:41               ` Xiyue Deng

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.