GNU bug report logs - #79168
30.1; Proposed changes for oauth2

Previous Next

Package: emacs;

Reported by: Xiyue Deng <manphiz <at> gmail.com>

Date: Mon, 4 Aug 2025 00:00:01 UTC

Severity: normal

Found in version 30.1

Done: Sean Whitton <spwhitton <at> spwhitton.name>

To reply to this bug, email your comments to 79168 AT debbugs.gnu.org.
There is no need to reopen the bug first.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:00:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Xiyue Deng <manphiz <at> gmail.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Mon, 04 Aug 2025 00:00:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: 30.1; Proposed changes for oauth2
Date: Sun, 03 Aug 2025 16:58:52 -0700
[Message part 1 (text/plain, inline)]
Hi,

I have worked on a series of patches for oauth2.  This includes the
following improvements:

* Code cleanup and small fixes.
* Support reusing cached tokens before expiration.
* Close plstore file after use
  - To avoid being modified by other means while Emacs is accessing an
    outdated buffer.

I plan to send the patches through git-send-email, so this email is to
create the bug and the patches will be sent through a series of future
emails.




In GNU Emacs 30.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.38,
 cairo version 1.16.0) of 2025-04-04, modified by Debian built on sbuild
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/30.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/30.1/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --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/30.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/30.1/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils --with-cairo
 --with-x=yes --with-x-toolkit=gtk3 --with-toolkit-scroll-bars
 'CFLAGS=-g -O2
 -ffile-prefix-map=/build/reproducible-path/emacs-30.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
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/l

