Subject: [bug#49219] [PATCH]: Update emacs-telega.

From: Zhu Zihao <[email-masked]>
Date: Fri, 25 Jun 2021 13:48:20 +0800

>From 32278ed29a5624efedab694c7c465a75f29c6725 Mon Sep 17 00:00:00 2001
From: Zhu Zihao <[email-masked]>
Date: Fri, 25 Jun 2021 13:25:05 +0800
Subject: [PATCH 1/3] gnu: Add emacs-telega-server.

* gnu/packages/emacs-xyz.scm(emacs-telega-server): New variable.
* gnu/packages/patches/emacs-telega-path-placeholder.patch: New file.
* gnu/package/patches/emacs-telega-patch-server-functions.patch: Remove stale patch.
* gnu/local.mk(dist_patch_DATA): Update corresponding entries.
---
 gnu/local.mk                                  |  2 +-
 gnu/packages/emacs-xyz.scm                    | 54 ++++++++++++++++++-
 .../emacs-telega-patch-server-functions.patch | 31 -----------
 .../emacs-telega-path-placeholder.patch       | 44 +++++++++++++++
 4 files changed, 98 insertions(+), 33 deletions(-)
 delete mode 100644 gnu/packages/patches/emacs-telega-patch-server-functions.patch
 create mode 100644 gnu/packages/patches/emacs-telega-path-placeholder.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 509970f044..8f432ed326 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -989,7 +989,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/emacs-hyperbole-toggle-messaging.patch	\
   %D%/packages/patches/emacs-libgit-use-system-libgit2.patch    \
   %D%/packages/patches/emacs-source-date-epoch.patch		\
-  %D%/packages/patches/emacs-telega-patch-server-functions.patch	\
+  %D%/packages/patches/emacs-telega-path-placeholder.patch	\
   %D%/packages/patches/emacs-telega-test-env.patch		\
   %D%/packages/patches/emacs-wordnut-require-adaptive-wrap.patch	\
   %D%/packages/patches/enjarify-setup-py.patch			\
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index b84c0d6622..c722ff62fe 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -81,7 +81,7 @@
 ;;; Copyright © 2020, 2021 Niklas Eklund <[email-masked]>
 ;;; Copyright © 2020 Marco Grassi <[email-masked]>
 ;;; Copyright © 2020 Tomás Ortín Fernández <[email-masked]>
-;;; Copyright © 2020 Zhu Zihao <[email-masked]>
+;;; Copyright © 2020, 2021 Zhu Zihao <[email-masked]>
 ;;; Copyright © 2020 Adam Kandur <[email-masked]>
 ;;; Copyright © 2020 Tim Howes <[email-masked]>
 ;;; Copyright © 2020 Noah Landis <[email-masked]>
@@ -26011,6 +26011,58 @@ fish-completion.  It can be used in both Eshell and M-x shell.")
 other @code{helm-type-file} sources such as @code{helm-locate}.")
     (license license:gpl3+)))
 
