;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2016 Petter ;;; Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Leo Famulari ;;; Copyright © 2020 Tobias Geerinckx-Rice ;;; Copyright © 2020-2022 Efraim Flashner ;;; Copyright © 2020 Giacomo Leidi ;;; Copyright © 2021 Maxim Cournoyer ;;; Copyright © 2021 Arun Isaac ;;; Copyright © 2022 John Kehayias ;;; Copyright © 2023 Benjamin Slade ;;; Copyright © 2024 David Pflug ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu packages syncthing) #:use-module (guix build-system go) #:use-module (guix build-system python) #:use-module (guix gexp) #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix licenses) #:use-module (gnu packages) #:use-module (gnu packages freedesktop) #:use-module (gnu packages glib) #:use-module (gnu packages gnome) #:use-module (gnu packages golang) #:use-module (gnu packages golang-build) #:use-module (gnu packages golang-compression) #:use-module (gnu packages gtk) #:use-module (gnu packages linux) #:use-module (gnu packages python-crypto) #:use-module (gnu packages time)) (define-public syncthing (package (name "syncthing") (version "1.27.2") (source (origin (method url-fetch) (uri (string-append "https://github.com/syncthing/syncthing" "/releases/download/v" version "/syncthing-source-v" version ".tar.gz")) (sha256 (base32 "0g418jyqqik8ds8qcrlnmm2bhwwpbrfgd82fg2jyip4zw1aicqia")))) (build-system go-build-system) ;; The primary Syncthing executable goes to "out", while the auxiliary ;; server programs and utility tools go to "utils". This reduces the size ;; of "out" by ~144 MiB. (outputs '("out" "utils")) (arguments (list #:modules '((srfi srfi-26) ; for cut (guix build utils) (guix build go-build-system)) #:go go-1.20 #:import-path "github.com/syncthing/syncthing" ;; We don't need to install the source code for end-user applications. #:install-source? #f #:phases #~(modify-phases %standard-phases (add-before 'build 'increase-test-timeout (lambda _ (substitute* "src/github.com/syncthing/syncthing/build.go" (("120s") "999s")))) (replace 'build (lambda _ (with-directory-excursion "src/github.com/syncthing/syncthing" ;; XXX The only way to build Syncthing without its automatic ;; updater and to build the utilities is to "build all" and then ;; "build syncthing" again with -no-upgrade. ;; https://github.com/syncthing/syncthing/issues/6118 (invoke "go" "run" "build.go") (delete-file "bin/syncthing") (invoke "go" "run" "build.go" "-no-upgrade" "build" "syncthing")))) (replace 'check (lambda* (#:key tests? #:allow-other-keys) (when tests? (with-directory-excursion "src/github.com/syncthing/syncthing" (invoke "go" "run" "build.go" "test"))))) (replace 'install (lambda _ (with-directory-excursion "src/github.com/syncthing/syncthing/bin" (install-file "../syncthing" (string-append #$output "/bin")) (for-each (cut install-file <> (string-append #$output:utils "/bin/")) '("stcompdirs" "stcrashreceiver" "stdisco" "stdiscosrv" "stevents" "stfileinfo" "stfinddevice" "stfindignored" "stgenfiles" "strelaypoolsrv" "strelaysrv" "stsigtool" "stvanity" "stwatchfile" "ursrv"))))) (add-after 'install 'install-docs (lambda _ (let ((man (string-append #$output "/share/man")) (man:utils (string-append #$output:utils "/share/man"))) ;; Install all the man pages to "out". (for-each (lambda (file) (install-file file (string-append man "/man" (string-take-right file 1)))) (find-files "src/github.com/syncthing/syncthing/man" "\\.[1-9]")) ;; Copy all the man pages to "utils" (copy-recursively man man:utils) ;; Delete extraneous man pages from "out" and "utils", ;; respectively. (delete-file (string-append man "/man1/stdiscosrv.1")) (delete-file (string-append man "/man1/strelaysrv.1")) (delete-file (string-append man:utils "/man1/syncthing.1")))))))) (synopsis "Decentralized continuous file system synchronization") (description "Syncthing is a peer-to-peer file synchronization tool that supports a wide variety of computing platforms. It uses the Block Exchange Protocol.") (home-page "https://github.com/syncthing/syncthing") (properties '((release-monitoring-url . "https://syncthing.net/downloads/") (upstream-name . "syncthing-source") ;; The hashing code greatly benefits from newer architecture support. (tunable? . #t))) (license mpl2.0))) (define-public syncthing-gtk ;; The commit used below corresponds to the latest commit of the ;; python3-port branch maintained by Debian. Upstream hasn't bothered ;; porting to Python 3 (see: ;; https://github.com/kozec/syncthing-gtk/issues/487). (let ((revision "1") (commit "c46fbd8ad1d12d409da8942702a2f119cf45514a")) (package (name "syncthing-gtk") (version (git-version "0.9.4.4" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://salsa.debian.org/debian/syncthing-gtk.git") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "1x1c8snf0jpgjmyyidjw0015ksk5ishqn817wx8vs9i0lfgnnbbg")))) (build-system python-build-system) (arguments `(#:phases (modify-phases %standard-phases (add-after 'unpack 'hardcode-dependencies (lambda* (#:key inputs #:allow-other-keys) (let ((psmisc (assoc-ref inputs "psmisc")) (syncthing (assoc-ref inputs "syncthing"))) ;; Hardcode dependencies paths to avoid propagation. (substitute* "syncthing_gtk/tools.py" (("killall") (string-append psmisc "/bin/killall"))) (substitute* "syncthing_gtk/configuration.py" (("/usr/bin/syncthing") (string-append syncthing "/bin/syncthing")))))) (add-after 'unpack 'fix-autostart-path ;; Change the autostart .desktop file 'Exec' command so it finds ;; the Python wrapper of 'syncthing-gtk', rather than the unwrapped ;; '.syncthing-gtk-real'. (lambda _ (substitute* "syncthing_gtk/tools.py" (("return executable") "return \"syncthing-gtk\"")))) (add-after 'unpack 'remove-windows.py (lambda _ ;; A Windows-specific module that fails to load with ;; "ModuleNotFoundError: No module named 'msvcrt'. (delete-file "syncthing_gtk/windows.py"))) (add-after 'wrap 'wrap-libs (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) (wrap-program (string-append out "/bin/syncthing-gtk") `("GI_TYPELIB_PATH" ":" prefix (,(getenv "GI_TYPELIB_PATH")))))))))) (inputs (list gtk+ libappindicator libnotify python-bcrypt python-dateutil python-pycairo python-pygobject psmisc syncthing)) (home-page "https://github.com/syncthing/syncthing-gtk") (synopsis "GTK3 based GUI and notification area icon for Syncthing") (description "@code{syncthing-gtk} is a GTK3 Python based GUI and notification area icon for Syncthing. Supported Syncthing features: @itemize @item Everything that WebUI can display @item Adding, editing and deleting nodes @item Adding, editing and deleting repositories @item Restart, shutdown server @item Editing daemon settings @end itemize\n") (license gpl2)))) (define-public qsyncthingtray (deprecated-package "qsyncthingtray" syncthing-gtk)) (define-public go-github-com-syncthing-notify (let ((commit "69c7a957d3e261f9744f46b3dd4d608d8480ad90") (revision "5")) (package (name "go-github-com-syncthing-notify") (version (git-version "0.0.0" revision commit)) (source (origin (method git-fetch) (uri (git-reference (url "https://github.com/syncthing/notify") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "1mmdzyfnmjabyhbipl4bggw4w5nlxyyjp0d93qd824kj07kmsr1f")))) (build-system go-build-system) (arguments '(#:import-path "github.com/syncthing/notify")) (propagated-inputs (list go-golang-org-x-sys)) (synopsis "File system event notification library") (description "This package provides @code{notify}, a file system event notification library in Go.") (home-page "https://github.com/syncthing/notify") (license expat))))