Minor modes in effect:
  flyspell-mode: t
  rcirc-track-minor-mode: t
  server-mode: t
  subword-mode: t
  bug-reference-prog-mode: t
  whitespace-mode: t
  xclip-mode: t
  treemacs-project-follow-mode: t
  treemacs-follow-mode: t
  treemacs-git-mode: t
  treemacs-fringe-indicator-mode: t
  auth-source-xoauth2-plugin-mode: t
  activities-tabs-mode: t
  activities-mode: t
  fido-vertical-mode: t
  icomplete-vertical-mode: t
  icomplete-mode: t
  fido-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
  tab-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  minibuffer-regexp-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/magit-4.3.6/magit-dired hides /home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-dired
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-autorevert hides /home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-autorevert
/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/cmake-mode-4.0.2/cmake-mode hides /usr/share/emacs/site-lisp/elpa/cmake-mode-3.25.1/cmake-mode
/home/xiyueden/.config/emacs/elpa/cmake-mode-4.0.2/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-4.0.2/cmake-mode-pkg hides /usr/share/emacs/site-lisp/elpa/cmake-mode-3.25.1/cmake-mode-pkg
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-pkg hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-pkg
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-dabbrev hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-dabbrev
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-files hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-files
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-abbrev hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-abbrev
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-capf hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-capf
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-clang hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-clang
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-yasnippet hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-yasnippet
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-ispell hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-ispell
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-cmake hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-cmake
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-dabbrev-code hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-dabbrev-code
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-etags hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-etags
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-template hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-template
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-css hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-css
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-oddmuse hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-oddmuse
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-bbdb hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-bbdb
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-tempo hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-tempo
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-tng hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-tng
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-nxml hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-nxml
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-gtags hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-gtags
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-autoloads hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-autoloads
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-keywords hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-keywords
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-semantic hides /usr/share/emacs/site-lisp/elpa/company-0.9.13/company-semantic
/home/xiyueden/.config/emacs/elpa/csv-mode-1.27/csv-mode hides /usr/share/emacs/site-lisp/elpa/csv-mode-1.22/csv-mode
/home/xiyueden/.config/emacs/elpa/csv-mode-1.27/csv-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/csv-mode-1.22/csv-mode-autoloads
/home/xiyueden/.config/emacs/elpa/csv-mode-1.27/csv-mode-tests hides /usr/share/emacs/site-lisp/elpa/csv-mode-1.22/csv-mode-tests
/home/xiyueden/.config/emacs/elpa/csv-mode-1.27/csv-mode-pkg hides /usr/share/emacs/site-lisp/elpa/csv-mode-1.22/csv-mode-pkg
/home/xiyueden/.config/emacs/elpa/dash-2.20.0/dash hides /usr/share/emacs/site-lisp/elpa/dash-2.19.1/dash
/home/xiyueden/.config/emacs/elpa/dash-2.20.0/dash-pkg hides /usr/share/emacs/site-lisp/elpa/dash-2.19.1/dash-pkg
/home/xiyueden/.config/emacs/elpa/dash-2.20.0/dash-autoloads hides /usr/share/emacs/site-lisp/elpa/dash-2.19.1/dash-autoloads
/home/xiyueden/.config/emacs/elpa/dockerfile-mode-1.9/dockerfile-mode hides /usr/share/emacs/site-lisp/elpa/dockerfile-mode-1.7/dockerfile-mode
/home/xiyueden/.config/emacs/elpa/dockerfile-mode-1.9/dockerfile-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/dockerfile-mode-1.7/dockerfile-mode-autoloads
/home/xiyueden/.config/emacs/elpa/dockerfile-mode-1.9/dockerfile-mode-pkg hides /usr/share/emacs/site-lisp/elpa/dockerfile-mode-1.7/dockerfile-mode-pkg
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/xml-query hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/xml-query
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-search hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-search
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-db hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-db
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-lib hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-lib
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-log hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-log
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-csv hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-csv
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-pkg hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-pkg
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-curl hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-curl
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-show hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-show
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-link hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-link
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-autoloads hides /usr/share/emacs/site-lisp/elpa/elfeed-3.4.1/elfeed-autoloads
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-digraphs hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-digraphs
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-repeat hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-repeat
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-vars hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-vars
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-states hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-states
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-keybindings hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-keybindings
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-pkg hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-pkg
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-ex hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-ex
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-core hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-core
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-search hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-search
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-integration hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-integration
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-jumps hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-jumps
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-maps hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-maps
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-commands hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-commands
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-command-window hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-command-window
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-common hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-common
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-macros hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-macros
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-autoloads hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-autoloads
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-types hides /usr/share/emacs/site-lisp/elpa/evil-1.14.2/evil-types
/home/xiyueden/.config/emacs/elpa/exec-path-from-shell-2.2/exec-path-from-shell hides /usr/share/emacs/site-lisp/elpa/exec-path-from-shell-1.12/exec-path-from-shell
/home/xiyueden/.config/emacs/elpa/exec-path-from-shell-2.2/exec-path-from-shell-autoloads hides /usr/share/emacs/site-lisp/elpa/exec-path-from-shell-1.12/exec-path-from-shell-autoloads
/home/xiyueden/.config/emacs/elpa/exec-path-from-shell-2.2/exec-path-from-shell-pkg hides /usr/share/emacs/site-lisp/elpa/exec-path-from-shell-1.12/exec-path-from-shell-pkg
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/git-commit hides /usr/share/emacs/site-lisp/elpa/git-commit-3.3.0/git-commit
/home/xiyueden/.config/emacs/elpa/git-modes-1.4.5/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.5/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.5/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.5/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.5/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.5/gitignore-mode hides /usr/share/emacs/site-lisp/elpa/gitignore-mode-1.4.0/gitignore-mode
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/gnuplot-context hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot-context
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/gnuplot hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/gnuplot-gui hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot-gui
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/gnuplot-autoloads hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/debian-autoloads hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/debian-autoloads
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/gnuplot-pkg hides /usr/share/emacs/site-lisp/elpa/gnuplot-0.8.0/gnuplot-pkg
/home/xiyueden/.config/emacs/elpa/goto-chg-1.7.5/goto-chg hides /usr/share/emacs/site-lisp/elpa/goto-chg-1.7.3/goto-chg
/home/xiyueden/.config/emacs/elpa/goto-chg-1.7.5/goto-chg-pkg hides /usr/share/emacs/site-lisp/elpa/goto-chg-1.7.3/goto-chg-pkg
/home/xiyueden/.config/emacs/elpa/goto-chg-1.7.5/goto-chg-autoloads hides /usr/share/emacs/site-lisp/elpa/goto-chg-1.7.3/goto-chg-autoloads
/home/xiyueden/.config/emacs/elpa/lua-mode-20221027/lua-mode hides /usr/share/emacs/site-lisp/elpa/lua-mode-20210802/lua-mode
/home/xiyueden/.config/emacs/elpa/lua-mode-20221027/lua-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/lua-mode-20210802/lua-mode-autoloads
/home/xiyueden/.config/emacs/elpa/lua-mode-20221027/lua-mode-pkg hides /usr/share/emacs/site-lisp/elpa/lua-mode-20210802/lua-mode-pkg
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-ediff hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-ediff
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-remote hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-remote
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/git-rebase hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/git-rebase
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-bisect hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-bisect
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-autorevert hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-autorevert
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-log hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-log
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-margin hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-margin
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-status hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-status
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-subtree hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-subtree
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-merge hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-merge
/home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-section hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-section
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-patch hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-patch
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-commit hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-commit
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-extras hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-extras
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-autoloads hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-autoloads
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-mode hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-mode
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-files hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-files
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-stash hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-stash
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-blame hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-blame
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-repos hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-repos
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-reflog hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-reflog
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-git hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-git
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-bookmark hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-bookmark
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-submodule hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-submodule
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-apply hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-apply
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-reset hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-reset
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-core hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-core
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-gitignore hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-gitignore
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-transient hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-transient
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-push hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-push
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-worktree hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-worktree
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-branch hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-branch
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-wip hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-wip
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-notes hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-notes
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-diff hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-diff
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-fetch hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-fetch
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-tag hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-tag
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-process hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-process
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-clone hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-clone
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-refs hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-refs
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-pull hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-pull
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-pkg hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-pkg
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-sequence hides /usr/share/emacs/site-lisp/elpa/magit-3.3.0/magit-sequence
/home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-section-autoloads hides /usr/share/emacs/site-lisp/elpa/magit-section-3.3.0/magit-section-autoloads
/home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-section hides /usr/share/emacs/site-lisp/elpa/magit-section-3.3.0/magit-section
/home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-section-pkg hides /usr/share/emacs/site-lisp/elpa/magit-section-3.3.0/magit-section-pkg
/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/nginx-mode-1.1.10/nginx-mode-autoloads hides /usr/share/emacs/site-lisp/elpa/nginx-mode-1.1.9/nginx-mode-autoloads
/home/xiyueden/.config/emacs/elpa/nginx-mode-1.1.10/nginx-mode hides /usr/share/emacs/site-lisp/elpa/nginx-mode-1.1.9/nginx-mode
/home/xiyueden/.config/emacs/elpa/nginx-mode-1.1.10/nginx-mode-pkg hides /usr/share/emacs/site-lisp/elpa/nginx-mode-1.1.9/nginx-mode-pkg
/home/xiyueden/.config/emacs/elpa/vterm-20241218.331/vterm hides /usr/share/emacs/site-lisp/elpa/vterm-0.0.2/vterm
/home/xiyueden/.config/emacs/elpa/vterm-20241218.331/vterm-pkg hides /usr/share/emacs/site-lisp/elpa/vterm-0.0.2/vterm-pkg
/home/xiyueden/.config/emacs/elpa/vterm-20241218.331/vterm-autoloads hides /usr/share/emacs/site-lisp/elpa/vterm-0.0.2/vterm-autoloads
/home/xiyueden/.config/emacs/elpa/web-mode-17.3.21/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.21/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.21/web-mode hides /usr/share/emacs/site-lisp/elpa/web-mode-17.0.2/web-mode
/home/xiyueden/.config/emacs/elpa/with-editor-3.4.4/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.4.4/with-editor hides /usr/share/emacs/site-lisp/elpa/with-editor-3.0.5/with-editor
/home/xiyueden/.config/emacs/elpa/with-editor-3.4.4/with-editor-autoloads hides /usr/share/emacs/site-lisp/elpa/with-editor-3.0.5/with-editor-autoloads
/home/xiyueden/.config/emacs/elpa/xml-rpc-1.6.17/xml-rpc hides /usr/share/emacs/site-lisp/elpa/xml-rpc-1.6.16/xml-rpc
/home/xiyueden/.config/emacs/elpa/xml-rpc-1.6.17/xml-rpc-pkg hides /usr/share/emacs/site-lisp/elpa/xml-rpc-1.6.16/xml-rpc-pkg
/home/xiyueden/.config/emacs/elpa/xml-rpc-1.6.17/xml-rpc-autoloads hides /usr/share/emacs/site-lisp/elpa/xml-rpc-1.6.16/xml-rpc-autoloads
/home/xiyueden/.config/emacs/elpa/yasnippet-0.14.3/yasnippet-autoloads hides /usr/share/emacs/site-lisp/elpa/yasnippet-0.14.0/yasnippet-autoloads
/home/xiyueden/.config/emacs/elpa/yasnippet-0.14.3/yasnippet-pkg hides /usr/share/emacs/site-lisp/elpa/yasnippet-0.14.0/yasnippet-pkg
/home/xiyueden/.config/emacs/elpa/yasnippet-0.14.3/yasnippet hides /usr/share/emacs/site-lisp/elpa/yasnippet-0.14.0/yasnippet
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20250507.2002/yasnippet-snippets hides /usr/share/emacs/site-lisp/elpa/yasnippet-snippets-20220713/yasnippet-snippets
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20250507.2002/yasnippet-snippets-pkg hides /usr/share/emacs/site-lisp/elpa/yasnippet-snippets-20220713/yasnippet-snippets-pkg
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20250507.2002/yasnippet-snippets-autoloads hides /usr/share/emacs/site-lisp/elpa/yasnippet-snippets-20220713/yasnippet-snippets-autoloads
/usr/share/emacs/site-lisp/elpa/ace-window-0.10.0/ace-window-autoloads hides /usr/share/emacs/site-lisp/elpa-src/ace-window-0.10.0/ace-window-autoloads
/usr/share/emacs/site-lisp/elpa/ace-window-0.10.0/ace-window-pkg hides /usr/share/emacs/site-lisp/elpa-src/ace-window-0.10.0/ace-window-pkg
/usr/share/emacs/site-lisp/elpa/ace-window-0.10.0/ace-window hides /usr/share/emacs/site-lisp/elpa-src/ace-window-0.10.0/ace-window
/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/avy-0.5.0/avy hides /usr/share/emacs/site-lisp/elpa-src/avy-0.5.0/avy
/usr/share/emacs/site-lisp/elpa/avy-0.5.0/avy-autoloads hides /usr/share/emacs/site-lisp/elpa-src/avy-0.5.0/avy-autoloads
/usr/share/emacs/site-lisp/elpa/avy-0.5.0/avy-pkg hides /usr/share/emacs/site-lisp/elpa-src/avy-0.5.0/avy-pkg
/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
/home/xiyueden/.config/emacs/elpa/cmake-mode-4.0.2/cmake-mode hides /usr/share/emacs/site-lisp/elpa-src/cmake-mode-3.25.1/cmake-mode
/home/xiyueden/.config/emacs/elpa/cmake-mode-4.0.2/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-4.0.2/cmake-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/cmake-mode-3.25.1/cmake-mode-pkg
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-capf hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-capf
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-yasnippet hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-yasnippet
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-ispell hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-ispell
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-etags hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-etags
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-template hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-template
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-abbrev hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-abbrev
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-dabbrev-code hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-dabbrev-code
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-pkg hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-pkg
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-clang hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-clang
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-nxml hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-nxml
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-gtags hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-gtags
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-autoloads hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-autoloads
/home/xiyueden/.config/emacs/elpa/company-1.0.2/company-cmake hides /usr/share/emacs/site-lisp/elpa-src/company-0.9.13/company-cmake
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/company-1.0.2/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
/home/xiyueden/.config/emacs/elpa/csv-mode-1.27/csv-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/csv-mode-1.22/csv-mode-autoloads
/home/xiyueden/.config/emacs/elpa/csv-mode-1.27/csv-mode hides /usr/share/emacs/site-lisp/elpa-src/csv-mode-1.22/csv-mode
/home/xiyueden/.config/emacs/elpa/csv-mode-1.27/csv-mode-tests hides /usr/share/emacs/site-lisp/elpa-src/csv-mode-1.22/csv-mode-tests
/home/xiyueden/.config/emacs/elpa/csv-mode-1.27/csv-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/csv-mode-1.22/csv-mode-pkg
/home/xiyueden/.config/emacs/elpa/dash-2.20.0/dash hides /usr/share/emacs/site-lisp/elpa-src/dash-2.19.1/dash
/home/xiyueden/.config/emacs/elpa/dash-2.20.0/dash-pkg hides /usr/share/emacs/site-lisp/elpa-src/dash-2.19.1/dash-pkg
/home/xiyueden/.config/emacs/elpa/dash-2.20.0/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.19/debian-el-autoloads hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/debian-el-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/apt-sources hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/apt-sources
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/debian-bug hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/debian-bug
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/apt-utils hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/apt-utils
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/apt-deb822-sources hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/apt-deb822-sources
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/debian-el-pkg hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/debian-el-pkg
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/debian-autoloads hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/debian-autoloads
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/gnus-BTS hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/gnus-BTS
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/deb-view hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/deb-view
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/debian-el hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/debian-el
/usr/share/emacs/site-lisp/elpa/debian-el-37.19/preseed hides /usr/share/emacs/site-lisp/elpa-src/debian-el-37.19/preseed
/usr/share/emacs/site-lisp/elpa/debpaste-0.1.5/debpaste hides /usr/share/emacs/site-lisp/elpa-src/debpaste-0.1.5/debpaste
/usr/share/emacs/site-lisp/elpa/debpaste-0.1.5/debpaste-pkg hides /usr/share/emacs/site-lisp/elpa-src/debpaste-0.1.5/debpaste-pkg
/usr/share/emacs/site-lisp/elpa/debpaste-0.1.5/debpaste-autoloads hides /usr/share/emacs/site-lisp/elpa-src/debpaste-0.1.5/debpaste-autoloads
/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/dockerfile-mode-1.9/dockerfile-mode hides /usr/share/emacs/site-lisp/elpa-src/dockerfile-mode-1.7/dockerfile-mode
/home/xiyueden/.config/emacs/elpa/dockerfile-mode-1.9/dockerfile-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/dockerfile-mode-1.7/dockerfile-mode-autoloads
/home/xiyueden/.config/emacs/elpa/dockerfile-mode-1.9/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.19/debian-bts-control hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/debian-bts-control
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/debian-changelog-mode hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/debian-changelog-mode
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/debian-autopkgtest-control-mode hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/debian-autopkgtest-control-mode
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/dpkg-dev-el-autoloads hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/dpkg-dev-el-autoloads
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/dpkg-dev-el-pkg hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/dpkg-dev-el-pkg
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/dpkg-dev-el hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/dpkg-dev-el
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/debian-control-mode hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/debian-control-mode
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/debian-copyright hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/debian-copyright
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/dpkg-dev-common-utils hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/dpkg-dev-common-utils
/usr/share/emacs/site-lisp/elpa/dpkg-dev-el-37.19/readme-debian hides /usr/share/emacs/site-lisp/elpa-src/dpkg-dev-el-37.19/readme-debian
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-search hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-search
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-lib hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-lib
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-log hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-log
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-db hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-db
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/xml-query hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/xml-query
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-csv hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-csv
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-pkg hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-pkg
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-curl hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-curl
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-link hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-link
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-autoloads hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-autoloads
/home/xiyueden/.config/emacs/elpa/elfeed-3.4.2/elfeed-show hides /usr/share/emacs/site-lisp/elpa-src/elfeed-3.4.1/elfeed-show
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-repeat hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-repeat
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-vars hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-vars
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-states hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-states
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-keybindings hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-keybindings
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-pkg hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-pkg
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-search hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-search
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-integration hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-integration
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-digraphs hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-digraphs
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-commands hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-commands
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-jumps hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-jumps
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-autoloads hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-autoloads
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-types hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-types
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-core hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-core
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-macros hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-macros
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-maps hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-maps
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-common hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-common
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-command-window hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-command-window
/home/xiyueden/.config/emacs/elpa/evil-1.15.0/evil-ex hides /usr/share/emacs/site-lisp/elpa-src/evil-1.14.2/evil-ex
/home/xiyueden/.config/emacs/elpa/exec-path-from-shell-2.2/exec-path-from-shell hides /usr/share/emacs/site-lisp/elpa-src/exec-path-from-shell-1.12/exec-path-from-shell
/home/xiyueden/.config/emacs/elpa/exec-path-from-shell-2.2/exec-path-from-shell-autoloads hides /usr/share/emacs/site-lisp/elpa-src/exec-path-from-shell-1.12/exec-path-from-shell-autoloads
/home/xiyueden/.config/emacs/elpa/exec-path-from-shell-2.2/exec-path-from-shell-pkg hides /usr/share/emacs/site-lisp/elpa-src/exec-path-from-shell-1.12/exec-path-from-shell-pkg
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/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.5/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.5/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.5/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.5/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.5/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.5/gitignore-mode hides /usr/share/emacs/site-lisp/elpa-src/gitignore-mode-1.4.0/gitignore-mode
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/gnuplot hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/gnuplot
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/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.19/debian-autoloads hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/debian-autoloads
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/gnuplot-pkg hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/gnuplot-pkg
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/gnuplot-context hides /usr/share/emacs/site-lisp/elpa-src/gnuplot-0.8.0/gnuplot-context
/home/xiyueden/.config/emacs/elpa/gnuplot-0.10/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
/home/xiyueden/.config/emacs/elpa/goto-chg-1.7.5/goto-chg hides /usr/share/emacs/site-lisp/elpa-src/goto-chg-1.7.3/goto-chg
/home/xiyueden/.config/emacs/elpa/goto-chg-1.7.5/goto-chg-pkg hides /usr/share/emacs/site-lisp/elpa-src/goto-chg-1.7.3/goto-chg-pkg
/home/xiyueden/.config/emacs/elpa/goto-chg-1.7.5/goto-chg-autoloads hides /usr/share/emacs/site-lisp/elpa-src/goto-chg-1.7.3/goto-chg-autoloads
/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
/home/xiyueden/.config/emacs/elpa/lua-mode-20221027/lua-mode hides /usr/share/emacs/site-lisp/elpa-src/lua-mode-20210802/lua-mode
/home/xiyueden/.config/emacs/elpa/lua-mode-20221027/lua-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/lua-mode-20210802/lua-mode-autoloads
/usr/share/emacs/site-lisp/elpa/lua-mode-20210802/init-tryout hides /usr/share/emacs/site-lisp/elpa-src/lua-mode-20210802/init-tryout
/home/xiyueden/.config/emacs/elpa/lua-mode-20221027/lua-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/lua-mode-20210802/lua-mode-pkg
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-remote hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-remote
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/git-rebase hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/git-rebase
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-bisect hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-bisect
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-margin hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-margin
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-merge hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-merge
/home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-section hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-section
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-patch hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-patch
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-commit hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-commit
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-autoloads hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-autoloads
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-files hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-files
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-stash hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-stash
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-bookmark hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-bookmark
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-submodule hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-submodule
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-apply hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-apply
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-repos hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-repos
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-core hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-core
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-subtree hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-subtree
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-autorevert hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-autorevert
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-gitignore hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-gitignore
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-transient hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-transient
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-extras hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-extras
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-git hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-git
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-notes hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-notes
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-reflog hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-reflog
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-mode hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-mode
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-push hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-push
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-tag hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-tag
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-process hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-process
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-ediff hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-ediff
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/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
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-diff hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-diff
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-clone hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-clone
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/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
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-wip hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-wip
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-branch hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-branch
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-pull hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-pull
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-reset hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-reset
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-sequence hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-sequence
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-status hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-status
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/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
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-fetch hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-fetch
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-worktree hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-worktree
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-blame hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-blame
/home/xiyueden/.config/emacs/elpa/magit-4.3.6/magit-pkg hides /usr/share/emacs/site-lisp/elpa-src/magit-3.3.0/magit-pkg
/home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-section-autoloads hides /usr/share/emacs/site-lisp/elpa-src/magit-section-3.3.0/magit-section-autoloads
/home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-section hides /usr/share/emacs/site-lisp/elpa-src/magit-section-3.3.0/magit-section
/home/xiyueden/.config/emacs/elpa/magit-section-4.3.6/magit-section-pkg hides /usr/share/emacs/site-lisp/elpa-src/magit-section-3.3.0/magit-section-pkg
/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
/home/xiyueden/.config/emacs/elpa/nginx-mode-1.1.10/nginx-mode-autoloads hides /usr/share/emacs/site-lisp/elpa-src/nginx-mode-1.1.9/nginx-mode-autoloads
/home/xiyueden/.config/emacs/elpa/nginx-mode-1.1.10/nginx-mode-pkg hides /usr/share/emacs/site-lisp/elpa-src/nginx-mode-1.1.9/nginx-mode-pkg
/home/xiyueden/.config/emacs/elpa/nginx-mode-1.1.10/nginx-mode hides /usr/share/emacs/site-lisp/elpa-src/nginx-mode-1.1.9/nginx-mode
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-query hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-query
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-jump hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-jump
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-autoloads hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-autoloads
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-show hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-show
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-maildir-fcc hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-maildir-fcc
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-wash hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-wash
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-draft hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-draft
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-mua hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-mua
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-compat hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-compat
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-parser hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-parser
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-tree hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-tree
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-pkg hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-pkg
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/coolj hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/coolj
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-message hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-message
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-address hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-address
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-version hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-version
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-tag hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-tag
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-crypto hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-crypto
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-lib hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-lib
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-print hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-print
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-hello hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-hello
/usr/share/emacs/site-lisp/elpa/notmuch-0.39/notmuch-company hides /usr/share/emacs/site-lisp/elpa-src/notmuch-0.39/notmuch-company
/usr/share/emacs/site-lisp/elpa/oauth2-0.17/oauth2 hides /usr/share/emacs/site-lisp/elpa-src/oauth2-0.17/oauth2
/usr/share/emacs/site-lisp/elpa/oauth2-0.17/oauth2-autoloads hides /usr/share/emacs/site-lisp/elpa-src/oauth2-0.17/oauth2-autoloads
/usr/share/emacs/site-lisp/elpa/oauth2-0.17/oauth2-pkg hides /usr/share/emacs/site-lisp/elpa-src/oauth2-0.17/oauth2-pkg
/usr/share/emacs/site-lisp/elpa/paredit-26/paredit-autoloads hides /usr/share/emacs/site-lisp/elpa-src/paredit-26/paredit-autoloads
/usr/share/emacs/site-lisp/elpa/paredit-26/paredit-pkg hides /usr/share/emacs/site-lisp/elpa-src/paredit-26/paredit-pkg
/usr/share/emacs/site-lisp/elpa/paredit-26/paredit hides /usr/share/emacs/site-lisp/elpa-src/paredit-26/paredit
/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/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
/usr/share/emacs/site-lisp/elpa/pyvenv-1.21/pyvenv hides /usr/share/emacs/site-lisp/elpa-src/pyvenv-1.21/pyvenv
/usr/share/emacs/site-lisp/elpa/pyvenv-1.21/pyvenv-pkg hides /usr/share/emacs/site-lisp/elpa-src/pyvenv-1.21/pyvenv-pkg
/usr/share/emacs/site-lisp/elpa/pyvenv-1.21/pyvenv-autoloads hides /usr/share/emacs/site-lisp/elpa-src/pyvenv-1.21/pyvenv-autoloads
/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-20241218.331/vterm hides /usr/share/emacs/site-lisp/elpa-src/vterm-0.0.2/vterm
/home/xiyueden/.config/emacs/elpa/vterm-20241218.331/vterm-pkg hides /usr/share/emacs/site-lisp/elpa-src/vterm-0.0.2/vterm-pkg
/home/xiyueden/.config/emacs/elpa/vterm-20241218.331/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.21/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.21/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.21/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.4.4/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.4.4/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.4.4/with-editor hides /usr/share/emacs/site-lisp/elpa-src/with-editor-3.0.5/with-editor
/home/xiyueden/.config/emacs/elpa/xml-rpc-1.6.17/xml-rpc hides /usr/share/emacs/site-lisp/elpa-src/xml-rpc-1.6.16/xml-rpc
/home/xiyueden/.config/emacs/elpa/xml-rpc-1.6.17/xml-rpc-pkg hides /usr/share/emacs/site-lisp/elpa-src/xml-rpc-1.6.16/xml-rpc-pkg
/home/xiyueden/.config/emacs/elpa/xml-rpc-1.6.17/xml-rpc-autoloads hides /usr/share/emacs/site-lisp/elpa-src/xml-rpc-1.6.16/xml-rpc-autoloads
/home/xiyueden/.config/emacs/elpa/yasnippet-0.14.3/yasnippet-autoloads hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-0.14.0/yasnippet-autoloads
/home/xiyueden/.config/emacs/elpa/yasnippet-0.14.3/yasnippet-pkg hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-0.14.0/yasnippet-pkg
/home/xiyueden/.config/emacs/elpa/yasnippet-0.14.3/yasnippet hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-0.14.0/yasnippet
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20250507.2002/yasnippet-snippets hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-snippets-20220713/yasnippet-snippets
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20250507.2002/yasnippet-snippets-pkg hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-snippets-20220713/yasnippet-snippets-pkg
/home/xiyueden/.config/emacs/elpa/yasnippet-snippets-20250507.2002/yasnippet-snippets-autoloads hides /usr/share/emacs/site-lisp/elpa-src/yasnippet-snippets-20220713/yasnippet-snippets-autoloads
/usr/share/emacs/site-lisp/elpa/zenburn-theme-2.8.0/zenburn-theme hides /usr/share/emacs/site-lisp/elpa-src/zenburn-theme-2.8.0/zenburn-theme
/usr/share/emacs/site-lisp/elpa/zenburn-theme-2.8.0/zenburn-theme-pkg hides /usr/share/emacs/site-lisp/elpa-src/zenburn-theme-2.8.0/zenburn-theme-pkg
/usr/share/emacs/site-lisp/elpa/zenburn-theme-2.8.0/zenburn-theme-autoloads hides /usr/share/emacs/site-lisp/elpa-src/zenburn-theme-2.8.0/zenburn-theme-autoloads
/home/xiyueden/.config/emacs/elpa/transient-0.9.1/transient hides /usr/share/emacs/30.1/lisp/transient
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-julia hides /usr/share/emacs/30.1/lisp/org/ob-julia
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-entities hides /usr/share/emacs/30.1/lisp/org/org-entities
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-w3m hides /usr/share/emacs/30.1/lisp/org/ol-w3m
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-publish hides /usr/share/emacs/30.1/lisp/org/ox-publish
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-faces hides /usr/share/emacs/30.1/lisp/org/org-faces
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-docview hides /usr/share/emacs/30.1/lisp/org/ol-docview
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-haskell hides /usr/share/emacs/30.1/lisp/org/ob-haskell
/home/xiyueden/.config/emacs/elpa/org-9.7.30/oc-biblatex hides /usr/share/emacs/30.1/lisp/org/oc-biblatex
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-odt hides /usr/share/emacs/30.1/lisp/org/ox-odt
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-forth hides /usr/share/emacs/30.1/lisp/org/ob-forth
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-element-ast hides /usr/share/emacs/30.1/lisp/org/org-element-ast
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-feed hides /usr/share/emacs/30.1/lisp/org/org-feed
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-clojure hides /usr/share/emacs/30.1/lisp/org/ob-clojure
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-refile hides /usr/share/emacs/30.1/lisp/org/org-refile
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-cycle hides /usr/share/emacs/30.1/lisp/org/org-cycle
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-icalendar hides /usr/share/emacs/30.1/lisp/org/ox-icalendar
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-C hides /usr/share/emacs/30.1/lisp/org/ob-C
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-calc hides /usr/share/emacs/30.1/lisp/org/ob-calc
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-mouse hides /usr/share/emacs/30.1/lisp/org/org-mouse
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-goto hides /usr/share/emacs/30.1/lisp/org/org-goto
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-rmail hides /usr/share/emacs/30.1/lisp/org/ol-rmail
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-eshell hides /usr/share/emacs/30.1/lisp/org/ol-eshell
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-comint hides /usr/share/emacs/30.1/lisp/org/ob-comint
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-id hides /usr/share/emacs/30.1/lisp/org/org-id
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-crypt hides /usr/share/emacs/30.1/lisp/org/org-crypt
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-emacs-lisp hides /usr/share/emacs/30.1/lisp/org/ob-emacs-lisp
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-html hides /usr/share/emacs/30.1/lisp/org/ox-html
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-indent hides /usr/share/emacs/30.1/lisp/org/org-indent
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-ascii hides /usr/share/emacs/30.1/lisp/org/ox-ascii
/home/xiyueden/.config/emacs/elpa/org-9.7.30/oc-csl hides /usr/share/emacs/30.1/lisp/org/oc-csl
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-latex hides /usr/share/emacs/30.1/lisp/org/ob-latex
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-lisp hides /usr/share/emacs/30.1/lisp/org/ob-lisp
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-beamer hides /usr/share/emacs/30.1/lisp/org/ox-beamer
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-macs hides /usr/share/emacs/30.1/lisp/org/org-macs
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-perl hides /usr/share/emacs/30.1/lisp/org/ob-perl
/home/xiyueden/.config/emacs/elpa/org-9.7.30/oc-bibtex hides /usr/share/emacs/30.1/lisp/org/oc-bibtex
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-colview hides /usr/share/emacs/30.1/lisp/org/org-colview
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-lilypond hides /usr/share/emacs/30.1/lisp/org/ob-lilypond
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-eshell hides /usr/share/emacs/30.1/lisp/org/ob-eshell
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-protocol hides /usr/share/emacs/30.1/lisp/org/org-protocol
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-timer hides /usr/share/emacs/30.1/lisp/org/org-timer
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-table hides /usr/share/emacs/30.1/lisp/org/org-table
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-mobile hides /usr/share/emacs/30.1/lisp/org/org-mobile
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-latex hides /usr/share/emacs/30.1/lisp/org/ox-latex
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-lob hides /usr/share/emacs/30.1/lisp/org/ob-lob
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-maxima hides /usr/share/emacs/30.1/lisp/org/ob-maxima
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-sed hides /usr/share/emacs/30.1/lisp/org/ob-sed
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-octave hides /usr/share/emacs/30.1/lisp/org/ob-octave
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox hides /usr/share/emacs/30.1/lisp/org/ox
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-lint hides /usr/share/emacs/30.1/lisp/org/org-lint
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-doi hides /usr/share/emacs/30.1/lisp/org/ol-doi
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-sqlite hides /usr/share/emacs/30.1/lisp/org/ob-sqlite
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-persist hides /usr/share/emacs/30.1/lisp/org/org-persist
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-plot hides /usr/share/emacs/30.1/lisp/org/org-plot
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-list hides /usr/share/emacs/30.1/lisp/org/org-list
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-pcomplete hides /usr/share/emacs/30.1/lisp/org/org-pcomplete
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org hides /usr/share/emacs/30.1/lisp/org/org
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-element hides /usr/share/emacs/30.1/lisp/org/org-element
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-clock hides /usr/share/emacs/30.1/lisp/org/org-clock
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-exp hides /usr/share/emacs/30.1/lisp/org/ob-exp
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-inlinetask hides /usr/share/emacs/30.1/lisp/org/org-inlinetask
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-ref hides /usr/share/emacs/30.1/lisp/org/ob-ref
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-attach hides /usr/share/emacs/30.1/lisp/org/org-attach
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-lua hides /usr/share/emacs/30.1/lisp/org/ob-lua
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-core hides /usr/share/emacs/30.1/lisp/org/ob-core
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-koma-letter hides /usr/share/emacs/30.1/lisp/org/ox-koma-letter
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-awk hides /usr/share/emacs/30.1/lisp/org/ob-awk
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-matlab hides /usr/share/emacs/30.1/lisp/org/ob-matlab
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-src hides /usr/share/emacs/30.1/lisp/org/org-src
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-groovy hides /usr/share/emacs/30.1/lisp/org/ob-groovy
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol hides /usr/share/emacs/30.1/lisp/org/ol
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-fold-core hides /usr/share/emacs/30.1/lisp/org/org-fold-core
/home/xiyueden/.config/emacs/elpa/org-9.7.30/oc hides /usr/share/emacs/30.1/lisp/org/oc
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-gnus hides /usr/share/emacs/30.1/lisp/org/ol-gnus
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-loaddefs hides /usr/share/emacs/30.1/lisp/org/org-loaddefs
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-fortran hides /usr/share/emacs/30.1/lisp/org/ob-fortran
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-org hides /usr/share/emacs/30.1/lisp/org/ox-org
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-version hides /usr/share/emacs/30.1/lisp/org/org-version
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-python hides /usr/share/emacs/30.1/lisp/org/ob-python
/home/xiyueden/.config/emacs/elpa/org-9.7.30/oc-basic hides /usr/share/emacs/30.1/lisp/org/oc-basic
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-man hides /usr/share/emacs/30.1/lisp/org/ol-man
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-tempo hides /usr/share/emacs/30.1/lisp/org/org-tempo
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-bbdb hides /usr/share/emacs/30.1/lisp/org/ol-bbdb
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-table hides /usr/share/emacs/30.1/lisp/org/ob-table
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-keys hides /usr/share/emacs/30.1/lisp/org/org-keys
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-java hides /usr/share/emacs/30.1/lisp/org/ob-java
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-ditaa hides /usr/share/emacs/30.1/lisp/org/ob-ditaa
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-man hides /usr/share/emacs/30.1/lisp/org/ox-man
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-tangle hides /usr/share/emacs/30.1/lisp/org/ob-tangle
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-fold hides /usr/share/emacs/30.1/lisp/org/org-fold
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-css hides /usr/share/emacs/30.1/lisp/org/ob-css
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-agenda hides /usr/share/emacs/30.1/lisp/org/org-agenda
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-ctags hides /usr/share/emacs/30.1/lisp/org/org-ctags
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-texinfo hides /usr/share/emacs/30.1/lisp/org/ox-texinfo
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob hides /usr/share/emacs/30.1/lisp/org/ob
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-archive hides /usr/share/emacs/30.1/lisp/org/org-archive
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-eww hides /usr/share/emacs/30.1/lisp/org/ol-eww
/home/xiyueden/.config/emacs/elpa/org-9.7.30/oc-natbib hides /usr/share/emacs/30.1/lisp/org/oc-natbib
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-ruby hides /usr/share/emacs/30.1/lisp/org/ob-ruby
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-ocaml hides /usr/share/emacs/30.1/lisp/org/ob-ocaml
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-mhe hides /usr/share/emacs/30.1/lisp/org/ol-mhe
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-screen hides /usr/share/emacs/30.1/lisp/org/ob-screen
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-processing hides /usr/share/emacs/30.1/lisp/org/ob-processing
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-shell hides /usr/share/emacs/30.1/lisp/org/ob-shell
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-num hides /usr/share/emacs/30.1/lisp/org/org-num
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-eval hides /usr/share/emacs/30.1/lisp/org/ob-eval
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-habit hides /usr/share/emacs/30.1/lisp/org/org-habit
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-compat hides /usr/share/emacs/30.1/lisp/org/org-compat
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-info hides /usr/share/emacs/30.1/lisp/org/ol-info
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ox-md hides /usr/share/emacs/30.1/lisp/org/ox-md
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-plantuml hides /usr/share/emacs/30.1/lisp/org/ob-plantuml
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-attach-git hides /usr/share/emacs/30.1/lisp/org/org-attach-git
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-gnuplot hides /usr/share/emacs/30.1/lisp/org/ob-gnuplot
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-irc hides /usr/share/emacs/30.1/lisp/org/ol-irc
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-org hides /usr/share/emacs/30.1/lisp/org/ob-org
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-datetree hides /usr/share/emacs/30.1/lisp/org/org-datetree
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-footnote hides /usr/share/emacs/30.1/lisp/org/org-footnote
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-dot hides /usr/share/emacs/30.1/lisp/org/ob-dot
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ol-bibtex hides /usr/share/emacs/30.1/lisp/org/ol-bibtex
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-sass hides /usr/share/emacs/30.1/lisp/org/ob-sass
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-scheme hides /usr/share/emacs/30.1/lisp/org/ob-scheme
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-capture hides /usr/share/emacs/30.1/lisp/org/org-capture
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-R hides /usr/share/emacs/30.1/lisp/org/ob-R
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-duration hides /usr/share/emacs/30.1/lisp/org/org-duration
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-makefile hides /usr/share/emacs/30.1/lisp/org/ob-makefile
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-sql hides /usr/share/emacs/30.1/lisp/org/ob-sql
/home/xiyueden/.config/emacs/elpa/org-9.7.30/org-macro hides /usr/share/emacs/30.1/lisp/org/org-macro
/home/xiyueden/.config/emacs/elpa/org-9.7.30/ob-js hides /usr/share/emacs/30.1/lisp/org/ob-js