+(define-public emacs-telega-server
+  (package
+    (name "emacs-telega-server")
+    (version "0.7.024")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/zevlg/telega.el")
+             (commit (string-append "v" version))))
+       (sha256
+        (base32 "1ra04cp49zzx8vy8aswd00l46ixyc44sxh1s3nw880b4ywzxmc6j"))
+       (file-name (git-file-name "emacs-telega" version))
+       (patches
+        (search-patches "emacs-telega-path-placeholder.patch"
+                        "emacs-telega-test-env.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'enter-subdirectory
+           (lambda _ (chdir "server") #t))
+         (replace 'configure
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (substitute* "Makefile"
+                 (("CC=cc") ,(string-append "CC=" (cc-for-target)))
+                 (("^(INSTALL_PREFIX=).*$" _all prefix)
+                  (string-append prefix out "/bin\n")))
+
+               (substitute* "run_tests.py"
+                 (("^(TELEGA_SERVER = ).*$" _all prefix)
+                  (string-append prefix
+                                 "\"" out "/bin/telega-server\"\n"))))))
+         (delete 'check)
+         (add-after 'install 'check
+           (assoc-ref %standard-phases 'check))
+         (add-before 'install-license-files 'leave-subdirectory
+           (lambda _ (chdir "..") #t)))
+       #:test-target "test"))
+    (inputs
+     `(("tdlib" ,tdlib)
+       ("libappindicator" ,libappindicator)))
+    (native-inputs
+     `(("python" ,python)
+       ("pkg-config" ,pkg-config)))
+    (home-page "https://zevlg.github.io/telega.el/")
+    (synopsis "Server process of Telega")
+    (description "Telega-server is helper program to interact with Telegram
+service, and connect it with Emacs via inter-process communication.")
+    (license license:gpl3+)))
+
 (define-public emacs-telega
   ;; This package has versions newer than indicated on MELPA.
   ;; Get the current version from `telega-version` in telega.el.
diff --git a/gnu/packages/patches/emacs-telega-patch-server-functions.patch b/gnu/packages/patches/emacs-telega-patch-server-functions.patch
deleted file mode 100644
index e3d49278d0..0000000000
--- a/gnu/packages/patches/emacs-telega-patch-server-functions.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-Remove interactive build for telega-server, as it fails on Guix.
-Modify the `telega-server--find-bin' function to only use the version
-of telega-server installed by Guix.
-
-Created by Brett Gilio <[email-masked]>
-
---- a/telega-server.el
-+++ b/telega-server.el
-@@ -113,7 +113,6 @@ If already deferring, then just executes the BODY."
- If BUILD-FLAGS is specified, then rebuild server without any
- queries using this flags for building, could be empty string.
- Otherwise query user about building flags."
--  (interactive)
-   (telega-test-env 'quiet)
-   (when (or build-flags
-             (y-or-n-p "Build `telega-server'? "))
-@@ -137,11 +136,8 @@ Otherwise query user about building flags."
- (defun telega-server--find-bin ()
-   "Find telega-server executable.
- Raise error if not found."
--  (let ((exec-path (cons telega-directory exec-path)))
--    (or (executable-find "telega-server")
--        (progn (telega-server-build)
--               (executable-find "telega-server"))
--        (error "`telega-server' not found in exec-path"))))
-+  (or (executable-find "telega-server")
-+      (error "`telega-server' not found in exec-path")))
- 
- (defun telega-server-version ()
-   "Return telega-server version."
-
diff --git a/gnu/packages/patches/emacs-telega-path-placeholder.patch b/gnu/packages/patches/emacs-telega-path-placeholder.patch
new file mode 100644
index 0000000000..c20be36712
--- /dev/null
+++ b/gnu/packages/patches/emacs-telega-path-placeholder.patch
@@ -0,0 +1,44 @@
+From 865b8c553722a971c68742c2e849e41eb0e2360c Mon Sep 17 00:00:00 2001
+From: Zhu Zihao <[email-masked]>
+Date: Thu, 24 Jun 2021 23:43:50 +0800
+Subject: [PATCH] Replace code that search path with placeholder for
+ configuration.
+
+---
+ telega-server.el | 6 +-----
+ telega-util.el   | 2 +-
+ 2 files changed, 2 insertions(+), 6 deletions(-)
+
+diff --git a/telega-server.el b/telega-server.el
+index 999125d..0fa0817 100644
+--- a/telega-server.el
++++ b/telega-server.el
+@@ -142,11 +142,7 @@ Otherwise query user about building flags."
+ (defun telega-server--find-bin ()
+   "Find telega-server executable.
+ Raise error if not found."
+-  (let ((exec-path (cons telega-directory exec-path)))
+-    (or (executable-find "telega-server")
+-        (progn (telega-server-build)
+-               (executable-find "telega-server"))
+-        (error "`telega-server' not found in exec-path"))))
++  "@TELEGA_SERVER_BIN@")
+ 
+ (defun telega-server-version ()
+   "Return telega-server version."
+diff --git a/telega-util.el b/telega-util.el
+index 73a46b1..f53e20a 100644
+--- a/telega-util.el
++++ b/telega-util.el
+@@ -464,7 +464,7 @@ N can't be 0."
+ 
+ (defun telega-etc-file (filename)
+   "Return absolute path to FILENAME from etc/ directory in telega."
+-  (expand-file-name (concat "etc/" filename) telega--lib-directory))
++  (concat "@TELEGA_SHARE@" "/" filename))
+ 
+ (defun telega-link-props (link-type link-to &optional face)
+   "Generate props for link button openable with `telega-link--button-action'."
+-- 
+2.32.0
+
-- 
2.32.0

>From 5157c45126650f1439d7fdf15b2a7c8ba19d6bdc Mon Sep 17 00:00:00 2001
From: Zhu Zihao <[email-masked]>
Date: Fri, 25 Jun 2021 13:26:51 +0800
Subject: [PATCH 2/3] gnu: emacs-telega: Update to 0.7.024.

* gnu/packages/emacs-xyz.scm(emacs-telega): Update to 0.7.024.

Rewrite build recipe.
---
 gnu/packages/emacs-xyz.scm | 169 +++++++++++--------------------------
 1 file changed, 50 insertions(+), 119 deletions(-)

diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index c722ff62fe..c8540bbead 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -26064,125 +26064,56 @@ service, and connect it with Emacs via inter-process communication.")
     (license license:gpl3+)))
 
 (define-public emacs-telega
-  ;; This package has versions newer than indicated on MELPA.
-  ;; Get the current version from `telega-version` in telega.el.
-  ;; or by running M-x telega-version.
-  (let ((commit "1d28dc209e2acf1a3bf2852cc620b6e412ea73f9")
-	(revision "1")
-	(version "0.7.1"))
-    (package
-      (name "emacs-telega")
-      (version (git-version version revision commit))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/zevlg/telega.el")
-               (commit commit)))
-         (sha256
-          (base32
-           "0h6kj3r36x26v6p4gkzg5s6fv0brlvrf6ycsdwnz27fw5sdb99k7"))
-         (patches (search-patches
-                   "emacs-telega-patch-server-functions.patch"
-                   "emacs-telega-test-env.patch"))
-         (file-name (git-file-name name version))))
-      (build-system gnu-build-system)
-      (arguments
-       `(#:modules ((guix build gnu-build-system)
-                    ((guix build emacs-build-system) #:prefix emacs:)
-                    (guix build utils)
-                    (guix build emacs-utils))
-         #:imported-modules (,@%gnu-build-system-modules
-                             (guix build emacs-build-system)
-                             (guix build emacs-utils))
-         #:test-target "test"
-         ;; TODO: Currently tgVOIP is not functional, thus we have disabled it
-         ;; temporarily.
-         ;; #:make-flags (list "WITH_VOIP=t")
-         #:phases
-         (modify-phases %standard-phases
-           (add-after 'unpack 'prefix-patch
-             (lambda _
-               (substitute* "server/Makefile"
-                 (("CC=cc")
-                  ,(string-append "CC=" (cc-for-target)))
-                 (("INSTALL_PREFIX=\\$\\(HOME\\)/.telega")
-                  (string-append "INSTALL_PREFIX=" (assoc-ref %outputs "out")
-                                 "/bin"))
-                 ;; Manually invoke `run_tests.py` after install phase.
-                 (("python3 run_tests.py")
-                  ""))
-               #t))
-           (add-after 'unpack 'expand-load-path
-             (assoc-ref emacs:%standard-phases 'expand-load-path))
-           (add-after 'unpack 'patch-sources
-             (lambda* (#:key inputs #:allow-other-keys)
-               ;; Hard-code paths to `ffplay` and `ffmpeg`.
-               (let ((ffplay-bin (string-append (assoc-ref inputs "ffmpeg")
-                                                "/bin/ffplay"))
-                     (ffmpeg-bin (string-append (assoc-ref inputs "ffmpeg")
-                                                "/bin/ffmpeg")))
-                 (substitute* "telega-ffplay.el"
-                   (("\\(executable-find \"ffplay\"\\)")
-                    (string-append
-                     "(and (file-executable-p \"" ffplay-bin "\")"
-                     "\"" ffplay-bin "\")"))
-                   (("\\(executable-find \"ffmpeg\"\\)")
-                    (string-append
-                     "(and (file-executable-p \"" ffmpeg-bin "\")"
-                     "\"" ffmpeg-bin "\")"))))
-               ;; This would push the "contrib" sources to the load path,
-               ;; but as contrib is not installed alongside telega, it does
-               ;; nothing.
-               (substitute* "telega.el"
-                 (("\\(push .* load-path\\)") ""))
-               #t))
-           ;; The server test suite has a hardcoded path.
-           ;; Reset this behavior to use the proper path.
-           (add-after 'unpack 'patch-test-suite
-             (lambda _
-               (substitute* "server/run_tests.py"
-                 (("~/.telega/telega-server")
-                  (string-append (assoc-ref %outputs "out")
-                                 "/bin/telega-server")))
-               #t))
-           (add-after 'install 'run-server-suite
-             (lambda _
-               (invoke "python3" "server/run_tests.py")
-               #t))
-           (delete 'configure)
-           (add-after 'expand-load-path 'emacs-install
-             (lambda args
-               (apply (assoc-ref emacs:%standard-phases 'install)
-                      #:include `("etc" ,@emacs:%default-include)
-                      args)))
-           (add-after 'emacs-install 'emacs-build
-             (assoc-ref emacs:%standard-phases 'build))
-           (add-after 'emacs-install 'emacs-make-autoloads
-             (assoc-ref emacs:%standard-phases 'make-autoloads)))))
-      (inputs
-       `(("ffmpeg" ,ffmpeg))) ; mp4/gif support.
-      (propagated-inputs
-       `(("emacs-visual-fill-column" ,emacs-visual-fill-column)
-         ("emacs-company" ,emacs-company)
-         ("emacs-rainbow-identifiers"
-          ,emacs-rainbow-identifiers)
-         ("libwebp" ,libwebp))) ; sticker support.
-      (native-inputs
-       `(("tdlib" ,tdlib)
-         ;; Use Emacs with wide ints on 32-bit architectures.
-         ("emacs" ,(match (%current-system)
-                     ((or "i686-linux" "armhf-linux")
-                      emacs-wide-int)
-                     (_
-                      emacs)))
-         ("python" ,python)))
-      (synopsis "GNU Emacs client for the Telegram messenger")
-      (description
-       "Telega is a full-featured, unofficial GNU Emacs-based client for the
-Telegram messaging platform.")
-      (home-page "https://zevlg.github.io/telega.el/")
-      (license license:gpl3+))))
+  (package
+    (inherit emacs-telega-server)
+    (name "emacs-telega")
+    (build-system emacs-build-system)
+    (arguments
+     `(#:emacs ,(if (target-64bit?)
+                    emacs-minimal
+                    ;; Require wide-int support for 32-bit platform.
+                    emacs-wide-int)
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'configure
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (substitute* "telega-server.el"
+               (("@TELEGA_SERVER_BIN@")
+                (string-append (assoc-ref inputs "emacs-telega-server")
+                               "/bin/telega-server")))
+             (substitute* "telega-util.el"
+               (("@TELEGA_SHARE@")
+                (string-append (assoc-ref outputs "out")
+                               "/share/emacs-telega")))))
+         (add-after 'install 'install-share-files
+           (lambda* (#:key outputs #:allow-other-keys)
+             (define install-plan
+               '("langs" "sounds" "emojis.alist"
+                 "verified.svg" "telega-logo.svg"))
+
+             (define prefix (string-append (assoc-ref outputs "out")
+                                                "/share/emacs-telega"))
+             (with-directory-excursion "etc"
+               (for-each (lambda (file)
+                           (if (file-is-directory? file)
+                               (let ((dest (string-append prefix "/" file)))
+                                 (copy-recursively file dest))
+                               (install-file file prefix)))
+                         install-plan))
+             #t)))))
+    (inputs `(("emacs-telega-server" ,emacs-telega-server)))
+    (native-inputs '())
+    (propagated-inputs
+     `(("emacs-visual-fill-column" ,emacs-visual-fill-column)
+       ("emacs-company" ,emacs-company)
+       ("emacs-rainbow-identifiers" ,emacs-rainbow-identifiers)
+       ;; TODO: embbed references of following package into source file.
+       ("ffmpeg" ,ffmpeg)               ; GIF, video support.
+       ("libwebp" ,libwebp)             ; sticker support.
+       ))
+    (synopsis "GNU Emacs client for the Telegram messenger")
+    (description "Telega is a full-featured, unofficial GNU Emacs-based client
+for the Telegram messaging platform.")))
 
 (define-public emacs-telega-contrib
   (package/inherit emacs-telega
-- 
2.32.0

>From 84963cfc29a53cb6d31850bd3fc85de3d5a4c893 Mon Sep 17 00:00:00 2001
From: Zhu Zihao <[email-masked]>
Date: Fri, 25 Jun 2021 13:29:30 +0800
Subject: [PATCH 3/3] gnu: emacs-telega-contrib: Update to 0.7.024.

* gnu/packages/emacs-xyz.scm(emacs-telega-contrib): Update to 0.7.024.

[arguments]<phases>: Back to root directory of build before phase
'install-license-files' to properly install licenses.
[propagated-inputs]: Add emacs-dashboard, emacs-transient.
---
 gnu/packages/emacs-xyz.scm | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index c8540bbead..872f2253a0 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -26116,19 +26116,28 @@ service, and connect it with Emacs via inter-process communication.")
 for the Telegram messaging platform.")))
 
 (define-public emacs-telega-contrib
-  (package/inherit emacs-telega
+  (package
+    (inherit emacs-telega)
     (name "emacs-telega-contrib")
-    (build-system emacs-build-system)
     (arguments
      `(#:exclude '("telega-live-location.el")
        #:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'chdir
-           (lambda _ (chdir "contrib") #t)))))
+         (add-after 'unpack 'enter-subdirectory
+           (lambda _ (chdir "contrib") #t))
+         (add-before 'install-license-files 'leave-subdirectory
+           (lambda _ (chdir "..") #t)))))
+    (inputs '())
+    (native-inputs '())
     (propagated-inputs
-     `(("emacs-telega" ,emacs-telega)
-       ("emacs-alert" ,emacs-alert)
-       ("emacs-all-the-icons" ,emacs-all-the-icons)))))
+     `(("emacs-alert" ,emacs-alert)
+       ("emacs-all-the-icons" ,emacs-all-the-icons)
+       ("emacs-dashboard" ,emacs-dashboard)
+       ("emacs-telega" ,emacs-telega)
+       ("emacs-transient" ,emacs-transient)))
+    (synopsis "Contributed packages to Telega")
+    (description "Telega-contrib is a collection of third-party
+contributed packages to Telega.")))
 
 (define-public emacs-doom-modeline
   (package
-- 
2.32.0

Some questions that Guix maintainer may have interest in:

1. Why separate telega-server to a dedicated package?

emacs-build-system is quite cumbersome due to the different install step
than gnu-build-system, if we try to mix the build code of server into it
via 'modify-phases', it'll be very hard to read and understand the logic
of package code.

Move telega-server to a dedicated package can also help us separate
package, if there's a program uses telega-server, it doesn't have to add
emacs-telega as input, they just add emacs-telega-server.

2. Why propagated ffmpeg.

I check the source and found that telega use binaries from ffmpeg many
different place in telega-ffplay.el and telega-vvnote.el. So it's better
to propagated it because it's not easy to fix them all.

3. Why install resources to '<prefix>/share/emacs-telega'?

I think it is closer to the flavor of FHS, and it's not hard to achieve it.
-- 
Retrieve my PGP public key:

  gpg --recv-keys D47A9C8B2AE3905B563D9135BE42B352A9F6821F

Zihao