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
bug-gnu-emacs <at> gnu.org
:bug#79168
; Package emacs
.
(Mon, 04 Aug 2025 00:00:01 GMT) Full text and rfc822 format available.Xiyue Deng <manphiz <at> gmail.com>
: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)]
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.
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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)]
Sean Whitton <spwhitton <at> spwhitton.name>
:Xiyue Deng <manphiz <at> gmail.com>
: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
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 --
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)]
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)]
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.