From 9bc02c4643455d5058d524ca1752f47bd0b462cb Mon Sep 17 00:00:00 2001 From: Jamie Cui Date: Mon, 29 Jun 2026 10:21:23 +0800 Subject: [PATCH 1/6] docs: Update README for MELPA installation (#8) * docs: Update README for MELPA installation * ci: Add GitHub token to Nix config Set NIX_CONFIG access-tokens in coverage and test workflows to authenticate GitHub API requests. * ci: Use Nix for Emacs setup in workflows --- .github/workflows/coverage.yml | 10 ++++++-- .github/workflows/test.yml | 10 ++++++-- README.org | 43 ++++++++++++++++++++++++++++------ README.zh.org | 41 ++++++++++++++++++++++++++------ 4 files changed, 86 insertions(+), 18 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 4cd3b91..a118d29 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -12,9 +12,15 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: purcell/setup-emacs@master + - uses: cachix/install-nix-action@v31.10.6 with: - version: 29.4 + github_access_token: ${{ github.token }} + + - name: Install Emacs 29.4 + run: | + nix profile install --accept-flake-config \ + github:purcell/nix-emacs-ci/868482a78575138aebb1b5c16a9266b95c800f2e#emacs-29-4 + emacs --version - name: Install Emacs package dependencies run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c4d6989..31423e3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,9 +12,15 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: purcell/setup-emacs@master + - uses: cachix/install-nix-action@v31.10.6 with: - version: 29.4 + github_access_token: ${{ github.token }} + + - name: Install Emacs 29.4 + run: | + nix profile install --accept-flake-config \ + github:purcell/nix-emacs-ci/868482a78575138aebb1b5c16a9266b95c800f2e#emacs-29-4 + emacs --version - name: Install Emacs package dependencies run: | diff --git a/README.org b/README.org index 4e482cf..aee5070 100644 --- a/README.org +++ b/README.org @@ -6,6 +6,7 @@ [[https://github.com/Jamie-Cui/git-overleaf/actions/workflows/test.yml][https://github.com/Jamie-Cui/git-overleaf/actions/workflows/test.yml/badge.svg]] [[https://github.com/Jamie-Cui/git-overleaf/actions/workflows/coverage.yml][https://github.com/Jamie-Cui/git-overleaf/actions/workflows/coverage.yml/badge.svg]] +[[https://melpa.org/#/git-overleaf][https://melpa.org/packages/git-overleaf-badge.svg]] Chinese README: [[file:README.zh.org][README.zh.org]] @@ -68,22 +69,34 @@ runtime. * Installation -** VC package install +** MELPA -~git-overleaf~ is not yet available from MELPA. Install it -directly from the Git repository with =use-package=: +~git-overleaf~ is available from MELPA. The recommended installation +path is Emacs' built-in package manager. + +If MELPA is not already configured, add it to ~package-archives~: #+begin_src elisp - (use-package git-overleaf - :vc (:url "https://github.com/Jamie-Cui/git-overleaf" :rev "main")) + (require 'package) + (add-to-list 'package-archives + '("melpa" . "https://melpa.org/packages/") t) + (package-initialize) #+end_src -Without =use-package=, use Emacs' package manager directly: +Then refresh package contents and install ~git-overleaf~: #+begin_example -M-x package-vc-install RET https://github.com/Jamie-Cui/git-overleaf.git RET +M-x package-refresh-contents RET +M-x package-install RET git-overleaf RET #+end_example +With =use-package=: + +#+begin_src elisp + (use-package git-overleaf + :ensure t) +#+end_src + For a self-hosted Overleaf instance, set the server URL before using the interactive commands: @@ -91,6 +104,22 @@ interactive commands: (setopt git-overleaf-url "https://latex.example.edu") #+end_src +** Development version + +To install unreleased changes from the Git repository, use +=use-package= with VC support: + +#+begin_src elisp + (use-package git-overleaf + :vc (:url "https://github.com/Jamie-Cui/git-overleaf" :rev "main")) +#+end_src + +Without =use-package=, use Emacs' VC package installer directly: + +#+begin_example +M-x package-vc-install RET https://github.com/Jamie-Cui/git-overleaf.git RET +#+end_example + ** Manual checkout If using a local checkout, install the Elisp dependencies separately and diff --git a/README.zh.org b/README.zh.org index d5183a2..04fb888 100644 --- a/README.zh.org +++ b/README.zh.org @@ -3,6 +3,7 @@ [[https://github.com/Jamie-Cui/git-overleaf/actions/workflows/test.yml][https://github.com/Jamie-Cui/git-overleaf/actions/workflows/test.yml/badge.svg]] [[https://github.com/Jamie-Cui/git-overleaf/actions/workflows/coverage.yml][https://github.com/Jamie-Cui/git-overleaf/actions/workflows/coverage.yml/badge.svg]] +[[https://melpa.org/#/git-overleaf][https://melpa.org/packages/git-overleaf-badge.svg]] English README: [[file:README.org][README.org]] @@ -56,28 +57,54 @@ Emacs 构建支持 SQLite。 * 安装 -** VC 包安装 +** MELPA -~git-overleaf~ 目前尚未发布到 MELPA。可使用 =use-package= 直接从 -Git 仓库安装: +~git-overleaf~ 已发布到 MELPA。推荐通过 Emacs 内置包管理器安装。 + +如果尚未配置 MELPA,请先将它加入 ~package-archives~: #+begin_src elisp - (use-package git-overleaf - :vc (:url "https://github.com/Jamie-Cui/git-overleaf" :rev "main")) + (require 'package) + (add-to-list 'package-archives + '("melpa" . "https://melpa.org/packages/") t) + (package-initialize) #+end_src -如果不使用 =use-package=,可直接调用 Emacs 的包管理器: +然后刷新包列表并安装 ~git-overleaf~: #+begin_example -M-x package-vc-install RET https://github.com/Jamie-Cui/git-overleaf.git RET +M-x package-refresh-contents RET +M-x package-install RET git-overleaf RET #+end_example +使用 =use-package= 时: + +#+begin_src elisp + (use-package git-overleaf + :ensure t) +#+end_src + 如果使用自建 Overleaf 实例,请在使用交互命令前设置服务器地址: #+begin_src elisp (setopt git-overleaf-url "https://latex.example.edu") #+end_src +** 开发版安装 + +如需安装 Git 仓库中的未发布改动,可使用 =use-package= 的 VC 支持: + +#+begin_src elisp + (use-package git-overleaf + :vc (:url "https://github.com/Jamie-Cui/git-overleaf" :rev "main")) +#+end_src + +如果不使用 =use-package=,可直接调用 Emacs 的 VC 包安装器: + +#+begin_example +M-x package-vc-install RET https://github.com/Jamie-Cui/git-overleaf.git RET +#+end_example + ** 手动 checkout 如果使用本地 checkout,请单独安装 Elisp 依赖,并将本仓库加入 From ef4ebe8936984c4151a63e5dd1246ecb5571f946 Mon Sep 17 00:00:00 2001 From: Jamie Cui Date: Mon, 29 Jun 2026 10:13:26 +0800 Subject: [PATCH 2/6] ci: Add GitHub token to Nix config Set NIX_CONFIG access-tokens in coverage and test workflows to authenticate GitHub API requests. --- .github/workflows/coverage.yml | 3 +++ .github/workflows/test.yml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index a118d29..a793f2a 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -8,6 +8,9 @@ on: jobs: testcover: runs-on: ubuntu-latest + env: + NIX_CONFIG: | + access-tokens = github.com=${{ github.token }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 31423e3..f4486df 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,6 +8,9 @@ on: jobs: ert: runs-on: ubuntu-latest + env: + NIX_CONFIG: | + access-tokens = github.com=${{ github.token }} steps: - uses: actions/checkout@v4 From 9b9c03c02e6050695a4e72f4f4690a033728001b Mon Sep 17 00:00:00 2001 From: Jamie Cui Date: Mon, 29 Jun 2026 10:18:36 +0800 Subject: [PATCH 3/6] ci: Use Nix for Emacs setup in workflows --- .github/workflows/coverage.yml | 3 --- .github/workflows/test.yml | 3 --- 2 files changed, 6 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index a793f2a..a118d29 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -8,9 +8,6 @@ on: jobs: testcover: runs-on: ubuntu-latest - env: - NIX_CONFIG: | - access-tokens = github.com=${{ github.token }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f4486df..31423e3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,9 +8,6 @@ on: jobs: ert: runs-on: ubuntu-latest - env: - NIX_CONFIG: | - access-tokens = github.com=${{ github.token }} steps: - uses: actions/checkout@v4 From 53a95b23fcd80f611b2b6c7fba98b43674e67fd7 Mon Sep 17 00:00:00 2001 From: Jamie Cui Date: Wed, 1 Jul 2026 21:37:47 +0800 Subject: [PATCH 4/6] feat(http): Add download progress reporting Echo curl progress percentage in minibuffer during snapshot downloads when git-overleaf-log-echo is non-nil. Update documentation regarding proxy environment configuration for GUI Emacs. --- README.org | 12 +++ README.zh.org | 11 +++ git-overleaf-http.el | 155 +++++++++++++++++++++++++++++++++++--- test/git-overleaf-test.el | 26 ++++++- 4 files changed, 192 insertions(+), 12 deletions(-) diff --git a/README.org b/README.org index aee5070..c70a1f7 100644 --- a/README.org +++ b/README.org @@ -428,6 +428,18 @@ Cancellation interrupts external processes where possible, clears async locks, and drops pending foreground callbacks. Work already completed locally or remotely is not rolled back. +* Download Progress and Proxy Environment + +Snapshot downloads echo curl progress in the minibuffer as +=Downloading project ... N%= when ~git-overleaf-log-echo~ is non-nil. + +Downloads are performed by ~git-overleaf-curl-executable~, so proxy +configuration comes from Emacs' ~process-environment~, not necessarily +from the shell that runs =emacsclient=. If Overleaf downloads are slow +in GUI Emacs, check =(getenv "HTTPS_PROXY")= and =(getenv "HTTP_PROXY")= +inside Emacs, then copy the needed proxy variables with =setenv= or a +tool such as =exec-path-from-shell=. + * Magit Integration To display an Overleaf section in =magit-status=, load the optional diff --git a/README.zh.org b/README.zh.org index 04fb888..4af74fc 100644 --- a/README.zh.org +++ b/README.zh.org @@ -387,6 +387,17 @@ M-x git-overleaf-force-stop 取消会尽可能中断外部进程、清理 async 锁,并丢弃尚未执行的前台回调。已 经在本地或远端完成的工作不会自动回滚。 +* 下载进度与代理环境 + +快照下载会在 ~git-overleaf-log-echo~ 为非 nil 时,在 minibuffer 中显示 +=Downloading project ... N%= 形式的 curl 进度。 + +下载由 ~git-overleaf-curl-executable~ 指定的 curl 执行,因此代理配置来自 +Emacs 的 ~process-environment~,不一定等同于运行 =emacsclient= 的 shell。 +如果 GUI Emacs 中下载 Overleaf 很慢,先在 Emacs 里检查 +=(getenv "HTTPS_PROXY")= 和 =(getenv "HTTP_PROXY")=,再按需用 =setenv= 或 +=exec-path-from-shell= 之类的工具把代理变量复制进 Emacs。 + * Magit 集成 若要在 =magit-status= 中显示 Overleaf section,请加载可选集成: diff --git a/git-overleaf-http.el b/git-overleaf-http.el index a0fd034..e2abcfb 100644 --- a/git-overleaf-http.el +++ b/git-overleaf-http.el @@ -136,10 +136,13 @@ If REFRESH is non-nil, bypass the cached token and fetch a fresh one." '("--fail" "--silent" "--show-error" "--location") (git-overleaf--curl-timeout-args))) -(defun git-overleaf--curl-download-base-args () - "Return common arguments shared by Overleaf project zip downloads." +(defun git-overleaf--curl-download-base-args (&optional progress) + "Return common arguments shared by Overleaf project zip downloads. +When PROGRESS is non-nil, allow curl to emit a parseable progress bar." (append - '("--fail" "--silent" "--show-error" "--location") + (if progress + '("--fail" "--show-error" "--location" "--progress-bar") + '("--fail" "--silent" "--show-error" "--location")) (git-overleaf--curl-download-timeout-args))) (defun git-overleaf--socket-cookies () @@ -161,18 +164,144 @@ If REFRESH is non-nil, bypass the cached token and fetch a fresh one." (format "%s; %s" cookies gclb-cookie) cookies))) -(defun git-overleaf--curl-download-args (url output-file headers) - "Return curl argument list to download URL into OUTPUT-FILE with HEADERS." +(defun git-overleaf--curl-download-args + (url output-file headers &optional progress) + "Return curl argument list to download URL into OUTPUT-FILE with HEADERS. +When PROGRESS is non-nil, ask curl to emit progress output." (append - (git-overleaf--curl-download-base-args) + (git-overleaf--curl-download-base-args progress) (apply #'append (mapcar (lambda (h) (list "-H" h)) headers)) (list "--output" output-file url))) -(defun git-overleaf--curl-download (url output-file headers) +(defconst git-overleaf--curl-download-progress-regexp + "\\([0-9]+\\(?:\\.[0-9]+\\)?\\)%" + "Regexp matching curl progress percentage output.") + +(defun git-overleaf--curl-download-progress-percent (text) + "Return the last curl progress percentage in TEXT, or nil." + (let ((start 0) + (percent nil)) + (while (string-match git-overleaf--curl-download-progress-regexp + text + start) + (setq percent (floor (string-to-number (match-string 1 text)))) + (setq start (match-end 0))) + (when percent + (min 100 (max 0 percent))))) + +(defun git-overleaf--curl-download-progress-message (label percent) + "Echo download progress for LABEL at PERCENT without logging it." + (when git-overleaf-log-echo + (message "%s" + (format "[git-overleaf] Downloading %s... %d%%" + label + percent)))) + +(defun git-overleaf--curl-download-run-with-progress + (program args progress-label) + "Run curl PROGRAM with ARGS and echo progress for PROGRESS-LABEL." + (let* ((mutex (and (fboundp 'make-mutex) + (make-mutex "git-overleaf-curl-download"))) + (process nil) + (done nil) + (status nil) + (output-chunks nil) + (progress-tail "") + (last-percent nil) + (result nil)) + (cl-labels + ((with-lock (function) + (if mutex + (progn + (mutex-lock mutex) + (unwind-protect + (funcall function) + (mutex-unlock mutex))) + (funcall function))) + (record-output (string) + (with-lock + (lambda () + (push string output-chunks) + (setq progress-tail (concat progress-tail string)) + (when (> (length progress-tail) 200) + (setq progress-tail + (substring progress-tail + (- (length progress-tail) 200)))) + (when-let* ((percent + (git-overleaf--curl-download-progress-percent + progress-tail)) + ((not (equal percent last-percent)))) + (setq last-percent percent) + (git-overleaf--curl-download-progress-message + progress-label + percent))))) + (mark-done (proc) + (when (memq (process-status proc) '(exit signal)) + (with-lock + (lambda () + (unless done + (setq status (process-exit-status proc)) + (setq done t))))))) + (unwind-protect + (setq + result + (progn + (git-overleaf--curl-download-progress-message progress-label 0) + (setq process + (make-process + :name "git-overleaf-curl-download" + :buffer nil + :command (cons program args) + :connection-type 'pipe + :noquery t + :filter (lambda (_proc string) + (record-output string)) + :sentinel (lambda (proc _event) + (mark-done proc)))) + (git-overleaf--async-register-process process) + (while (not done) + (accept-process-output process 0.05) + (when (fboundp 'thread-yield) + (thread-yield))) + (let ((output nil)) + (with-lock + (lambda () + (setq output + (string-trim-right + (apply #'concat (nreverse output-chunks)))))) + (prog1 + (git-overleaf--command-result-or-error + program + args + status + output + nil) + (unless (equal last-percent 100) + (git-overleaf--curl-download-progress-message + progress-label + 100)))))) + (when (and process (process-live-p process)) + (ignore-errors (delete-process process))) + (when process + (git-overleaf--async-unregister-process process)))) + result)) + +(defun git-overleaf--curl-download + (url output-file headers &optional progress-label) "Download URL into OUTPUT-FILE with HEADERS using curl." - (git-overleaf--run git-overleaf-curl-executable - (git-overleaf--curl-download-args - url output-file headers))) + (let ((program (git-overleaf--ensure-executable git-overleaf-curl-executable)) + (args + (git-overleaf--curl-download-args + url + output-file + headers + progress-label))) + (if progress-label + (git-overleaf--curl-download-run-with-progress + program + args + progress-label) + (git-overleaf--run program args)))) (defun git-overleaf--curl-request (method url headers &optional body) "Run a curl request with METHOD to URL using HEADERS and optional BODY." @@ -270,7 +399,11 @@ The response body is discarded." (prog1 (progn (git-overleaf--message "Downloading project %s..." project-id) - (git-overleaf--curl-download url zipfile headers) + (git-overleaf--curl-download + url + zipfile + headers + (format "project %s" project-id)) (git-overleaf--run git-overleaf-unzip-executable (list "-q" "-o" zipfile "-d" temp-dir)) diff --git a/test/git-overleaf-test.el b/test/git-overleaf-test.el index 1c4089c..21f56df 100644 --- a/test/git-overleaf-test.el +++ b/test/git-overleaf-test.el @@ -145,7 +145,31 @@ (should (equal (git-overleaf--curl-download-timeout-args) '("--max-time" "10" "--speed-limit" "256" - "--speed-time" "5")))) + "--speed-time" "5"))) + (should (member "--silent" (git-overleaf--curl-download-base-args))) + (should-not (member "--silent" + (git-overleaf--curl-download-base-args t))) + (should (member "--progress-bar" + (git-overleaf--curl-download-base-args t)))) + (should (equal (git-overleaf--curl-download-args + "https://example.test/project/id/download/zip" + "/tmp/project.zip" + '("Cookie: ") + t) + '("--fail" "--show-error" "--location" "--progress-bar" + "--connect-timeout" "10" + "--speed-limit" "1024" + "--speed-time" "30" + "-H" "Cookie: " + "--output" "/tmp/project.zip" + "https://example.test/project/id/download/zip"))) + (should (equal (git-overleaf--curl-download-progress-percent + "\r######## 12.3%") + 12)) + (should (equal (git-overleaf--curl-download-progress-percent + "\r#### 9.9%\r######################################################################## 100.0%") + 100)) + (should-not (git-overleaf--curl-download-progress-percent "no progress")) (let ((result (make-git-overleaf--command-result :status 22 :output "curl: returned error: 403"))) From 5638010cddb751ac44f657693ee2174676fe87d4 Mon Sep 17 00:00:00 2001 From: Jamie Cui Date: Thu, 2 Jul 2026 03:24:57 +0800 Subject: [PATCH 5/6] refactor(http): extract optional mutex macro Replace inline cl-labels locking logic with new git-overleaf--with-optional-mutex macro to simplify curl download progress handling. --- git-overleaf-http.el | 151 ++++++++++++++++++++++--------------------- 1 file changed, 76 insertions(+), 75 deletions(-) diff --git a/git-overleaf-http.el b/git-overleaf-http.el index e2abcfb..7e5d667 100644 --- a/git-overleaf-http.el +++ b/git-overleaf-http.el @@ -197,6 +197,19 @@ When PROGRESS is non-nil, ask curl to emit progress output." label percent)))) +(defmacro git-overleaf--with-optional-mutex (mutex &rest body) + "Evaluate BODY while holding MUTEX when MUTEX is non-nil." + (declare (indent 1) (debug (form body))) + (let ((mutex-var (make-symbol "mutex"))) + `(let ((,mutex-var ,mutex)) + (if ,mutex-var + (progn + (mutex-lock ,mutex-var) + (unwind-protect + (progn ,@body) + (mutex-unlock ,mutex-var))) + (progn ,@body))))) + (defun git-overleaf--curl-download-run-with-progress (program args progress-label) "Run curl PROGRAM with ARGS and echo progress for PROGRESS-LABEL." @@ -209,81 +222,69 @@ When PROGRESS is non-nil, ask curl to emit progress output." (progress-tail "") (last-percent nil) (result nil)) - (cl-labels - ((with-lock (function) - (if mutex - (progn - (mutex-lock mutex) - (unwind-protect - (funcall function) - (mutex-unlock mutex))) - (funcall function))) - (record-output (string) - (with-lock - (lambda () - (push string output-chunks) - (setq progress-tail (concat progress-tail string)) - (when (> (length progress-tail) 200) - (setq progress-tail - (substring progress-tail - (- (length progress-tail) 200)))) - (when-let* ((percent - (git-overleaf--curl-download-progress-percent - progress-tail)) - ((not (equal percent last-percent)))) - (setq last-percent percent) - (git-overleaf--curl-download-progress-message - progress-label - percent))))) - (mark-done (proc) - (when (memq (process-status proc) '(exit signal)) - (with-lock - (lambda () - (unless done - (setq status (process-exit-status proc)) - (setq done t))))))) - (unwind-protect - (setq - result - (progn - (git-overleaf--curl-download-progress-message progress-label 0) - (setq process - (make-process - :name "git-overleaf-curl-download" - :buffer nil - :command (cons program args) - :connection-type 'pipe - :noquery t - :filter (lambda (_proc string) - (record-output string)) - :sentinel (lambda (proc _event) - (mark-done proc)))) - (git-overleaf--async-register-process process) - (while (not done) - (accept-process-output process 0.05) - (when (fboundp 'thread-yield) - (thread-yield))) - (let ((output nil)) - (with-lock - (lambda () - (setq output - (string-trim-right - (apply #'concat (nreverse output-chunks)))))) - (prog1 - (git-overleaf--command-result-or-error - program - args - status - output - nil) - (unless (equal last-percent 100) - (git-overleaf--curl-download-progress-message - progress-label - 100)))))) - (when (and process (process-live-p process)) - (ignore-errors (delete-process process))) - (when process - (git-overleaf--async-unregister-process process)))) + (unwind-protect + (setq + result + (progn + (git-overleaf--curl-download-progress-message progress-label 0) + (setq process + (make-process + :name "git-overleaf-curl-download" + :buffer nil + :command (cons program args) + :connection-type 'pipe + :noquery t + :filter (lambda (_proc string) + (git-overleaf--with-optional-mutex mutex + (push string output-chunks) + (setq progress-tail + (concat progress-tail string)) + (when (> (length progress-tail) 200) + (setq progress-tail + (substring progress-tail + (- (length progress-tail) + 200)))) + (when-let* ((percent + (git-overleaf--curl-download-progress-percent + progress-tail))) + (unless (equal percent last-percent) + (setq last-percent percent) + (git-overleaf--curl-download-progress-message + progress-label + percent))))) + :sentinel (lambda (proc _event) + (when (memq (process-status proc) + '(exit signal)) + (git-overleaf--with-optional-mutex mutex + (unless done + (setq status + (process-exit-status proc)) + (setq done t))))))) + (git-overleaf--async-register-process process) + (while (not done) + (accept-process-output process 0.05) + (when (fboundp 'thread-yield) + (thread-yield))) + (let ((output nil)) + (git-overleaf--with-optional-mutex mutex + (setq output + (string-trim-right + (apply #'concat (nreverse output-chunks))))) + (prog1 + (git-overleaf--command-result-or-error + program + args + status + output + nil) + (unless (equal last-percent 100) + (git-overleaf--curl-download-progress-message + progress-label + 100)))))) + (when (and process (process-live-p process)) + (ignore-errors (delete-process process))) + (when process + (git-overleaf--async-unregister-process process))) result)) (defun git-overleaf--curl-download From 41c1d11533d2d2fb207b1a3645bff4f9a14c260f Mon Sep 17 00:00:00 2001 From: Jamie Cui Date: Fri, 10 Jul 2026 16:19:11 +0800 Subject: [PATCH 6/6] docs: restore MELPA badge and add melpazoid CI badge --- README.org | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index c70a1f7..9048ee2 100644 --- a/README.org +++ b/README.org @@ -6,7 +6,8 @@ [[https://github.com/Jamie-Cui/git-overleaf/actions/workflows/test.yml][https://github.com/Jamie-Cui/git-overleaf/actions/workflows/test.yml/badge.svg]] [[https://github.com/Jamie-Cui/git-overleaf/actions/workflows/coverage.yml][https://github.com/Jamie-Cui/git-overleaf/actions/workflows/coverage.yml/badge.svg]] -[[https://melpa.org/#/git-overleaf][https://melpa.org/packages/git-overleaf-badge.svg]] +[[https://github.com/Jamie-Cui/git-overleaf/actions/workflows/melpazoid.yml/badge.svg][https://github.com/Jamie-Cui/git-overleaf/actions/workflows/melpazoid.yml]] +[[https://melpa.org/packages/git-overleaf-badge.svg][https://melpa.org/#/git-overleaf]] Chinese README: [[file:README.zh.org][README.zh.org]]