Features:
(shadow emacsbug debian-bug js c-ts-common imenu cc-mode cc-fonts
cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs
shortdoc boxquote comp-run comp-common rect timezone mailalias qp
ace-window avy sort company-oddmuse company-keywords company-etags etags
fileloop xref company-gtags company-dabbrev-code company-dabbrev
company-files company-clang company-capf company-cmake company-semantic
company-template company-bbdb company mail-extr misearch multi-isearch
cl-print package-x help-fns radix-tree smerge-mode diff mm-archive
shr-color oc-basic org-element org-persist org-id org-refile
org-element-ast ol-eww eww xdg mm-url ol-rmail ol-mhe ol-irc ol-info
ol-gnus nnselect gnus-art mm-uu mml2015 gnus-sum gnus-group gnus-undo
gnus-start gnus-dbus dbus gnus-cloud nnimap nnmail mail-source utf7 nnoo
gnus-spec gnus-int gnus-range gnus-win gnus nnheader range ol-docview
doc-view ol-bibtex bibtex ol-bbdb ol-w3m ol-doi org-link-doi ob-octave
org ob ob-tangle ob-ref ob-lob ob-table ob-exp org-macro org-src
sh-script smie executable ob-comint org-pcomplete pcomplete org-list
org-footnote org-faces org-entities noutline outline ob-emacs-lisp
ob-core ob-eval org-cycle org-table ol org-fold org-fold-core org-keys
oc org-loaddefs find-func org-version org-compat org-macs mule-util
jka-compr mastodon-media textsec uni-scripts idna-mapping ucs-normalize
uni-confusable textsec-check mastodon-profile mastodon-auth
mastodon-client mastodon mastodon-transient tp transient compat
mastodon-search mastodon-widget mastodon-tl image-mode exif url-cache
mastodon-toot mastodon-iso mastodon-http notmuch notmuch-tree
notmuch-jump notmuch-hello notmuch-show notmuch-print notmuch-crypto
notmuch-mua notmuch-message notmuch-draft notmuch-maildir-fcc
notmuch-address notmuch-company notmuch-parser format-spec notmuch-wash
coolj goto-addr icalendar diary-lib diary-loaddefs cal-menu calendar
cal-loaddefs notmuch-tag crm notmuch-lib notmuch-version notmuch-compat
mm-view mml-smime smime dig elfeed-show elfeed-search message yank-media
rfc822 mml mml-sec gnus-util mm-decode mm-bodies mm-encode mailabbrev
gmm-utils mailheader shr pixel-fill kinsoku svg dom elfeed-csv elfeed
elfeed-curl elfeed-log elfeed-db elfeed-lib avl-tree generator url-queue
url-file xml-query xml matlab matlab-sections matlab-scan matlab-syntax
matlab-org matlab-compat flyspell ispell gnutls network-stream epa-file
epa derived rcirc parse-time iso8601 time-date term/xterm xterm server
cap-words superword subword vc-hg vc-git diff-mode track-changes vc-bzr
vc-src vc-sccs vc-svn vc-cvs vc-rcs log-view pcvs-util vc vc-dispatcher
bug-reference disp-table whitespace cus-start init zenburn-theme xclip
treesit-auto treesit treemacs-project-follow-mode treemacs-follow-mode
treemacs-rendering treemacs-annotations treemacs-async treemacs-visuals
treemacs-fringe-indicator pulse color treemacs-workspaces treemacs-dom
treemacs-icons treemacs-themes treemacs-scope treemacs-core-utils
treemacs-logging treemacs-customization pfuture inline ht s hl-line dash
auth-source-xoauth2-plugin smtpmail sendmail mail-utils oauth2 url-http
url-auth mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums
mail-prsvr url-gw nsm puny plstore epg rfc6068 epg-config
keychain-environment exec-path-from-shell activities-tabs activities
persist bookmark edmacro kmacro advice cperl-mode facemenu icomplete
flymake project compile text-property-search comint ansi-osc ansi-color
ring warnings thingatpt 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 cus-edit pp cus-load wid-edit
activities-autoloads auctex-autoloads tex-site
auth-source-xoauth2-plugin-autoloads bazel-autoloads rx
bison-mode-autoloads boxquote-autoloads clojure-mode-autoloads
cmake-mode-autoloads company-autoloads corfu-terminal-autoloads
corfu-autoloads csv-mode-autoloads dart-mode-autoloads
dockerfile-mode-autoloads elfeed-autoloads evil-autoloads
exec-path-from-shell-autoloads f-autoloads format-all-autoloads
git-modes-autoloads gnuplot-autoloads goto-chg-autoloads gptel-autoloads
inheritenv-autoloads keychain-environment-autoloads
language-id-autoloads lua-mode-autoloads magit-autoloads pcase
magit-section-autoloads llama-autoloads mastodon-autoloads
matlab-mode-autoloads meson-mode-autoloads nginx-mode-autoloads
ol-notmuch-autoloads org-autoloads persist-autoloads popon-autoloads
rust-mode-autoloads scala-mode-autoloads tp-autoloads
transient-autoloads treemacs-autoloads cfrs-autoloads posframe-autoloads
ht-autoloads hydra-autoloads lv-autoloads pfuture-autoloads s-autoloads
treesit-auto-autoloads vterm-autoloads web-mode-autoloads
xclip-autoloads yaml-mode-autoloads yasnippet-snippets-autoloads
yasnippet-autoloads xml-rpc-autoloads debian-el dired dired-loaddefs
with-editor-autoloads info dash-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 icons 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 touch-screen 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 gtk x-toolkit xinput2 x multi-tty move-toolbar
make-network-process native-compile emacs)

Memory information:
((conses 16 3469436 539048) (symbols 48 53556 40)
 (strings 32 306314 27525) (string-bytes 1 13234730)
 (vectors 16 125736) (vector-slots 8 2425796 192394)
 (floats 8 7690 58762) (intervals 56 182460 4867) (buffers 992 40))

-- 
Regards,
Xiyue Deng
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:02 GMT) Full text and rfc822 format available.

Message #8 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Subject: Proposed changes for oauth2
Date: Sun,  3 Aug 2025 17:20:38 -0700
I propose the series of changes for oauth2 which would lead to the
next release of 0.18.

Each commit message explains what is done.  Please let me know if
anything is unclear.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:03 GMT) Full text and rfc822 format available.

Message #11 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 04/11] Rename internal variables using consistent oauth2 prefix
Date: Sun,  3 Aug 2025 17:20:42 -0700
Adapted from bug#52476 by Aleksandr Vityazev.
---
 oauth2.el | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index eccf439130..ef82a64c5f 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -61,8 +61,8 @@
 (defvar oauth2-debug nil
   "Enable verbose logging in oauth2 to help debugging.")
 
