Subject: Re: [bug#39619] [v2] Re: bug#39619: Acknowledgement ([PATCH 0/4] Add nheko matrix client)

From: Nicolò Balzarotti <[email-masked]>
Date: Fri, 21 Feb 2020 22:57:16 +0100

Nicolas Goaziou <[email-masked]> writes:

Hi, 
> Hello,
>
> Nicolò Balzarotti <[email-masked]> writes:
>
>> I just noticed that nlohmann-json-cpp is deprecated for json-modern-cxx,
>> fixed it in the two patches that were using it.
>
> Thank you for the patches.
>

thanks for your review.

> Unfortunately, I cannot build nheko because of a missing lmdbxx input.
>
lmdbxx was patch #3, but I created some noise sending replying to
guix-patches and creating multiple issues.  I'm sending it again with
other fixes applied.

> Some comments follow.
>
>> +           (lambda _
>> +             (substitute* "CMakeLists.txt"
>> +               (("add_test\\(BasicConnectivity") "# add_test")
>> +               (("add_test\\(ClientAPI") "# add_test")
>> +               (("add_test\\(MediaAPI") "# add_test")
>> +               (("add_test\\(Encryption") "# add_test"))
>
> Nitpick: I suggest to use a single regexp for these.

Sure, done.  I'm not much confident with substitute* yet.

>
>> +    (inputs
>> +     `(("boost" ,boost)
>> +       ("libolm" ,libolm)
>> +       ("libsodium" ,libsodium)
>> +       ("openssl" ,openssl)
>> +       ("json-modern-cxx" ,json-modern-cxx)
>> +       ("spdlog" ,spdlog)
>> +       ("zlib" ,zlib)))
>
> Could you re-order inputs alphabetically?

Done

>
>> +    (description "@code{mtxclient} is a C++ library that implements client API
>> +for the Matrix protocol.  It's built on to of @code{Boost.Asio}.")
>
> Nitpick: "It's" -> "It is".

Done
>> +    (license license:expat)))
>> +
>>  (define-public quaternion
>>    (package
>>      (name "quaternion")
>> @@ -1795,8 +1849,8 @@ QMatrixClient project.")
>>       (origin
>>         (method git-fetch)
>>         (uri (git-reference
>> -              (url "https://github.com/QMatrixClient/Quaternion")
>> -              (commit version)))
>> +             (url "https://github.com/QMatrixClient/Quaternion")
>> +             (commit version)))
>
> This change is unrelated to the patch. Could you remove it?
I'm sorry
>> +    (inputs
>> +     `(("boost" ,boost)
>> +       ("cmark" ,cmark)
>> +       ("libolm" ,libolm)
>> +       ("lmdb" ,lmdb)
>> +       ("lmdbxx" ,lmdbxx)
> What is that?
See previous comment

>> +       ("mtxclient" ,mtxclient)
>> +       ("openssl" ,openssl)
>> +       ("json-modern-cxx" ,json-modern-cxx)
>> +       ("qtbase" ,qtbase)
>> +       ("qtsvg" ,qtsvg)
>> +       ("qtmultimedia" ,qtmultimedia)
>> +       ("spdlog" ,spdlog)
>> +       ("tweeny" ,tweeny)
>> +       ("zlib" ,zlib)))
>> +    (native-inputs
>> +     `(("pkg-config" ,pkg-config)
>> +       ("qtlinguist" ,qttools)))
>
> Isn't it a bit confusing?
I copied it from
./gnu/packages/lxqt.scm:1332:          ("qtlinguist" ,qttools)))
./gnu/packages/sync.scm:193:       ("qtlinguist" ,qttools)))
./gnu/packages/music.scm:279:         ("qtlinguist" ,qttools)))
./gnu/packages/music.scm:4128:       ("qtlinguist" ,qttools)))

I can change it if needed, but I found other instances searching for
"qtlinguist" as cmake complained about it.  If those instances were
"qttools" I would have not found it.

>
>> +    (build-system qt-build-system)
>
> Nitpick: usually, build-system is above inputs and arguments.
>
>> +    (home-page "https://github.com/Nheko-Reborn/nheko")
>> +    (synopsis "Desktop client for Matrix using Qt and C++14")
>> +    (description "@code{Nheko} want to provide a native desktop app for the
>> +Matrix protocol that feels more like a mainstream chat app and less like an IRC
>> +client.
>
> "that feels more..." sounds link marketing buzz. Maybe we could remove it.
>
>> +Most of the features you would expect from a chat application are missing right
>> +now but we are getting close to a more feature complete client.
>
> I'm not sure this part is warranted either.
Removed and rephrased

>
>> Specifically
>> +there is support for:
>> +@itemize
>> +@item E2E encryption (text messages only: attachments are currently sent unencrypted).
>> +@item User registration.
>> +@item Creating, joining & leaving rooms.
>> +@item Sending & receiving invites.
>> +@item Sending & receiving files and emoji.
>> +@item Typing notifications.
>> +@item Username auto-completion.
>> +@item Message & mention notifications.
>> +@item Redacting messages.
>> +@item Read receipts.
>> +@item Basic communities support.
>> +@item Room switcher (@key{ctrl-K}).
>> +@item Light, Dark & System themes.
>> +@end itemize\n")
>
> No need for the final newline.

I wasn't sure, as there are dozens of instances with the newline after

rep -ri --line-number  '@end itemize[^\\n]'  | wc -l
181

grep -ri --line-number  '@end itemize\\n'  | wc -l
277

I removed it, but if there's a standard, it would be better if it was
respected (as for "new" contributors it's difficult to understand the
right way just by looking at existing packages)

>From 804536593ad1b4ecb93db92656e821837cc24754 Mon Sep 17 00:00:00 2001
From: nixo <[email-masked]>
Date: Sat, 15 Feb 2020 20:43:44 +0100
Subject: [PATCH 1/4] gnu: Add mtxclient.

* gnu/packages/messaging.scm (mtxclient): New variable.
---
 gnu/packages/messaging.scm | 52 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 120daacdc6..df80168d7c 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -48,6 +48,7 @@
   #:use-module (gnu packages boost)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages cpp)
   #:use-module (gnu packages crypto)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages cyrus-sasl)
@@ -68,6 +69,7 @@
   #:use-module (gnu packages libcanberra)
   #:use-module (gnu packages libidn)
   #:use-module (gnu packages linux)
+  #:use-module (gnu packages logging)
   #:use-module (gnu packages lua)
   #:use-module (gnu packages man)
   #:use-module (gnu packages ncurses)
@@ -1787,6 +1789,56 @@ implementation.  Quaternion and libqmatrixclient together form the
 QMatrixClient project.")
     (license license:lgpl2.1+)))
 
+(define-public mtxclient
+  (package
+    (name "mtxclient")
+    (version "0.2.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/Nheko-Reborn/mtxclient.git")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0pycznrvj57ff6gbwfn1xj943d2dr4vadl79hii1z16gn0nzxpmj"))))
+    (arguments
+     `(#:configure-flags
+       (list
+        ;; Disable example binaries (not installed)
+        "-DBUILD_LIB_EXAMPLES=OFF")
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'configure 'disable-network-tests
+           (lambda _
+             (substitute* "CMakeLists.txt"
+               (("add_test\\([BasicConnectivity|ClientAPI|MediaAPI|Encryption]")
+                "# add_test"))
+             #t))
+         (add-before 'configure 'set-home
+           (lambda _
+             ;; Tries to create package registry file
+             ;; So, set HOME.
+             (setenv "HOME" "/tmp")
+             #t)))))
+    (build-system cmake-build-system)
+    (inputs
+     `(("boost" ,boost)
+       ("json-modern-cxx" ,json-modern-cxx)
+       ("libolm" ,libolm)
+       ("libsodium" ,libsodium)
+       ("openssl" ,openssl)
+       ("spdlog" ,spdlog)
+       ("zlib" ,zlib)))
+    (native-inputs
+     `(("googletest" ,googletest)
+       ("pkg-config" ,pkg-config)))
+    (home-page "https://github.com/Nheko-Reborn/mtxclient")
+    (synopsis "Client API library for the Matrix protocol")
+    (description "@code{mtxclient} is a C++ library that implements client API
+for the Matrix protocol.  It is built on to of @code{Boost.Asio}.")
+    (license license:expat)))
+
 (define-public quaternion
   (package
     (name "quaternion")
-- 
2.25.0

>From f4529478acdbc6a139d952666ef732f4dbb21041 Mon Sep 17 00:00:00 2001
From: nixo <[email-masked]>
Date: Sat, 15 Feb 2020 20:59:10 +0100
Subject: [PATCH 2/4] gnu: Add tweeny.

* gnu/packages/cpp.scm (tweeny): New variable.
---
 gnu/packages/cpp.scm | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/gnu/packages/cpp.scm b/gnu/packages/cpp.scm
index ae1e3e3356..8098553828 100644
--- a/gnu/packages/cpp.scm
+++ b/gnu/packages/cpp.scm
@@ -410,3 +410,31 @@ SObjectizer supports not only the Actor Model but also the Publish-Subscribe
 Model and CSP-like channels.  The goal of SObjectizer is to simplify
 development of concurrent and multithreaded applications in C++.")
     (license license:bsd-3)))
+
+(define-public tweeny
+  (package
+    (name "tweeny")
+    (version "3")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/mobius3/tweeny.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1adm4c17pi7xf3kf6sjyxibz5rdg1ka236p72xsm6js4j9gzlbp4"))))
+    (arguments '(#:tests? #f))          ; no check target
+    (build-system cmake-build-system)
+    (home-page "https://mobius3.github.io/tweeny/")
+    (synopsis "Modern C++ tweening library")
+    (description "@code{Tweeny} is an inbetweening library designed for the
+creation of complex animations for games and other beautiful interactive
+software.  It leverages features of modern @code{C++} to empower developers with
+an intuitive API for declaring tweenings of any type of value, as long as they
+support arithmetic operations.  The goal of @code{Tweeny} is to provide means to
+create fluid interpolations when animating position, scale, rotation, frames or
+other values of screen objects, by setting their values as the tween starting
+point and then, after each tween step, plugging back the result.")
+    (license license:expat)))
-- 
2.25.0

>From d4c9c7f3239a38c7ad24a7af72b452506718fc73 Mon Sep 17 00:00:00 2001
From: nixo <[email-masked]>
Date: Sat, 15 Feb 2020 21:04:07 +0100
Subject: [PATCH 3/4] gnu: Add lmdbxx.

* gnu/packages/databases.scm (lmdbxx): New variable.
---
 gnu/packages/databases.scm | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index 587d993918..5f7377636f 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -2105,6 +2105,35 @@ multiple cores.  The size of each database is limited only by the size of the
 virtual address space — not physical RAM.")
     (license license:openldap2.8)))
 
+(define-public lmdbxx
+  (package
+    (name "lmdbxx")
+    (version "0.9.14.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/drycpp/lmdbxx.git")
+                    (commit (string-append version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1jmb9wg2iqag6ps3z71bh72ymbcjrb6clwlkgrqf1sy80qwvlsn6"))))
+    (arguments
+     `(#:make-flags
+       (list (string-append "PREFIX=" (assoc-ref %outputs "out")))
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure))))
+    (build-system gnu-build-system)
+    (inputs `(("lmdb" ,lmdb)))
+    (home-page "http://lmdbxx.sourceforge.net")
+    (synopsis "C++11 wrapper for the LMDB embedded B+ tree database library")
+    (description "@code{lmdbxx} is a comprehensive @code{C++} wrapper for the
+@code{LMDB} embedded database library, offering both an error-checked
+procedural interface and an object-oriented resource interface with RAII
+semantics.")
+    (license license:unlicense)))
+
 (define-public libpqxx
   (package
     (name "libpqxx")
-- 
2.25.0

>From 38ac0d6fe76c2202118dd6499110974062ff7232 Mon Sep 17 00:00:00 2001
From: nixo <[email-masked]>
Date: Sat, 15 Feb 2020 21:08:12 +0100
Subject: [PATCH 4/4] gnu: Add nheko.

* gnu/packages/messaging.scm (nheko): New variable.
---
 gnu/packages/messaging.scm | 76 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)

diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index df80168d7c..9e665fb08c 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -18,6 +18,7 @@
 ;;; Copyright © 2019 Tanguy Le Carrour <[email-masked]>
 ;;; Copyright © 2019, 2020 Brett Gilio <[email-masked]>
 ;;; Copyright © 2019, 2020 Timotej Lazar <[email-masked]>
+;;; Copyright © 2020 Nicolò Balzarotti <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -72,6 +73,7 @@
   #:use-module (gnu packages logging)
   #:use-module (gnu packages lua)
   #:use-module (gnu packages man)
+  #:use-module (gnu packages markup)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages networking)
   #:use-module (gnu packages pcre)
@@ -1839,6 +1841,80 @@ QMatrixClient project.")
 for the Matrix protocol.  It is built on to of @code{Boost.Asio}.")
     (license license:expat)))
 
+(define-public nheko
+  (package
+    (name "nheko")
+    (version "0.6.4")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/Nheko-Reborn/nheko.git")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "19dkc98l1q4070v6mli4ybqn0ip0za607w39hjf0x8rqdxq45iwm"))))
+    (arguments
+     `(#:tests? #f                      ; no test target
+       #:configure-flags
+       (list
+        "-DCMAKE_BUILD_TYPE=Release"
+        "-DCMAKE_CXX_FLAGS=-fpermissive")
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'remove-Werror
+           (lambda _
+             (substitute* "CMakeLists.txt"
+               (("-Werror") ""))
+             #t))
+         (add-after 'unpack 'fix-determinism
+           (lambda _
+             ;; Make Qt deterministic.
+             (setenv "QT_RCC_SOURCE_DATE_OVERRIDE" "1")
+             #t)))))
+    (build-system qt-build-system)
+    (inputs
+     `(("boost" ,boost)
+       ("cmark" ,cmark)
+       ("json-modern-cxx" ,json-modern-cxx)
+       ("libolm" ,libolm)
+       ("lmdb" ,lmdb)
+       ("lmdbxx" ,lmdbxx)
+       ("mtxclient" ,mtxclient)
+       ("openssl" ,openssl)
+       ("qtbase" ,qtbase)
+       ("qtsvg" ,qtsvg)
+       ("qtmultimedia" ,qtmultimedia)
+       ("spdlog" ,spdlog)
+       ("tweeny" ,tweeny)
+       ("zlib" ,zlib)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ("qtlinguist" ,qttools)))
+    (home-page "https://github.com/Nheko-Reborn/nheko")
+    (synopsis "Desktop client for Matrix using Qt and C++14")
+    (description "@code{Nheko} want to provide a native desktop app for the
+Matrix protocol that feels more like a mainstream chat app and less like an IRC
+client.
+
+There is support for:
+@itemize
+@item E2E encryption (text messages only: attachments are currently sent unencrypted).
+@item User registration.
+@item Creating, joining & leaving rooms.
+@item Sending & receiving invites.
+@item Sending & receiving files and emoji.
+@item Typing notifications.
+@item Username auto-completion.
+@item Message & mention notifications.
+@item Redacting messages.
+@item Read receipts.
+@item Basic communities support.
+@item Room switcher (@key{ctrl-K}).
+@item Light, Dark & System themes.
+@end itemize")
+    (license license:gpl3+)))
+
 (define-public quaternion
   (package
     (name "quaternion")
-- 
2.25.0

Thanks, Nicolò

> Regards,
> -- 
> Nicolas Goaziou