-(defvar oauth--url-advice nil)
-(defvar oauth--token-data)
+(defvar oauth2--url-advice nil)
+(defvar oauth2--token-data)
 
 (defun oauth2--do-debug (&rest msg)
   "Output debug messages when `oauth2-debug' is enabled."
@@ -231,20 +231,20 @@ This allows to store the token in an unique way."
 
 (defun oauth2-extra-headers (extra-headers)
   "Return EXTRA-HEADERS with `Authorization: Bearer' added."
-  (cons (oauth2-authz-bearer-header (oauth2-token-access-token (car oauth--token-data)))
+  (cons (oauth2-authz-bearer-header (oauth2-token-access-token (car oauth2--token-data)))
         extra-headers))
 
 
 ;; FIXME: We should change URL so that this can be done without an advice.
 (defun oauth2--url-http-handle-authentication-hack (orig-fun &rest args)
-  (if (not oauth--url-advice)
+  (if (not oauth2--url-advice)
       (apply orig-fun args)
     (let ((url-request-method url-http-method)
           (url-request-data url-http-data)
           (url-request-extra-headers
            (oauth2-extra-headers url-http-extra-headers)))
-      (oauth2-refresh-access (car oauth--token-data))
-      (url-retrieve-internal (cdr oauth--token-data)
+      (oauth2-refresh-access (car oauth2--token-data))
+      (url-retrieve-internal (cdr oauth2--token-data)
                              url-callback-function
                              url-callback-arguments)
       ;; This is to make `url' think it's done.
@@ -257,8 +257,8 @@ This allows to store the token in an unique way."
 (defun oauth2-url-retrieve-synchronously (token url &optional request-method request-data request-extra-headers)
   "Retrieve an URL synchronously using TOKEN to access it.
 TOKEN can be obtained with `oauth2-auth'."
-  (let* ((oauth--token-data (cons token url)))
-    (let ((oauth--url-advice t)         ;Activate our advice.
+  (let* ((oauth2--token-data (cons token url)))
+    (let ((oauth2--url-advice t)         ;Activate our advice.
           (url-request-method request-method)
           (url-request-data request-data)
           (url-request-extra-headers
@@ -273,8 +273,8 @@ TOKEN can be obtained with `oauth2-auth'."
 TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with CBARGS
 when finished.  See `url-retrieve'."
   ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in `url-http-handle-authentication'.
-  (let* ((oauth--token-data (cons token url)))
-    (let ((oauth--url-advice t)         ;Activate our advice.
+  (let* ((oauth2--token-data (cons token url)))
+    (let ((oauth2--url-advice t)         ;Activate our advice.
           (url-request-method request-method)
           (url-request-data request-data)
           (url-request-extra-headers
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:03 GMT) Full text and rfc822 format available.

Message #14 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 02/11] Untabify source code
Date: Sun,  3 Aug 2025 17:20:40 -0700
Only one line is using tab instead of space.
---
 oauth2.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/oauth2.el b/oauth2.el
index 70c59e7513..c3aa45ed69 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -145,7 +145,7 @@ TOKEN should be obtained with `oauth2-request-access'."
                     (oauth2-make-access-request
                      (oauth2-token-token-url token)
                      (concat "client_id=" (oauth2-token-client-id token)
-			     (when (oauth2-token-client-secret token)
+                             (when (oauth2-token-client-secret token)
                                (concat "&client_secret=" (oauth2-token-client-secret token)))
                              "&refresh_token=" (oauth2-token-refresh-token token)
                              "&grant_type=refresh_token")))))
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:04 GMT) Full text and rfc822 format available.

Message #17 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 07/11] Drop unused code
Date: Sun,  3 Aug 2025 17:20:45 -0700
These functions are not used by other functions and not required for
getting any token info.
---
 oauth2.el | 72 +------------------------------------------------------
 1 file changed, 1 insertion(+), 71 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index 4541893346..6f7b6a27db 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -5,7 +5,7 @@
 ;; Author: Julien Danjou <julien <at> danjou.info>
 ;; Version: 0.17
 ;; Keywords: comm
-;; Package-Requires: ((cl-lib "0.5") (nadvice "0.3"))
+;; Package-Requires: ((cl-lib "0.5"))
 
 ;; This file is part of GNU Emacs.
 
@@ -248,76 +248,6 @@ Returns an `oauth2-token'."
         (plstore-save plstore)
         token))))
 
-(defun oauth2-url-append-access-token (token url)
-  "Append access token to URL."
-  (concat url
-          (if (string-match-p "\?" url) "&" "?")
-          "access_token=" (oauth2-token-access-token token)))
-
-(defun oauth2-authz-bearer-header (token)
-  "Return `Authoriztions: Bearer' header with TOKEN."
-  (cons "Authorization" (format "Bearer %s" token)))
-
-(defun oauth2-extra-headers (extra-headers)
-  "Return EXTRA-HEADERS with `Authorization: Bearer' added."
-  (cons (oauth2-authz-bearer-header
-         (oauth2-token-access-token (car oauth2--token-data)))
-        extra-headers))
-
-
-;; FIXME: We should change URL so that this can be done without an advice.
-(defun oauth2--url-http-handle-authentication-hack (orig-fun &rest args)
-  (if (not oauth2--url-advice)
-      (apply orig-fun args)
-    (let ((url-request-method url-http-method)
-          (url-request-data url-http-data)
-          (url-request-extra-headers
-           (oauth2-extra-headers url-http-extra-headers)))
-      (oauth2-refresh-access (car oauth2--token-data))
-      (url-retrieve-internal (cdr oauth2--token-data)
-                             url-callback-function
-                             url-callback-arguments)
-      ;; This is to make `url' think it's done.
-      (when (boundp 'success) (setq success t)) ;For URL library in Emacs<24.4.
-      t)))                                      ;For URL library in Emacs≄24.4.
-(advice-add 'url-http-handle-authentication :around
-            #'oauth2--url-http-handle-authentication-hack)
-
-;;;###autoload
-(defun oauth2-url-retrieve-synchronously (token url &optional request-method
-                                                request-data
-                                                request-extra-headers)
-  "Retrieve an URL synchronously using TOKEN to access it.
-TOKEN can be obtained with `oauth2-auth'.  REQUEST-METHOD, REQUEST-DATA,
-and REQUEST-EXTRA-HEADERS are used when retrieving URL.  See also
-`url-retrieve-synchronously'."
-  (let* ((oauth2--token-data (cons token url)))
-    (let ((oauth2--url-advice t)         ;Activate our advice.
-          (url-request-method request-method)
-          (url-request-data request-data)
-          (url-request-extra-headers
-           (oauth2-extra-headers request-extra-headers)))
-      (url-retrieve-synchronously url))))
-
-;;;###autoload
-(defun oauth2-url-retrieve (token url callback
-                                  &optional cbargs request-method request-data
-                                  request-extra-headers)
-  "Retrieve an URL asynchronously using TOKEN to access it.
-TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with
-CBARGS when finished. TOKEN can be obtained with `oauth2-auth'.
-REQUEST-METHOD, REQUEST-DATA, and REQUEST-EXTRA-HEADERS are used when
-retrieving URL.  See also `url-retrieve'."
-  ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in
-  ;; `url-http-handle-authentication'.
-  (let* ((oauth2--token-data (cons token url)))
-    (let ((oauth2--url-advice t)         ;Activate our advice.
-          (url-request-method request-method)
-          (url-request-data request-data)
-          (url-request-extra-headers
-           (oauth2-extra-headers request-extra-headers)))
-      (url-retrieve url callback cbargs))))
-
 (provide 'oauth2)
 
 ;;; oauth2.el ends here
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:05 GMT) Full text and rfc822 format available.

Message #20 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 03/11] Reorder code to put defcustom/defvar at the beginning
 part
Date: Sun,  3 Aug 2025 17:20:41 -0700
Adapted from bug#52476 by Aleksandr Vityazev.
---
 oauth2.el | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index c3aa45ed69..eccf439130 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -53,9 +53,17 @@
   :link '(url-link :tag "Savannah" "https://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/?h=externals/oauth2")
   :link '(url-link :tag "ELPA" "https://elpa.gnu.org/packages/oauth2.html"))
 
+(defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
+  "File path where store OAuth tokens."
+  :group 'oauth2
+  :type 'file)
+
 (defvar oauth2-debug nil
   "Enable verbose logging in oauth2 to help debugging.")
 
+(defvar oauth--url-advice nil)
+(defvar oauth--token-data)
+
 (defun oauth2--do-debug (&rest msg)
   "Output debug messages when `oauth2-debug' is enabled."
   (when oauth2-debug
@@ -174,11 +182,6 @@ TOKEN should be obtained with `oauth2-request-access'."
     auth-url client-id scope state redirect-uri)
    redirect-uri))
 
-(defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
-  "File path where store OAuth tokens."
-  :group 'oauth2
-  :type 'file)
-
 (defun oauth2-compute-id (auth-url token-url scope client-id)
   "Compute an unique id based on URLs.
 This allows to store the token in an unique way."
@@ -222,9 +225,6 @@ This allows to store the token in an unique way."
           (if (string-match-p "\?" url) "&" "?")
           "access_token=" (oauth2-token-access-token token)))
 
-(defvar oauth--url-advice nil)
-(defvar oauth--token-data)
-
 (defun oauth2-authz-bearer-header (token)
   "Return `Authoriztions: Bearer' header with TOKEN."
   (cons "Authorization" (format "Bearer %s" token)))
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:06 GMT) Full text and rfc822 format available.

Message #23 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 06/11] Reformat most lines to be less than 80 characters long
Date: Sun,  3 Aug 2025 17:20:44 -0700
---
 oauth2.el | 44 +++++++++++++++++++++++++++++---------------
 1 file changed, 29 insertions(+), 15 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index ba7125e79b..4541893346 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -50,7 +50,8 @@
 (defgroup oauth2 nil
   "OAuth 2.0 Authorization Protocol."
   :group 'comm
-  :link '(url-link :tag "Savannah" "https://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/?h=externals/oauth2")
+  :link '(url-link :tag "Savannah"
+                   "https://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/?h=externals/oauth2")
   :link '(url-link :tag "ELPA" "https://elpa.gnu.org/packages/oauth2.html"))
 
 (defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
@@ -70,7 +71,8 @@
     (setcar msg (concat "[oauth2] " (car msg)))
     (apply #'message msg)))
 
-(defun oauth2-request-authorization (auth-url client-id &optional scope state redirect-uri)
+(defun oauth2-request-authorization (auth-url client-id &optional scope state
+                                              redirect-uri)
   "Request OAuth authorization at AUTH-URL by launching `browse-url'.
 CLIENT-ID is the client id provided by the provider which uses
 REDIRECT-URI when requesting an access-token.  The default redirect_uri
@@ -84,7 +86,9 @@ Returns the code provided by the service."
                      (if (string-match-p "\?" auth-url) "&" "?")
                      "client_id=" (url-hexify-string client-id)
                      "&response_type=code"
-                     "&redirect_uri=" (url-hexify-string (or redirect-uri "urn:ietf:wg:oauth:2.0:oob"))
+                     "&redirect_uri=" (url-hexify-string
+                                       (or redirect-uri
+                                           "urn:ietf:wg:oauth:2.0:oob"))
                      (if scope (concat "&scope=" (url-hexify-string scope)) "")
                      (if state (concat "&state=" (url-hexify-string state)) "")
                      ;; The following two parameters are required for Gmail
@@ -127,7 +131,8 @@ Returns the code provided by the service."
   token-url
   access-response)
 
-(defun oauth2-request-access (token-url client-id client-secret code &optional redirect-uri)
+(defun oauth2-request-access (token-url client-id client-secret code
+                                        &optional redirect-uri)
   "Request OAuth access.
 TOKEN-URL is the URL for making the request.  CLIENT-ID and
 CLIENT-SECRET are provided by the service provider.  The CODE should be
@@ -165,8 +170,10 @@ TOKEN should be obtained with `oauth2-request-access'."
                      (oauth2-token-token-url token)
                      (concat "client_id=" (oauth2-token-client-id token)
                              (when (oauth2-token-client-secret token)
-                               (concat "&client_secret=" (oauth2-token-client-secret token)))
-                             "&refresh_token=" (oauth2-token-refresh-token token)
+                               (concat "&client_secret="
+                                       (oauth2-token-client-secret token)))
+                             "&refresh_token="
+                             (oauth2-token-refresh-token token)
                              "&grant_type=refresh_token")))))
   ;; If the token has a plstore, update it
   (let ((plstore (oauth2-token-plstore token)))
@@ -183,7 +190,8 @@ TOKEN should be obtained with `oauth2-request-access'."
   token)
 
 ;;;###autoload
-(defun oauth2-auth (auth-url token-url client-id client-secret &optional scope state redirect-uri)
+(defun oauth2-auth (auth-url token-url client-id client-secret
+                             &optional scope state redirect-uri)
   "Authenticate application via OAuth2."
   (oauth2-request-access
    token-url
@@ -199,7 +207,8 @@ This allows to store the token in an unique way."
   (secure-hash 'sha512 (concat auth-url token-url scope client-id)))
 
 ;;;###autoload
-(defun oauth2-auth-and-store (auth-url token-url scope client-id client-secret &optional redirect-uri state)
+(defun oauth2-auth-and-store (auth-url token-url scope client-id client-secret
+                                       &optional redirect-uri state)
   "Request access to a resource and store it.
 AUTH-URL and TOKEN-URL are provided by the service provider.  CLIENT-ID
 and CLIENT-SECRET should be generated by the service provider when a
@@ -225,7 +234,8 @@ Returns an `oauth2-token'."
                            :token-url token-url
                            :access-response (plist-get plist :access-response))
       (let ((token (oauth2-auth auth-url token-url
-                                client-id client-secret scope state redirect-uri)))
+                                client-id client-secret scope state
+                                redirect-uri)))
         ;; Set the plstore
         (setf (oauth2-token-plstore token) plstore)
         (setf (oauth2-token-plstore-id token) id)
@@ -250,7 +260,8 @@ Returns an `oauth2-token'."
 
 (defun oauth2-extra-headers (extra-headers)
   "Return EXTRA-HEADERS with `Authorization: Bearer' added."
-  (cons (oauth2-authz-bearer-header (oauth2-token-access-token (car oauth2--token-data)))
+  (cons (oauth2-authz-bearer-header
+         (oauth2-token-access-token (car oauth2--token-data)))
         extra-headers))
 
 
@@ -273,7 +284,9 @@ Returns an `oauth2-token'."
             #'oauth2--url-http-handle-authentication-hack)
 
 ;;;###autoload
-(defun oauth2-url-retrieve-synchronously (token url &optional request-method request-data request-extra-headers)
+(defun oauth2-url-retrieve-synchronously (token url &optional request-method
+                                                request-data
+                                                request-extra-headers)
   "Retrieve an URL synchronously using TOKEN to access it.
 TOKEN can be obtained with `oauth2-auth'.  REQUEST-METHOD, REQUEST-DATA,
 and REQUEST-EXTRA-HEADERS are used when retrieving URL.  See also
@@ -287,15 +300,16 @@ and REQUEST-EXTRA-HEADERS are used when retrieving URL.  See also
       (url-retrieve-synchronously url))))
 
 ;;;###autoload
-(defun oauth2-url-retrieve (token url callback &optional
-                                  cbargs
-                                  request-method request-data request-extra-headers)
+(defun oauth2-url-retrieve (token url callback
+                                  &optional cbargs request-method request-data
+                                  request-extra-headers)
   "Retrieve an URL asynchronously using TOKEN to access it.
 TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with
 CBARGS when finished. TOKEN can be obtained with `oauth2-auth'.
 REQUEST-METHOD, REQUEST-DATA, and REQUEST-EXTRA-HEADERS are used when
 retrieving URL.  See also `url-retrieve'."
-  ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in `url-http-handle-authentication'.
+  ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in
+  ;; `url-http-handle-authentication'.
   (let* ((oauth2--token-data (cons token url)))
     (let ((oauth2--url-advice t)         ;Activate our advice.
           (url-request-method request-method)
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:06 GMT) Full text and rfc822 format available.

Message #26 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 01/11] Small fix for backtrace-frame
Date: Sun,  3 Aug 2025 17:20:39 -0700
Using `(backtrace-frame 2)' for the intended function name.
---
 oauth2.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/oauth2.el b/oauth2.el
index 87e0c39c5c..70c59e7513 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -90,7 +90,7 @@ It returns the code provided by the service."
 
 (defun oauth2-make-access-request (url data)
   "Make an access request to URL using DATA in POST."
-  (let ((func-name (nth 1 (backtrace-frame 3))))
+  (let ((func-name (nth 1 (backtrace-frame 2))))
     (oauth2--do-debug "%s: url: %s" func-name url)
     (oauth2--do-debug "%s: data: %s" func-name data)
     (let ((url-request-method "POST")
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:07 GMT) Full text and rfc822 format available.

Message #29 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 08/11] Implement trivia debug message for more fine-grained
 logging
Date: Sun,  3 Aug 2025 17:20:46 -0700
Also convert some detailed logging to use trivia.
---
 oauth2.el | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index 6f7b6a27db..eb2ae0cb9b 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -65,11 +65,24 @@
 (defvar oauth2--url-advice nil)
 (defvar oauth2--token-data)
 
+(defun oauth2--do-warn (&rest msg)
+  "Actual function to log MSG based on how `oauth2-debug' is set."
+  (setcar msg (concat "[oauth2] " (car msg)))
+  (apply (if (functionp oauth2-debug)
+             oauth2-debug
+           'message)
+         msg))
+
+(defun oauth2--do-trivia (&rest msg)
+  "Output debug message when `oauth2-debug' is set to \\='trivia."
+  (when (or (eq oauth2-debug 'trivia)
+            (functionp oauth2-debug))
+    (apply #'oauth2--do-warn msg)))
+
 (defun oauth2--do-debug (&rest msg)
   "Output debug messages when `oauth2-debug' is enabled."
   (when oauth2-debug
-    (setcar msg (concat "[oauth2] " (car msg)))
-    (apply #'message msg)))
+    (apply #'oauth2--do-warn msg)))
 
 (defun oauth2-request-authorization (auth-url client-id &optional scope state
                                               redirect-uri)
@@ -109,8 +122,8 @@ Returns the code provided by the service."
 (defun oauth2-make-access-request (url data)
   "Make an access request to URL using DATA in POST requests."
   (let ((func-name (nth 1 (backtrace-frame 2))))
-    (oauth2--do-debug "%s: url: %s" func-name url)
-    (oauth2--do-debug "%s: data: %s" func-name data)
+    (oauth2--do-trivia "%s: url: %s" func-name url)
+    (oauth2--do-trivia "%s: data: %s" func-name data)
     (let ((url-request-method "POST")
           (url-request-data data)
           (url-request-extra-headers
@@ -118,7 +131,8 @@ Returns the code provided by the service."
       (with-current-buffer (url-retrieve-synchronously url)
         (let ((data (oauth2-request-access-parse)))
           (kill-buffer (current-buffer))
-          (oauth2--do-debug "%s: response: %s" func-name (prin1-to-string data))
+          (oauth2--do-trivia "%s: response: %s" func-name
+                             (prin1-to-string data))
           data)))))
 
 (cl-defstruct oauth2-token
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:07 GMT) Full text and rfc822 format available.

Message #32 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 05/11] Documentation updates
Date: Sun,  3 Aug 2025 17:20:43 -0700
* Update module commments to better reflect its usage.

* Also update function documentations.
  - Some adapted from bug#52746 by Aleksandr Vityazev.
---
 oauth2.el | 55 +++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 39 insertions(+), 16 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index ef82a64c5f..ba7125e79b 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -27,12 +27,12 @@
 ;; Implementation of the OAuth 2.0 draft.
 ;;
 ;; The main entry point is `oauth2-auth-and-store' which will return a token
-;; structure.  This token structure can be then used with
-;; `oauth2-url-retrieve-synchronously' or `oauth2-url-retrieve' to retrieve
-;; any data that need OAuth authentication to be accessed.
+;; structure, which contains information needed for OAuth2 authentication,
+;; e.g. access_token, refresh_token, etc.
 ;;
-;; If the token needs to be refreshed, the code handles it automatically and
-;; store the new value of the access token.
+;; If the token needs to be refreshed, call `oauth2-refresh-access' on the token
+;; and it will be refreshed with a new access_token.  The code will also store
+;; the new value of the access token for reuse.
 
 ;;; Code:
 
@@ -72,8 +72,14 @@
 
 (defun oauth2-request-authorization (auth-url client-id &optional scope state redirect-uri)
   "Request OAuth authorization at AUTH-URL by launching `browse-url'.
-CLIENT-ID is the client id provided by the provider.
-It returns the code provided by the service."
+CLIENT-ID is the client id provided by the provider which uses
+REDIRECT-URI when requesting an access-token.  The default redirect_uri
+for desktop application is usually \"urn:ietf:wg:oauth:2.0:oob\".  SCOPE
+identifies the resources that your application can access on the user's
+behalf.  STATE is a string that your application uses to maintain the
+state between the request and redirect response.
+
+Returns the code provided by the service."
   (let ((url (concat auth-url
                      (if (string-match-p "\?" auth-url) "&" "?")
                      "client_id=" (url-hexify-string client-id)
@@ -97,7 +103,7 @@ It returns the code provided by the service."
     (json-read)))
 
 (defun oauth2-make-access-request (url data)
-  "Make an access request to URL using DATA in POST."
+  "Make an access request to URL using DATA in POST requests."
   (let ((func-name (nth 1 (backtrace-frame 2))))
     (oauth2--do-debug "%s: url: %s" func-name url)
     (oauth2--do-debug "%s: data: %s" func-name data)
@@ -122,9 +128,14 @@ It returns the code provided by the service."
   access-response)
 
 (defun oauth2-request-access (token-url client-id client-secret code &optional redirect-uri)
-  "Request OAuth access at TOKEN-URL.
-The CODE should be obtained with `oauth2-request-authorization'.
-Return an `oauth2-token' structure."
+  "Request OAuth access.
+TOKEN-URL is the URL for making the request.  CLIENT-ID and
+CLIENT-SECRET are provided by the service provider.  The CODE should be
+obtained with `oauth2-request-authorization'.  REDIRECT-URI is used when
+requesting access-token.  The default value for desktop application is
+usually \"urn:ietf:wg:oauth:2.0:oob\".
+
+Returns an `oauth2-token'."
   (when code
     (let ((result
            (oauth2-make-access-request
@@ -183,13 +194,21 @@ TOKEN should be obtained with `oauth2-request-access'."
    redirect-uri))
 
 (defun oauth2-compute-id (auth-url token-url scope client-id)
-  "Compute an unique id based on URLs.
+  "Compute an unique id based on AUTH-URL, TOKEN-URL, SCOPE, and CLIENT-ID.
 This allows to store the token in an unique way."
   (secure-hash 'sha512 (concat auth-url token-url scope client-id)))
 
 ;;;###autoload
 (defun oauth2-auth-and-store (auth-url token-url scope client-id client-secret &optional redirect-uri state)
-  "Request access to a resource and store it using `plstore'."
+  "Request access to a resource and store it.
+AUTH-URL and TOKEN-URL are provided by the service provider.  CLIENT-ID
+and CLIENT-SECRET should be generated by the service provider when a
+user registers an application.  SCOPE identifies the resources that your
+application can access on the user's behalf.  STATE is a string that
+your application uses to maintain the state between the request and
+redirect response.
+
+Returns an `oauth2-token'."
   ;; We store a MD5 sum of all URL
   (let* ((plstore (plstore-open oauth2-token-file))
          (id (oauth2-compute-id auth-url token-url scope client-id))
@@ -256,7 +275,9 @@ This allows to store the token in an unique way."
 ;;;###autoload
 (defun oauth2-url-retrieve-synchronously (token url &optional request-method request-data request-extra-headers)
   "Retrieve an URL synchronously using TOKEN to access it.
-TOKEN can be obtained with `oauth2-auth'."
+TOKEN can be obtained with `oauth2-auth'.  REQUEST-METHOD, REQUEST-DATA,
+and REQUEST-EXTRA-HEADERS are used when retrieving URL.  See also
+`url-retrieve-synchronously'."
   (let* ((oauth2--token-data (cons token url)))
     (let ((oauth2--url-advice t)         ;Activate our advice.
           (url-request-method request-method)
@@ -270,8 +291,10 @@ TOKEN can be obtained with `oauth2-auth'."
                                   cbargs
                                   request-method request-data request-extra-headers)
   "Retrieve an URL asynchronously using TOKEN to access it.
-TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with CBARGS
-when finished.  See `url-retrieve'."
+TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with
+CBARGS when finished. TOKEN can be obtained with `oauth2-auth'.
+REQUEST-METHOD, REQUEST-DATA, and REQUEST-EXTRA-HEADERS are used when
+retrieving URL.  See also `url-retrieve'."
   ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in `url-http-handle-authentication'.
   (let* ((oauth2--token-data (cons token url)))
     (let ((oauth2--url-advice t)         ;Activate our advice.
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:08 GMT) Full text and rfc822 format available.

Message #35 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 09/11] Support reusing cached access-token before it expires
Date: Sun,  3 Aug 2025 17:20:47 -0700
Added new fields `auth-url' and `request-timestamp' to support
retrieving the cached tokens and calculate expiration.

Also refactor code for updating plstore storage in a function to avoid
duplication.
---
 oauth2.el | 109 +++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 70 insertions(+), 39 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index eb2ae0cb9b..87fa1f0793 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -84,6 +84,23 @@
   (when oauth2-debug
     (apply #'oauth2--do-warn msg)))
 
+(defun oauth2--current-timestamp ()
+  "Get the current timestamp in seconds."
+  (time-convert nil 'integer))
+
+(defun oauth2--update-plstore (plstore token)
+  "Update the file storage with handle PLSTORE with the value in TOKEN."
+  (plstore-put plstore (oauth2-token-plstore-id token)
+               nil `(:access-token
+                     ,(oauth2-token-access-token token)
+                     :refresh-token
+                     ,(oauth2-token-refresh-token token)
+                     :request-timestamp
+                     ,(oauth2-token-request-timestamp token)
+                     :access-response
+                     ,(oauth2-token-access-response token)))
+  (plstore-save plstore))
+
 (defun oauth2-request-authorization (auth-url client-id &optional scope state
                                               redirect-uri)
   "Request OAuth authorization at AUTH-URL by launching `browse-url'.
@@ -142,11 +159,13 @@ Returns the code provided by the service."
   client-secret
   access-token
   refresh-token
+  request-timestamp
+  auth-url
   token-url
   access-response)
 
-(defun oauth2-request-access (token-url client-id client-secret code
-                                        &optional redirect-uri)
+(defun oauth2-request-access (auth-url token-url client-id client-secret code
+                                       &optional redirect-uri)
   "Request OAuth access.
 TOKEN-URL is the URL for making the request.  CLIENT-ID and
 CLIENT-SECRET are provided by the service provider.  The CODE should be
@@ -156,8 +175,10 @@ usually \"urn:ietf:wg:oauth:2.0:oob\".
 
 Returns an `oauth2-token'."
   (when code
-    (let ((result
+    (let ((request-timestamp (oauth2--current-timestamp))
+          (result
            (oauth2-make-access-request
+            auth-url
             token-url
             (url-encode-url
              (concat
@@ -171,6 +192,8 @@ Returns an `oauth2-token'."
                          :client-secret client-secret
                          :access-token (cdr (assoc 'access_token result))
                          :refresh-token (cdr (assoc 'refresh_token result))
+                         :request-timestamp request-timestamp
+                         :auth-url auth-url
                          :token-url token-url
                          :access-response result))))
 
@@ -178,36 +201,47 @@ Returns an `oauth2-token'."
 (defun oauth2-refresh-access (token)
   "Refresh OAuth access TOKEN.
 TOKEN should be obtained with `oauth2-request-access'."
-  (setf (oauth2-token-access-token token)
-        (cdr (assoc 'access_token
-                    (oauth2-make-access-request
-                     (oauth2-token-token-url token)
-                     (concat "client_id=" (oauth2-token-client-id token)
-                             (when (oauth2-token-client-secret token)
-                               (concat "&client_secret="
-                                       (oauth2-token-client-secret token)))
-                             "&refresh_token="
-                             (oauth2-token-refresh-token token)
-                             "&grant_type=refresh_token")))))
-  ;; If the token has a plstore, update it
-  (let ((plstore (oauth2-token-plstore token)))
-    (when plstore
-      (plstore-put plstore (oauth2-token-plstore-id token)
-                   nil `(:access-token
-                         ,(oauth2-token-access-token token)
-                         :refresh-token
-                         ,(oauth2-token-refresh-token token)
-                         :access-response
-                         ,(oauth2-token-access-response token)
-                         ))
-      (plstore-save plstore)))
+  (if-let* ((func-name (nth 1 (backtrace-frame 2)))
+            (current-timestamp (oauth2--current-timestamp))
+            (request-timestamp (oauth2-token-request-timestamp token))
+            (timestamp-difference (- current-timestamp request-timestamp))
+            (expires-in (cdr (assoc 'expires_in
+                                    (oauth2-token-access-response token))))
+            (cache-valid
+             (progn
+               (oauth2--do-trivia (concat "%s: current-timestamp: %d, "
+                                          "previous request-timestamp: %d, "
+                                          "timestamp difference: %d; "
+                                          "expires-in: %d, ")
+                                  func-name current-timestamp request-timestamp
+                                  timestamp-difference expires-in)
+               (< timestamp-difference expires-in))))
+      (oauth2--do-debug "%s: reusing cached access-token." func-name)
+
+    (oauth2--do-debug "%s: requesting new access-token." func-name)
+    (setf (oauth2-token-request-timestamp token) current-timestamp)
+    (setf (oauth2-token-access-token token)
+          (cdr (assoc 'access_token
+                      (oauth2-make-access-request
+                       (oauth2-token-token-url token)
+                       (concat "client_id=" (oauth2-token-client-id token)
+                               (when (oauth2-token-client-secret token)
+                                 (concat "&client_secret="
+                                         (oauth2-token-client-secret token)))
+                               "&refresh_token="
+                               (oauth2-token-refresh-token token)
+                               "&grant_type=refresh_token")))))
+    (when-let* ((plstore (oauth2-token-plstore token)))
+     (oauth2--update-plstore plstore token)))
+
   token)
 
 ;;;###autoload
 (defun oauth2-auth (auth-url token-url client-id client-secret
-                             &optional scope state redirect-uri)
+                             &optional state redirect-uri)
   "Authenticate application via OAuth2."
   (oauth2-request-access
+   auth-url
    token-url
    client-id
    client-secret
@@ -234,32 +268,29 @@ redirect response.
 Returns an `oauth2-token'."
   ;; We store a MD5 sum of all URL
   (let* ((plstore (plstore-open oauth2-token-file))
-         (id (oauth2-compute-id auth-url token-url scope client-id))
-         (plist (cdr (plstore-get plstore id))))
+         (plstore-id (oauth2-compute-id auth-url token-url scope client-id))
+         (plist (cdr (plstore-get plstore plstore-id))))
     ;; Check if we found something matching this access
     (if plist
         ;; We did, return the token object
         (make-oauth2-token :plstore plstore
-                           :plstore-id id
+                           :plstore-id plstore-id
                            :client-id client-id
                            :client-secret client-secret
                            :access-token (plist-get plist :access-token)
                            :refresh-token (plist-get plist :refresh-token)
+                           :request-timestamp (plist-get plist
+                                                         :request-timestamp)
+                           :auth-url auth-url
                            :token-url token-url
                            :access-response (plist-get plist :access-response))
       (let ((token (oauth2-auth auth-url token-url
-                                client-id client-secret scope state
+                                client-id client-secret state
                                 redirect-uri)))
         ;; Set the plstore
         (setf (oauth2-token-plstore token) plstore)
-        (setf (oauth2-token-plstore-id token) id)
-        (plstore-put plstore id nil `(:access-token
-                                      ,(oauth2-token-access-token token)
-                                      :refresh-token
-                                      ,(oauth2-token-refresh-token token)
-                                      :access-response
-                                      ,(oauth2-token-access-response token)))
-        (plstore-save plstore)
+        (setf (oauth2-token-plstore-id token) plstore-id)
+        (oauth2--update-plstore plstore token)
         token))))
 
 (provide 'oauth2)
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:08 GMT) Full text and rfc822 format available.

Message #38 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 10/11] Close the plstore handle after use
Date: Sun,  3 Aug 2025 17:20:48 -0700
Before this, the plstore stores a handle to `oauth2-token-file' and it
is kept open at all times.  This may cause issues when the file is
accessed by other processes and it may confuse Emacs. This patch
ensures that the plstore is properly closed upon each use.

Note that the plstore field in oauth2-token is unused and will always
be nil but is kept for backward-compatibility for now.
---
 oauth2.el | 57 ++++++++++++++++++++++++++++++-------------------------
 1 file changed, 31 insertions(+), 26 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index 87fa1f0793..e4e9ff8d6c 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -84,6 +84,13 @@
   (when oauth2-debug
     (apply #'oauth2--do-warn msg)))
 
+(defmacro oauth2--with-plstore (&rest body)
+  "A macro that ensures the plstore is closed after use."
+  `(let ((plstore (plstore-open oauth2-token-file)))
+     (unwind-protect
+         (progn ,@body)
+       (plstore-close plstore))))
+
 (defun oauth2--current-timestamp ()
   "Get the current timestamp in seconds."
   (time-convert nil 'integer))
@@ -231,7 +238,7 @@ TOKEN should be obtained with `oauth2-request-access'."
                                "&refresh_token="
                                (oauth2-token-refresh-token token)
                                "&grant_type=refresh_token")))))
-    (when-let* ((plstore (oauth2-token-plstore token)))
+    (oauth2--with-plstore
      (oauth2--update-plstore plstore token)))
 
   token)
@@ -267,31 +274,29 @@ redirect response.
 
 Returns an `oauth2-token'."
   ;; We store a MD5 sum of all URL
-  (let* ((plstore (plstore-open oauth2-token-file))
-         (plstore-id (oauth2-compute-id auth-url token-url scope client-id))
-         (plist (cdr (plstore-get plstore plstore-id))))
-    ;; Check if we found something matching this access
-    (if plist
-        ;; We did, return the token object
-        (make-oauth2-token :plstore plstore
-                           :plstore-id plstore-id
-                           :client-id client-id
-                           :client-secret client-secret
-                           :access-token (plist-get plist :access-token)
-                           :refresh-token (plist-get plist :refresh-token)
-                           :request-timestamp (plist-get plist
-                                                         :request-timestamp)
-                           :auth-url auth-url
-                           :token-url token-url
-                           :access-response (plist-get plist :access-response))
-      (let ((token (oauth2-auth auth-url token-url
-                                client-id client-secret state
-                                redirect-uri)))
-        ;; Set the plstore
-        (setf (oauth2-token-plstore token) plstore)
-        (setf (oauth2-token-plstore-id token) plstore-id)
-        (oauth2--update-plstore plstore token)
-        token))))
+  (oauth2--with-plstore
+   (let* ((plstore-id (oauth2-compute-id auth-url token-url scope client-id))
+          (plist (cdr (plstore-get plstore plstore-id))))
+     ;; Check if we found something matching this access
+     (if plist
+         ;; We did, return the token object
+         (make-oauth2-token :plstore-id plstore-id
+                            :client-id client-id
+                            :client-secret client-secret
+                            :access-token (plist-get plist :access-token)
+                            :refresh-token (plist-get plist :refresh-token)
+                            :request-timestamp (plist-get plist
+                                                          :request-timestamp)
+                            :auth-url auth-url
+                            :token-url token-url
+                            :access-response (plist-get plist :access-response))
+       (let ((token (oauth2-auth auth-url token-url
+                                 client-id client-secret state
+                                 redirect-uri)))
+         ;; Set the plstore
+         (setf (oauth2-token-plstore-id token) plstore-id)
+         (oauth2--update-plstore plstore token)
+         token)))))
 
 (provide 'oauth2)
 
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Mon, 04 Aug 2025 00:22:09 GMT) Full text and rfc822 format available.

Message #41 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 11/11] Address several package-lint warnings/errors
Date: Sun,  3 Aug 2025 17:20:49 -0700
* Add URL.

* Require (emacs "27.1") for `time-convert', `if-let*', plstore, etc.,
and drop (cl-lib "0.5") which is already met by newer emacs version.
---
 oauth2.el | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/oauth2.el b/oauth2.el
index e4e9ff8d6c..73e3191063 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -4,8 +4,9 @@
 
 ;; Author: Julien Danjou <julien <at> danjou.info>
 ;; Version: 0.17
+;; URL: https://elpa.gnu.org/packages/oauth2.html
 ;; Keywords: comm
-;; Package-Requires: ((cl-lib "0.5"))
+;; Package-Requires: ((emacs "27.1"))
 
 ;; This file is part of GNU Emacs.
 
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Fri, 08 Aug 2025 10:03:02 GMT) Full text and rfc822 format available.

Message #44 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Sean Whitton <spwhitton <at> spwhitton.name>
To: Xiyue Deng <manphiz <at> gmail.com>
Cc: 79168 <at> debbugs.gnu.org
Subject: Re: bug#79168: Proposed changes for oauth2
Date: Fri, 08 Aug 2025 11:02:11 +0100
Hello,

On Sun 03 Aug 2025 at 05:20pm -07, Xiyue Deng wrote:

> I propose the series of changes for oauth2 which would lead to the
> next release of 0.18.
>
> Each commit message explains what is done.  Please let me know if
> anything is unclear.

Thank you very much for working on this library.

We need the commit messages to be in our CHANGELOG format as described
in CONTRIBUTING.  Additional explanations for changes we prefer to be in
comments rather than in the commit message.

Finally, you use oauth2 daily, right?
Therefore everything has been fairly thoroughly tested?

-- 
Sean Whitton




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:47:02 GMT) Full text and rfc822 format available.

Message #47 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: Proposed changes for oauth2 V2
Date: Fri,  8 Aug 2025 23:45:39 -0700
Update commit messages to conform to the format in CONTRIBUTE.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:47:03 GMT) Full text and rfc822 format available.

Message #50 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 03/11] Reorder code to put defcustom/defvar at the beginning
 part
Date: Fri,  8 Aug 2025 23:45:42 -0700
(Adapted from bug#52476 by Aleksandr Vityazev.)
* packages/oauth2/oauth2.el: Put oauth2-token-file,
oauth2--url-advice, and oauth--token-data to the beginning part of the
source code.
---
 oauth2.el | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index c3aa45ed69..eccf439130 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -53,9 +53,17 @@
   :link '(url-link :tag "Savannah" "https://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/?h=externals/oauth2")
   :link '(url-link :tag "ELPA" "https://elpa.gnu.org/packages/oauth2.html"))
 
+(defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
+  "File path where store OAuth tokens."
+  :group 'oauth2
+  :type 'file)
+
 (defvar oauth2-debug nil
   "Enable verbose logging in oauth2 to help debugging.")
 
+(defvar oauth--url-advice nil)
+(defvar oauth--token-data)
+
 (defun oauth2--do-debug (&rest msg)
   "Output debug messages when `oauth2-debug' is enabled."
   (when oauth2-debug
@@ -174,11 +182,6 @@ TOKEN should be obtained with `oauth2-request-access'."
     auth-url client-id scope state redirect-uri)
    redirect-uri))
 
-(defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
-  "File path where store OAuth tokens."
-  :group 'oauth2
-  :type 'file)
-
 (defun oauth2-compute-id (auth-url token-url scope client-id)
   "Compute an unique id based on URLs.
 This allows to store the token in an unique way."
@@ -222,9 +225,6 @@ This allows to store the token in an unique way."
           (if (string-match-p "\?" url) "&" "?")
           "access_token=" (oauth2-token-access-token token)))
 
-(defvar oauth--url-advice nil)
-(defvar oauth--token-data)
-
 (defun oauth2-authz-bearer-header (token)
   "Return `Authoriztions: Bearer' header with TOKEN."
   (cons "Authorization" (format "Bearer %s" token)))
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:02 GMT) Full text and rfc822 format available.

Message #53 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 02/11] Untabify source code
Date: Fri,  8 Aug 2025 23:45:41 -0700
* packages/oauth2/oauth2.el (oauth2-request-access): Untabify
---
 oauth2.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/oauth2.el b/oauth2.el
index 70c59e7513..c3aa45ed69 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -145,7 +145,7 @@ TOKEN should be obtained with `oauth2-request-access'."
                     (oauth2-make-access-request
                      (oauth2-token-token-url token)
                      (concat "client_id=" (oauth2-token-client-id token)
-			     (when (oauth2-token-client-secret token)
+                             (when (oauth2-token-client-secret token)
                                (concat "&client_secret=" (oauth2-token-client-secret token)))
                              "&refresh_token=" (oauth2-token-refresh-token token)
                              "&grant_type=refresh_token")))))
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:02 GMT) Full text and rfc822 format available.

Message #56 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 05/11] Documentation updates
Date: Fri,  8 Aug 2025 23:45:44 -0700
(Some adapted from bug#52746 by Aleksandr Vityazev.)
* packages/oauth2/oauth2.el: Update module commments to better reflect
its usage.  Also update function documentations.
---
 oauth2.el | 55 +++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 39 insertions(+), 16 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index ef82a64c5f..ba7125e79b 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -27,12 +27,12 @@
 ;; Implementation of the OAuth 2.0 draft.
 ;;
 ;; The main entry point is `oauth2-auth-and-store' which will return a token
-;; structure.  This token structure can be then used with
-;; `oauth2-url-retrieve-synchronously' or `oauth2-url-retrieve' to retrieve
-;; any data that need OAuth authentication to be accessed.
+;; structure, which contains information needed for OAuth2 authentication,
+;; e.g. access_token, refresh_token, etc.
 ;;
-;; If the token needs to be refreshed, the code handles it automatically and
-;; store the new value of the access token.
+;; If the token needs to be refreshed, call `oauth2-refresh-access' on the token
+;; and it will be refreshed with a new access_token.  The code will also store
+;; the new value of the access token for reuse.
 
 ;;; Code:
 
@@ -72,8 +72,14 @@
 
 (defun oauth2-request-authorization (auth-url client-id &optional scope state redirect-uri)
   "Request OAuth authorization at AUTH-URL by launching `browse-url'.
-CLIENT-ID is the client id provided by the provider.
-It returns the code provided by the service."
+CLIENT-ID is the client id provided by the provider which uses
+REDIRECT-URI when requesting an access-token.  The default redirect_uri
+for desktop application is usually \"urn:ietf:wg:oauth:2.0:oob\".  SCOPE
+identifies the resources that your application can access on the user's
+behalf.  STATE is a string that your application uses to maintain the
+state between the request and redirect response.
+
+Returns the code provided by the service."
   (let ((url (concat auth-url
                      (if (string-match-p "\?" auth-url) "&" "?")
                      "client_id=" (url-hexify-string client-id)
@@ -97,7 +103,7 @@ It returns the code provided by the service."
     (json-read)))
 
 (defun oauth2-make-access-request (url data)
-  "Make an access request to URL using DATA in POST."
+  "Make an access request to URL using DATA in POST requests."
   (let ((func-name (nth 1 (backtrace-frame 2))))
     (oauth2--do-debug "%s: url: %s" func-name url)
     (oauth2--do-debug "%s: data: %s" func-name data)
@@ -122,9 +128,14 @@ It returns the code provided by the service."
   access-response)
 
 (defun oauth2-request-access (token-url client-id client-secret code &optional redirect-uri)
-  "Request OAuth access at TOKEN-URL.
-The CODE should be obtained with `oauth2-request-authorization'.
-Return an `oauth2-token' structure."
+  "Request OAuth access.
+TOKEN-URL is the URL for making the request.  CLIENT-ID and
+CLIENT-SECRET are provided by the service provider.  The CODE should be
+obtained with `oauth2-request-authorization'.  REDIRECT-URI is used when
+requesting access-token.  The default value for desktop application is
+usually \"urn:ietf:wg:oauth:2.0:oob\".
+
+Returns an `oauth2-token'."
   (when code
     (let ((result
            (oauth2-make-access-request
@@ -183,13 +194,21 @@ TOKEN should be obtained with `oauth2-request-access'."
    redirect-uri))
 
 (defun oauth2-compute-id (auth-url token-url scope client-id)
-  "Compute an unique id based on URLs.
+  "Compute an unique id based on AUTH-URL, TOKEN-URL, SCOPE, and CLIENT-ID.
 This allows to store the token in an unique way."
   (secure-hash 'sha512 (concat auth-url token-url scope client-id)))
 
 ;;;###autoload
 (defun oauth2-auth-and-store (auth-url token-url scope client-id client-secret &optional redirect-uri state)
-  "Request access to a resource and store it using `plstore'."
+  "Request access to a resource and store it.
+AUTH-URL and TOKEN-URL are provided by the service provider.  CLIENT-ID
+and CLIENT-SECRET should be generated by the service provider when a
+user registers an application.  SCOPE identifies the resources that your
+application can access on the user's behalf.  STATE is a string that
+your application uses to maintain the state between the request and
+redirect response.
+
+Returns an `oauth2-token'."
   ;; We store a MD5 sum of all URL
   (let* ((plstore (plstore-open oauth2-token-file))
          (id (oauth2-compute-id auth-url token-url scope client-id))
@@ -256,7 +275,9 @@ This allows to store the token in an unique way."
 ;;;###autoload
 (defun oauth2-url-retrieve-synchronously (token url &optional request-method request-data request-extra-headers)
   "Retrieve an URL synchronously using TOKEN to access it.
-TOKEN can be obtained with `oauth2-auth'."
+TOKEN can be obtained with `oauth2-auth'.  REQUEST-METHOD, REQUEST-DATA,
+and REQUEST-EXTRA-HEADERS are used when retrieving URL.  See also
+`url-retrieve-synchronously'."
   (let* ((oauth2--token-data (cons token url)))
     (let ((oauth2--url-advice t)         ;Activate our advice.
           (url-request-method request-method)
@@ -270,8 +291,10 @@ TOKEN can be obtained with `oauth2-auth'."
                                   cbargs
                                   request-method request-data request-extra-headers)
   "Retrieve an URL asynchronously using TOKEN to access it.
-TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with CBARGS
-when finished.  See `url-retrieve'."
+TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with
+CBARGS when finished. TOKEN can be obtained with `oauth2-auth'.
+REQUEST-METHOD, REQUEST-DATA, and REQUEST-EXTRA-HEADERS are used when
+retrieving URL.  See also `url-retrieve'."
   ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in `url-http-handle-authentication'.
   (let* ((oauth2--token-data (cons token url)))
     (let ((oauth2--url-advice t)         ;Activate our advice.
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:03 GMT) Full text and rfc822 format available.

Message #59 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 01/11] Small fix for backtrace-frame
Date: Fri,  8 Aug 2025 23:45:40 -0700
* packages/oauth2/oauth2.el (oauth2-make-access-request): Using
`(backtrace-frame 2)' for the intended function name.
---
 oauth2.el | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/oauth2.el b/oauth2.el
index 87e0c39c5c..70c59e7513 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -90,7 +90,7 @@ It returns the code provided by the service."
 
 (defun oauth2-make-access-request (url data)
   "Make an access request to URL using DATA in POST."
-  (let ((func-name (nth 1 (backtrace-frame 3))))
+  (let ((func-name (nth 1 (backtrace-frame 2))))
     (oauth2--do-debug "%s: url: %s" func-name url)
     (oauth2--do-debug "%s: data: %s" func-name data)
     (let ((url-request-method "POST")
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:03 GMT) Full text and rfc822 format available.

Message #62 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 08/11] Implement trivia debug message for more fine-grained
 logging
Date: Fri,  8 Aug 2025 23:45:47 -0700
* packages/oauth2/oauth2.el: Add oauth2--do-warn, oauth2--do-trivia.
* packages/oauth2/oauth2.el (oauth2-make-access-request): Use
oauth2--do-trivia for detailed logging.
---
 oauth2.el | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index 6f7b6a27db..eb2ae0cb9b 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -65,11 +65,24 @@
 (defvar oauth2--url-advice nil)
 (defvar oauth2--token-data)
 
+(defun oauth2--do-warn (&rest msg)
+  "Actual function to log MSG based on how `oauth2-debug' is set."
+  (setcar msg (concat "[oauth2] " (car msg)))
+  (apply (if (functionp oauth2-debug)
+             oauth2-debug
+           'message)
+         msg))
+
+(defun oauth2--do-trivia (&rest msg)
+  "Output debug message when `oauth2-debug' is set to \\='trivia."
+  (when (or (eq oauth2-debug 'trivia)
+            (functionp oauth2-debug))
+    (apply #'oauth2--do-warn msg)))
+
 (defun oauth2--do-debug (&rest msg)
   "Output debug messages when `oauth2-debug' is enabled."
   (when oauth2-debug
-    (setcar msg (concat "[oauth2] " (car msg)))
-    (apply #'message msg)))
+    (apply #'oauth2--do-warn msg)))
 
 (defun oauth2-request-authorization (auth-url client-id &optional scope state
                                               redirect-uri)
@@ -109,8 +122,8 @@ Returns the code provided by the service."
 (defun oauth2-make-access-request (url data)
   "Make an access request to URL using DATA in POST requests."
   (let ((func-name (nth 1 (backtrace-frame 2))))
-    (oauth2--do-debug "%s: url: %s" func-name url)
-    (oauth2--do-debug "%s: data: %s" func-name data)
+    (oauth2--do-trivia "%s: url: %s" func-name url)
+    (oauth2--do-trivia "%s: data: %s" func-name data)
     (let ((url-request-method "POST")
           (url-request-data data)
           (url-request-extra-headers
@@ -118,7 +131,8 @@ Returns the code provided by the service."
       (with-current-buffer (url-retrieve-synchronously url)
         (let ((data (oauth2-request-access-parse)))
           (kill-buffer (current-buffer))
-          (oauth2--do-debug "%s: response: %s" func-name (prin1-to-string data))
+          (oauth2--do-trivia "%s: response: %s" func-name
+                             (prin1-to-string data))
           data)))))
 
 (cl-defstruct oauth2-token
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:04 GMT) Full text and rfc822 format available.

Message #65 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 04/11] Rename internal variables using consistent oauth2 prefix
Date: Fri,  8 Aug 2025 23:45:43 -0700
(Adapted from bug#52476 by Aleksandr Vityazev.)
* packages/oauth2/oauth2.el: Rename internal variables
oauth--url-advice and oauth--token-data to use oauth2 prefix.
---
 oauth2.el | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index eccf439130..ef82a64c5f 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -61,8 +61,8 @@
 (defvar oauth2-debug nil
   "Enable verbose logging in oauth2 to help debugging.")
 
-(defvar oauth--url-advice nil)
-(defvar oauth--token-data)
+(defvar oauth2--url-advice nil)
+(defvar oauth2--token-data)
 
 (defun oauth2--do-debug (&rest msg)
   "Output debug messages when `oauth2-debug' is enabled."
@@ -231,20 +231,20 @@ This allows to store the token in an unique way."
 
 (defun oauth2-extra-headers (extra-headers)
   "Return EXTRA-HEADERS with `Authorization: Bearer' added."
-  (cons (oauth2-authz-bearer-header (oauth2-token-access-token (car oauth--token-data)))
+  (cons (oauth2-authz-bearer-header (oauth2-token-access-token (car oauth2--token-data)))
         extra-headers))
 
 
 ;; FIXME: We should change URL so that this can be done without an advice.
 (defun oauth2--url-http-handle-authentication-hack (orig-fun &rest args)
-  (if (not oauth--url-advice)
+  (if (not oauth2--url-advice)
       (apply orig-fun args)
     (let ((url-request-method url-http-method)
           (url-request-data url-http-data)
           (url-request-extra-headers
            (oauth2-extra-headers url-http-extra-headers)))
-      (oauth2-refresh-access (car oauth--token-data))
-      (url-retrieve-internal (cdr oauth--token-data)
+      (oauth2-refresh-access (car oauth2--token-data))
+      (url-retrieve-internal (cdr oauth2--token-data)
                              url-callback-function
                              url-callback-arguments)
       ;; This is to make `url' think it's done.
@@ -257,8 +257,8 @@ This allows to store the token in an unique way."
 (defun oauth2-url-retrieve-synchronously (token url &optional request-method request-data request-extra-headers)
   "Retrieve an URL synchronously using TOKEN to access it.
 TOKEN can be obtained with `oauth2-auth'."
-  (let* ((oauth--token-data (cons token url)))
-    (let ((oauth--url-advice t)         ;Activate our advice.
+  (let* ((oauth2--token-data (cons token url)))
+    (let ((oauth2--url-advice t)         ;Activate our advice.
           (url-request-method request-method)
           (url-request-data request-data)
           (url-request-extra-headers
@@ -273,8 +273,8 @@ TOKEN can be obtained with `oauth2-auth'."
 TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with CBARGS
 when finished.  See `url-retrieve'."
   ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in `url-http-handle-authentication'.
-  (let* ((oauth--token-data (cons token url)))
-    (let ((oauth--url-advice t)         ;Activate our advice.
+  (let* ((oauth2--token-data (cons token url)))
+    (let ((oauth2--url-advice t)         ;Activate our advice.
           (url-request-method request-method)
           (url-request-data request-data)
           (url-request-extra-headers
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:04 GMT) Full text and rfc822 format available.

Message #68 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 07/11] Drop unused code
Date: Fri,  8 Aug 2025 23:45:46 -0700
* packages/oauth2/oauth2.el: Drop functions
oauth2-url-append-access-token, oauth2-authz-bearer-header,
oauth2-extra-headers, oauth2--url-http-handle-authentication-hack,
oauth2-url-retrieve-synchronously, oauth2-url-retrieve.  These
functions are not used by other functions and not required for getting
or refreshing token info.
* packages/oauth2/oauth2.el: Drop requirement of `(nadvice "0.3")'; no
longer using advice.
---
 oauth2.el | 72 +------------------------------------------------------
 1 file changed, 1 insertion(+), 71 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index 4541893346..6f7b6a27db 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -5,7 +5,7 @@
 ;; Author: Julien Danjou <julien <at> danjou.info>
 ;; Version: 0.17
 ;; Keywords: comm
-;; Package-Requires: ((cl-lib "0.5") (nadvice "0.3"))
+;; Package-Requires: ((cl-lib "0.5"))
 
 ;; This file is part of GNU Emacs.
 
@@ -248,76 +248,6 @@ Returns an `oauth2-token'."
         (plstore-save plstore)
         token))))
 
-(defun oauth2-url-append-access-token (token url)
-  "Append access token to URL."
-  (concat url
-          (if (string-match-p "\?" url) "&" "?")
-          "access_token=" (oauth2-token-access-token token)))
-
-(defun oauth2-authz-bearer-header (token)
-  "Return `Authoriztions: Bearer' header with TOKEN."
-  (cons "Authorization" (format "Bearer %s" token)))
-
-(defun oauth2-extra-headers (extra-headers)
-  "Return EXTRA-HEADERS with `Authorization: Bearer' added."
-  (cons (oauth2-authz-bearer-header
-         (oauth2-token-access-token (car oauth2--token-data)))
-        extra-headers))
-
-
-;; FIXME: We should change URL so that this can be done without an advice.
-(defun oauth2--url-http-handle-authentication-hack (orig-fun &rest args)
-  (if (not oauth2--url-advice)
-      (apply orig-fun args)
-    (let ((url-request-method url-http-method)
-          (url-request-data url-http-data)
-          (url-request-extra-headers
-           (oauth2-extra-headers url-http-extra-headers)))
-      (oauth2-refresh-access (car oauth2--token-data))
-      (url-retrieve-internal (cdr oauth2--token-data)
-                             url-callback-function
-                             url-callback-arguments)
-      ;; This is to make `url' think it's done.
-      (when (boundp 'success) (setq success t)) ;For URL library in Emacs<24.4.
-      t)))                                      ;For URL library in Emacs≄24.4.
-(advice-add 'url-http-handle-authentication :around
-            #'oauth2--url-http-handle-authentication-hack)
-
-;;;###autoload
-(defun oauth2-url-retrieve-synchronously (token url &optional request-method
-                                                request-data
-                                                request-extra-headers)
-  "Retrieve an URL synchronously using TOKEN to access it.
-TOKEN can be obtained with `oauth2-auth'.  REQUEST-METHOD, REQUEST-DATA,
-and REQUEST-EXTRA-HEADERS are used when retrieving URL.  See also
-`url-retrieve-synchronously'."
-  (let* ((oauth2--token-data (cons token url)))
-    (let ((oauth2--url-advice t)         ;Activate our advice.
-          (url-request-method request-method)
-          (url-request-data request-data)
-          (url-request-extra-headers
-           (oauth2-extra-headers request-extra-headers)))
-      (url-retrieve-synchronously url))))
-
-;;;###autoload
-(defun oauth2-url-retrieve (token url callback
-                                  &optional cbargs request-method request-data
-                                  request-extra-headers)
-  "Retrieve an URL asynchronously using TOKEN to access it.
-TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with
-CBARGS when finished. TOKEN can be obtained with `oauth2-auth'.
-REQUEST-METHOD, REQUEST-DATA, and REQUEST-EXTRA-HEADERS are used when
-retrieving URL.  See also `url-retrieve'."
-  ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in
-  ;; `url-http-handle-authentication'.
-  (let* ((oauth2--token-data (cons token url)))
-    (let ((oauth2--url-advice t)         ;Activate our advice.
-          (url-request-method request-method)
-          (url-request-data request-data)
-          (url-request-extra-headers
-           (oauth2-extra-headers request-extra-headers)))
-      (url-retrieve url callback cbargs))))
-
 (provide 'oauth2)
 
 ;;; oauth2.el ends here
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:05 GMT) Full text and rfc822 format available.

Message #71 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 10/11] Close the plstore handle after use
Date: Fri,  8 Aug 2025 23:45:49 -0700
Before this, the plstore stores a handle to `oauth2-token-file' and it
is kept open at all times.  This may cause issues when the file is
accessed by other processes and it may confuse Emacs. This patch
ensures that the plstore is properly closed upon each use.

Note that after this change, the plstore field in oauth2-token is
unused and will always be nil, but is kept for backward-compatibility
for now.

* packages/oauth2/oauth2.el (oauth2--with-plstore): Add macro.
* packages/oauth2/oauth2.el (oauth2-refresh-token,
oauth2-auth-and-store): Use oauth2--with-plstore to ensure closing the
plstore file.
---
 oauth2.el | 57 ++++++++++++++++++++++++++++++-------------------------
 1 file changed, 31 insertions(+), 26 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index 87fa1f0793..e4e9ff8d6c 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -84,6 +84,13 @@
   (when oauth2-debug
     (apply #'oauth2--do-warn msg)))
 
+(defmacro oauth2--with-plstore (&rest body)
+  "A macro that ensures the plstore is closed after use."
+  `(let ((plstore (plstore-open oauth2-token-file)))
+     (unwind-protect
+         (progn ,@body)
+       (plstore-close plstore))))
+
 (defun oauth2--current-timestamp ()
   "Get the current timestamp in seconds."
   (time-convert nil 'integer))
@@ -231,7 +238,7 @@ TOKEN should be obtained with `oauth2-request-access'."
                                "&refresh_token="
                                (oauth2-token-refresh-token token)
                                "&grant_type=refresh_token")))))
-    (when-let* ((plstore (oauth2-token-plstore token)))
+    (oauth2--with-plstore
      (oauth2--update-plstore plstore token)))
 
   token)
@@ -267,31 +274,29 @@ redirect response.
 
 Returns an `oauth2-token'."
   ;; We store a MD5 sum of all URL
-  (let* ((plstore (plstore-open oauth2-token-file))
-         (plstore-id (oauth2-compute-id auth-url token-url scope client-id))
-         (plist (cdr (plstore-get plstore plstore-id))))
-    ;; Check if we found something matching this access
-    (if plist
-        ;; We did, return the token object
-        (make-oauth2-token :plstore plstore
-                           :plstore-id plstore-id
-                           :client-id client-id
-                           :client-secret client-secret
-                           :access-token (plist-get plist :access-token)
-                           :refresh-token (plist-get plist :refresh-token)
-                           :request-timestamp (plist-get plist
-                                                         :request-timestamp)
-                           :auth-url auth-url
-                           :token-url token-url
-                           :access-response (plist-get plist :access-response))
-      (let ((token (oauth2-auth auth-url token-url
-                                client-id client-secret state
-                                redirect-uri)))
-        ;; Set the plstore
-        (setf (oauth2-token-plstore token) plstore)
-        (setf (oauth2-token-plstore-id token) plstore-id)
-        (oauth2--update-plstore plstore token)
-        token))))
+  (oauth2--with-plstore
+   (let* ((plstore-id (oauth2-compute-id auth-url token-url scope client-id))
+          (plist (cdr (plstore-get plstore plstore-id))))
+     ;; Check if we found something matching this access
+     (if plist
+         ;; We did, return the token object
+         (make-oauth2-token :plstore-id plstore-id
+                            :client-id client-id
+                            :client-secret client-secret
+                            :access-token (plist-get plist :access-token)
+                            :refresh-token (plist-get plist :refresh-token)
+                            :request-timestamp (plist-get plist
+                                                          :request-timestamp)
+                            :auth-url auth-url
+                            :token-url token-url
+                            :access-response (plist-get plist :access-response))
+       (let ((token (oauth2-auth auth-url token-url
+                                 client-id client-secret state
+                                 redirect-uri)))
+         ;; Set the plstore
+         (setf (oauth2-token-plstore-id token) plstore-id)
+         (oauth2--update-plstore plstore token)
+         token)))))
 
 (provide 'oauth2)
 
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:05 GMT) Full text and rfc822 format available.

Message #74 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 09/11] Support reusing cached access-token before it expires
Date: Fri,  8 Aug 2025 23:45:48 -0700
* packages/oauth2/oauth2.el (oauth2-token): Added new fields
`auth-url' and `request-timestamp' to support retrieving the cached
tokens and calculate expiration.
* packages/oauth2/oauth2.el (oauth2--current-timestamp): Add.
* packages/oauth2/oauth2.el (oauth2--update-plstore): Refactor code
for updating plstore storage in this function to avoid duplication.
* packages/oauth2/oauth2.el (oauth2-refresh-access): implement reusing
existing access-token if not expired.
---
 oauth2.el | 109 +++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 70 insertions(+), 39 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index eb2ae0cb9b..87fa1f0793 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -84,6 +84,23 @@
   (when oauth2-debug
     (apply #'oauth2--do-warn msg)))
 
+(defun oauth2--current-timestamp ()
+  "Get the current timestamp in seconds."
+  (time-convert nil 'integer))
+
+(defun oauth2--update-plstore (plstore token)
+  "Update the file storage with handle PLSTORE with the value in TOKEN."
+  (plstore-put plstore (oauth2-token-plstore-id token)
+               nil `(:access-token
+                     ,(oauth2-token-access-token token)
+                     :refresh-token
+                     ,(oauth2-token-refresh-token token)
+                     :request-timestamp
+                     ,(oauth2-token-request-timestamp token)
+                     :access-response
+                     ,(oauth2-token-access-response token)))
+  (plstore-save plstore))
+
 (defun oauth2-request-authorization (auth-url client-id &optional scope state
                                               redirect-uri)
   "Request OAuth authorization at AUTH-URL by launching `browse-url'.
@@ -142,11 +159,13 @@ Returns the code provided by the service."
   client-secret
   access-token
   refresh-token
+  request-timestamp
+  auth-url
   token-url
   access-response)
 
-(defun oauth2-request-access (token-url client-id client-secret code
-                                        &optional redirect-uri)
+(defun oauth2-request-access (auth-url token-url client-id client-secret code
+                                       &optional redirect-uri)
   "Request OAuth access.
 TOKEN-URL is the URL for making the request.  CLIENT-ID and
 CLIENT-SECRET are provided by the service provider.  The CODE should be
@@ -156,8 +175,10 @@ usually \"urn:ietf:wg:oauth:2.0:oob\".
 
 Returns an `oauth2-token'."
   (when code
-    (let ((result
+    (let ((request-timestamp (oauth2--current-timestamp))
+          (result
            (oauth2-make-access-request
+            auth-url
             token-url
             (url-encode-url
              (concat
@@ -171,6 +192,8 @@ Returns an `oauth2-token'."
                          :client-secret client-secret
                          :access-token (cdr (assoc 'access_token result))
                          :refresh-token (cdr (assoc 'refresh_token result))
+                         :request-timestamp request-timestamp
+                         :auth-url auth-url
                          :token-url token-url
                          :access-response result))))
 
@@ -178,36 +201,47 @@ Returns an `oauth2-token'."
 (defun oauth2-refresh-access (token)
   "Refresh OAuth access TOKEN.
 TOKEN should be obtained with `oauth2-request-access'."
-  (setf (oauth2-token-access-token token)
-        (cdr (assoc 'access_token
-                    (oauth2-make-access-request
-                     (oauth2-token-token-url token)
-                     (concat "client_id=" (oauth2-token-client-id token)
-                             (when (oauth2-token-client-secret token)
-                               (concat "&client_secret="
-                                       (oauth2-token-client-secret token)))
-                             "&refresh_token="
-                             (oauth2-token-refresh-token token)
-                             "&grant_type=refresh_token")))))
-  ;; If the token has a plstore, update it
-  (let ((plstore (oauth2-token-plstore token)))
-    (when plstore
-      (plstore-put plstore (oauth2-token-plstore-id token)
-                   nil `(:access-token
-                         ,(oauth2-token-access-token token)
-                         :refresh-token
-                         ,(oauth2-token-refresh-token token)
-                         :access-response
-                         ,(oauth2-token-access-response token)
-                         ))
-      (plstore-save plstore)))
+  (if-let* ((func-name (nth 1 (backtrace-frame 2)))
+            (current-timestamp (oauth2--current-timestamp))
+            (request-timestamp (oauth2-token-request-timestamp token))
+            (timestamp-difference (- current-timestamp request-timestamp))
+            (expires-in (cdr (assoc 'expires_in
+                                    (oauth2-token-access-response token))))
+            (cache-valid
+             (progn
+               (oauth2--do-trivia (concat "%s: current-timestamp: %d, "
+                                          "previous request-timestamp: %d, "
+                                          "timestamp difference: %d; "
+                                          "expires-in: %d, ")
+                                  func-name current-timestamp request-timestamp
+                                  timestamp-difference expires-in)
+               (< timestamp-difference expires-in))))
+      (oauth2--do-debug "%s: reusing cached access-token." func-name)
+
+    (oauth2--do-debug "%s: requesting new access-token." func-name)
+    (setf (oauth2-token-request-timestamp token) current-timestamp)
+    (setf (oauth2-token-access-token token)
+          (cdr (assoc 'access_token
+                      (oauth2-make-access-request
+                       (oauth2-token-token-url token)
+                       (concat "client_id=" (oauth2-token-client-id token)
+                               (when (oauth2-token-client-secret token)
+                                 (concat "&client_secret="
+                                         (oauth2-token-client-secret token)))
+                               "&refresh_token="
+                               (oauth2-token-refresh-token token)
+                               "&grant_type=refresh_token")))))
+    (when-let* ((plstore (oauth2-token-plstore token)))
+     (oauth2--update-plstore plstore token)))
+
   token)
 
 ;;;###autoload
 (defun oauth2-auth (auth-url token-url client-id client-secret
-                             &optional scope state redirect-uri)
+                             &optional state redirect-uri)
   "Authenticate application via OAuth2."
   (oauth2-request-access
+   auth-url
    token-url
    client-id
    client-secret
@@ -234,32 +268,29 @@ redirect response.
 Returns an `oauth2-token'."
   ;; We store a MD5 sum of all URL
   (let* ((plstore (plstore-open oauth2-token-file))
-         (id (oauth2-compute-id auth-url token-url scope client-id))
-         (plist (cdr (plstore-get plstore id))))
+         (plstore-id (oauth2-compute-id auth-url token-url scope client-id))
+         (plist (cdr (plstore-get plstore plstore-id))))
     ;; Check if we found something matching this access
     (if plist
         ;; We did, return the token object
         (make-oauth2-token :plstore plstore
-                           :plstore-id id
+                           :plstore-id plstore-id
                            :client-id client-id
                            :client-secret client-secret
                            :access-token (plist-get plist :access-token)
                            :refresh-token (plist-get plist :refresh-token)
+                           :request-timestamp (plist-get plist
+                                                         :request-timestamp)
+                           :auth-url auth-url
                            :token-url token-url
                            :access-response (plist-get plist :access-response))
       (let ((token (oauth2-auth auth-url token-url
-                                client-id client-secret scope state
+                                client-id client-secret state
                                 redirect-uri)))
         ;; Set the plstore
         (setf (oauth2-token-plstore token) plstore)
-        (setf (oauth2-token-plstore-id token) id)
-        (plstore-put plstore id nil `(:access-token
-                                      ,(oauth2-token-access-token token)
-                                      :refresh-token
-                                      ,(oauth2-token-refresh-token token)
-                                      :access-response
-                                      ,(oauth2-token-access-response token)))
-        (plstore-save plstore)
+        (setf (oauth2-token-plstore-id token) plstore-id)
+        (oauth2--update-plstore plstore token)
         token))))
 
 (provide 'oauth2)
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:06 GMT) Full text and rfc822 format available.

Message #77 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 11/11] Address several package-lint warnings/errors
Date: Fri,  8 Aug 2025 23:45:50 -0700
* packages/oauth2/oauth2.el: Add URL.
* packages/oauth2/oauth2.el: Require (emacs "27.1") for
`time-convert', `if-let*', plstore, etc., and drop (cl-lib "0.5")
which is already met by newer emacs version.
---
 oauth2.el | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/oauth2.el b/oauth2.el
index e4e9ff8d6c..73e3191063 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -4,8 +4,9 @@
 
 ;; Author: Julien Danjou <julien <at> danjou.info>
 ;; Version: 0.17
+;; URL: https://elpa.gnu.org/packages/oauth2.html
 ;; Keywords: comm
-;; Package-Requires: ((cl-lib "0.5"))
+;; Package-Requires: ((emacs "27.1"))
 
 ;; This file is part of GNU Emacs.
 
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:48:06 GMT) Full text and rfc822 format available.

Message #80 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: 79168 <at> debbugs.gnu.org
Cc: Xiyue Deng <manphiz <at> gmail.com>
Subject: [PATCH 06/11] Reformat most lines to be less than 80 characters long
Date: Fri,  8 Aug 2025 23:45:45 -0700
* packages/oauth2/oauth2.el: Try to conform to 80-column rule.
---
 oauth2.el | 44 +++++++++++++++++++++++++++++---------------
 1 file changed, 29 insertions(+), 15 deletions(-)

diff --git a/oauth2.el b/oauth2.el
index ba7125e79b..4541893346 100644
--- a/oauth2.el
+++ b/oauth2.el
@@ -50,7 +50,8 @@
 (defgroup oauth2 nil
   "OAuth 2.0 Authorization Protocol."
   :group 'comm
-  :link '(url-link :tag "Savannah" "https://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/?h=externals/oauth2")
+  :link '(url-link :tag "Savannah"
+                   "https://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/?h=externals/oauth2")
   :link '(url-link :tag "ELPA" "https://elpa.gnu.org/packages/oauth2.html"))
 
 (defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
@@ -70,7 +71,8 @@
     (setcar msg (concat "[oauth2] " (car msg)))
     (apply #'message msg)))
 
-(defun oauth2-request-authorization (auth-url client-id &optional scope state redirect-uri)
+(defun oauth2-request-authorization (auth-url client-id &optional scope state
+                                              redirect-uri)
   "Request OAuth authorization at AUTH-URL by launching `browse-url'.
 CLIENT-ID is the client id provided by the provider which uses
 REDIRECT-URI when requesting an access-token.  The default redirect_uri
@@ -84,7 +86,9 @@ Returns the code provided by the service."
                      (if (string-match-p "\?" auth-url) "&" "?")
                      "client_id=" (url-hexify-string client-id)
                      "&response_type=code"
-                     "&redirect_uri=" (url-hexify-string (or redirect-uri "urn:ietf:wg:oauth:2.0:oob"))
+                     "&redirect_uri=" (url-hexify-string
+                                       (or redirect-uri
+                                           "urn:ietf:wg:oauth:2.0:oob"))
                      (if scope (concat "&scope=" (url-hexify-string scope)) "")
                      (if state (concat "&state=" (url-hexify-string state)) "")
                      ;; The following two parameters are required for Gmail
@@ -127,7 +131,8 @@ Returns the code provided by the service."
   token-url
   access-response)
 
-(defun oauth2-request-access (token-url client-id client-secret code &optional redirect-uri)
+(defun oauth2-request-access (token-url client-id client-secret code
+                                        &optional redirect-uri)
   "Request OAuth access.
 TOKEN-URL is the URL for making the request.  CLIENT-ID and
 CLIENT-SECRET are provided by the service provider.  The CODE should be
@@ -165,8 +170,10 @@ TOKEN should be obtained with `oauth2-request-access'."
                      (oauth2-token-token-url token)
                      (concat "client_id=" (oauth2-token-client-id token)
                              (when (oauth2-token-client-secret token)
-                               (concat "&client_secret=" (oauth2-token-client-secret token)))
-                             "&refresh_token=" (oauth2-token-refresh-token token)
+                               (concat "&client_secret="
+                                       (oauth2-token-client-secret token)))
+                             "&refresh_token="
+                             (oauth2-token-refresh-token token)
                              "&grant_type=refresh_token")))))
   ;; If the token has a plstore, update it
   (let ((plstore (oauth2-token-plstore token)))
@@ -183,7 +190,8 @@ TOKEN should be obtained with `oauth2-request-access'."
   token)
 
 ;;;###autoload
-(defun oauth2-auth (auth-url token-url client-id client-secret &optional scope state redirect-uri)
+(defun oauth2-auth (auth-url token-url client-id client-secret
+                             &optional scope state redirect-uri)
   "Authenticate application via OAuth2."
   (oauth2-request-access
    token-url
@@ -199,7 +207,8 @@ This allows to store the token in an unique way."
   (secure-hash 'sha512 (concat auth-url token-url scope client-id)))
 
 ;;;###autoload
-(defun oauth2-auth-and-store (auth-url token-url scope client-id client-secret &optional redirect-uri state)
+(defun oauth2-auth-and-store (auth-url token-url scope client-id client-secret
+                                       &optional redirect-uri state)
   "Request access to a resource and store it.
 AUTH-URL and TOKEN-URL are provided by the service provider.  CLIENT-ID
 and CLIENT-SECRET should be generated by the service provider when a
@@ -225,7 +234,8 @@ Returns an `oauth2-token'."
                            :token-url token-url
                            :access-response (plist-get plist :access-response))
       (let ((token (oauth2-auth auth-url token-url
-                                client-id client-secret scope state redirect-uri)))
+                                client-id client-secret scope state
+                                redirect-uri)))
         ;; Set the plstore
         (setf (oauth2-token-plstore token) plstore)
         (setf (oauth2-token-plstore-id token) id)
@@ -250,7 +260,8 @@ Returns an `oauth2-token'."
 
 (defun oauth2-extra-headers (extra-headers)
   "Return EXTRA-HEADERS with `Authorization: Bearer' added."
-  (cons (oauth2-authz-bearer-header (oauth2-token-access-token (car oauth2--token-data)))
+  (cons (oauth2-authz-bearer-header
+         (oauth2-token-access-token (car oauth2--token-data)))
         extra-headers))
 
 
@@ -273,7 +284,9 @@ Returns an `oauth2-token'."
             #'oauth2--url-http-handle-authentication-hack)
 
 ;;;###autoload
-(defun oauth2-url-retrieve-synchronously (token url &optional request-method request-data request-extra-headers)
+(defun oauth2-url-retrieve-synchronously (token url &optional request-method
+                                                request-data
+                                                request-extra-headers)
   "Retrieve an URL synchronously using TOKEN to access it.
 TOKEN can be obtained with `oauth2-auth'.  REQUEST-METHOD, REQUEST-DATA,
 and REQUEST-EXTRA-HEADERS are used when retrieving URL.  See also
@@ -287,15 +300,16 @@ and REQUEST-EXTRA-HEADERS are used when retrieving URL.  See also
       (url-retrieve-synchronously url))))
 
 ;;;###autoload
-(defun oauth2-url-retrieve (token url callback &optional
-                                  cbargs
-                                  request-method request-data request-extra-headers)
+(defun oauth2-url-retrieve (token url callback
+                                  &optional cbargs request-method request-data
+                                  request-extra-headers)
   "Retrieve an URL asynchronously using TOKEN to access it.
 TOKEN can be obtained with `oauth2-auth'.  CALLBACK gets called with
 CBARGS when finished. TOKEN can be obtained with `oauth2-auth'.
 REQUEST-METHOD, REQUEST-DATA, and REQUEST-EXTRA-HEADERS are used when
 retrieving URL.  See also `url-retrieve'."
-  ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in `url-http-handle-authentication'.
+  ;; TODO add support for SILENT and INHIBIT-COOKIES.  How to handle this in
+  ;; `url-http-handle-authentication'.
   (let* ((oauth2--token-data (cons token url)))
     (let ((oauth2--url-advice t)         ;Activate our advice.
           (url-request-method request-method)
-- 
2.39.5





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 06:53:02 GMT) Full text and rfc822 format available.

Message #83 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: Sean Whitton <spwhitton <at> spwhitton.name>
Cc: 79168 <at> debbugs.gnu.org
Subject: Re: bug#79168: Proposed changes for oauth2
Date: Fri, 08 Aug 2025 23:52:13 -0700
[Message part 1 (text/plain, inline)]
Hi Sean,

Sean Whitton <spwhitton <at> spwhitton.name> writes:

> Hello,
>
> On Sun 03 Aug 2025 at 05:20pm -07, Xiyue Deng wrote:
>
>> I propose the series of changes for oauth2 which would lead to the
>> next release of 0.18.
>>
>> Each commit message explains what is done.  Please let me know if
>> anything is unclear.
>
> Thank you very much for working on this library.
>
> We need the commit messages to be in our CHANGELOG format as described
> in CONTRIBUTING.  Additional explanations for changes we prefer to be in
> comments rather than in the commit message.
>

Ah yes.  I have just sent V2 with the commit messages revised
accordingly.

> Finally, you use oauth2 daily, right?
> Therefore everything has been fairly thoroughly tested?

Yes, I have been using this daily and haven't triggered any more issue
yet.

Ideally it could use some unit tests, but it would require some (mock)
web services.  If there are any unit test tools for providing a web
service it would be good to try it out.

>
> -- 
> Sean Whitton

-- 
Regards,
Xiyue Deng
[signature.asc (application/pgp-signature, inline)]

Reply sent to Sean Whitton <spwhitton <at> spwhitton.name>:
You have taken responsibility. (Sat, 09 Aug 2025 09:28:01 GMT) Full text and rfc822 format available.

Notification sent to Xiyue Deng <manphiz <at> gmail.com>:
bug acknowledged by developer. (Sat, 09 Aug 2025 09:28:02 GMT) Full text and rfc822 format available.

Message #88 received at 79168-done <at> debbugs.gnu.org (full text, mbox):

From: Sean Whitton <spwhitton <at> spwhitton.name>
To: Xiyue Deng <manphiz <at> gmail.com>
Cc: 79168-done <at> debbugs.gnu.org
Subject: Re: bug#79168: Proposed changes for oauth2
Date: Sat, 09 Aug 2025 10:27:33 +0100
Hello,

Sorry, Xiyue, this is an ELPA package, so I didn't need to ask you to
respin the commit messages.  My apologies.

In any case I made some stylistic changes to some of them, such as using
Co-authored-by instead of ad hoc notes.

Patch 09/11 I'm not qualified to review, but based on your experience
using it for a while it seems okay to install it.

Thank you for your efforts.

-- 
Sean Whitton




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 14:18:02 GMT) Full text and rfc822 format available.

Message #91 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Robert Pluim <rpluim <at> gmail.com>
To: Xiyue Deng <manphiz <at> gmail.com>
Cc: 79168 <at> debbugs.gnu.org
Subject: Re: bug#79168: [PATCH 03/11] Reorder code to put defcustom/defvar
 at the beginning part
Date: Sat, 09 Aug 2025 16:16:47 +0200
>>>>> On Fri,  8 Aug 2025 23:45:42 -0700, Xiyue Deng <manphiz <at> gmail.com> said:

    Xiyue> (Adapted from bug#52476 by Aleksandr Vityazev.)
    Xiyue> * packages/oauth2/oauth2.el: Put oauth2-token-file,
    Xiyue> oauth2--url-advice, and oauth--token-data to the beginning part of the
    Xiyue> source code.
    Xiyue> ---
    Xiyue>  oauth2.el | 16 ++++++++--------
    Xiyue>  1 file changed, 8 insertions(+), 8 deletions(-)

    Xiyue> diff --git a/oauth2.el b/oauth2.el
    Xiyue> index c3aa45ed69..eccf439130 100644
    Xiyue> --- a/oauth2.el
    Xiyue> +++ b/oauth2.el
    Xiyue> @@ -53,9 +53,17 @@
    Xiyue>    :link '(url-link :tag "Savannah" "https://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/?h=externals/oauth2")
    Xiyue>    :link '(url-link :tag "ELPA" "https://elpa.gnu.org/packages/oauth2.html"))
 
    Xiyue> +(defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
    Xiyue> +  "File path where store OAuth tokens."
    Xiyue> +  :group 'oauth2
    Xiyue> +  :type 'file)
    Xiyue> +

This should use `locate-user-emacs-file'.


Robert
-- 




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 21:17:01 GMT) Full text and rfc822 format available.

Message #94 received at 79168-done <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: Sean Whitton <spwhitton <at> spwhitton.name>
Cc: 79168-done <at> debbugs.gnu.org
Subject: Re: bug#79168: Proposed changes for oauth2
Date: Sat, 09 Aug 2025 14:16:31 -0700
[Message part 1 (text/plain, inline)]
Hi Sean,

Sean Whitton <spwhitton <at> spwhitton.name> writes:

> Hello,
>
> Sorry, Xiyue, this is an ELPA package, so I didn't need to ask you to
> respin the commit messages.  My apologies.
>
> In any case I made some stylistic changes to some of them, such as using
> Co-authored-by instead of ad hoc notes.
>
> Patch 09/11 I'm not qualified to review, but based on your experience
> using it for a while it seems okay to install it.
>
> Thank you for your efforts.

Thanks Sean!

Meanwhile I'll also keep an eye on any bug report.

>
> -- 
> Sean Whitton

-- 
Regards,
Xiyue Deng
[signature.asc (application/pgp-signature, inline)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#79168; Package emacs. (Sat, 09 Aug 2025 22:24:01 GMT) Full text and rfc822 format available.

Message #97 received at 79168 <at> debbugs.gnu.org (full text, mbox):

From: Xiyue Deng <manphiz <at> gmail.com>
To: Robert Pluim <rpluim <at> gmail.com>
Cc: 79168 <at> debbugs.gnu.org
Subject: Re: bug#79168: [PATCH 03/11] Reorder code to put defcustom/defvar
 at the beginning part
Date: Sat, 09 Aug 2025 15:23:45 -0700
[Message part 1 (text/plain, inline)]
Hi Robert,

Robert Pluim <rpluim <at> gmail.com> writes:

>>>>>> On Fri,  8 Aug 2025 23:45:42 -0700, Xiyue Deng <manphiz <at> gmail.com> said:
>
>     Xiyue> (Adapted from bug#52476 by Aleksandr Vityazev.)
>     Xiyue> * packages/oauth2/oauth2.el: Put oauth2-token-file,
>     Xiyue> oauth2--url-advice, and oauth--token-data to the beginning part of the
>     Xiyue> source code.
>     Xiyue> ---
>     Xiyue>  oauth2.el | 16 ++++++++--------
>     Xiyue>  1 file changed, 8 insertions(+), 8 deletions(-)
>
>     Xiyue> diff --git a/oauth2.el b/oauth2.el
>     Xiyue> index c3aa45ed69..eccf439130 100644
>     Xiyue> --- a/oauth2.el
>     Xiyue> +++ b/oauth2.el
>     Xiyue> @@ -53,9 +53,17 @@
>     Xiyue>    :link '(url-link :tag "Savannah" "https://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/?h=externals/oauth2")
>     Xiyue>    :link '(url-link :tag "ELPA" "https://elpa.gnu.org/packages/oauth2.html"))
>  
>     Xiyue> +(defcustom oauth2-token-file (concat user-emacs-directory "oauth2.plstore")
>     Xiyue> +  "File path where store OAuth tokens."
>     Xiyue> +  :group 'oauth2
>     Xiyue> +  :type 'file)
>     Xiyue> +
>
> This should use `locate-user-emacs-file'.

Ah indeed.  Please see the attached patch.

>
>
> Robert
> -- 

-- 
Regards,
Xiyue Deng
[0001-Use-locate-user-emacs-file-instead-of-concat-user-em.patch (text/x-diff, attachment)]
[signature.asc (application/pgp-signature, inline)]

This bug report was last modified today.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.