forked from tribes/guix
Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a15d5a0bf4 | |||
| bd9291ee8e | |||
| 9798583386 | |||
| ab0ca88517 | |||
| 964574452f | |||
| bc7babdca4 | |||
| 7db4de8f48 | |||
| 1089c208c0 | |||
| e99e394628 | |||
| 820fdf9549 | |||
| d45d75301c | |||
| e030447ebd | |||
| 621afc1dc7 | |||
| 92363d6ab0 | |||
| dd7f6b1c92 | |||
| 896898342d | |||
| 39f1fb3ad1 | |||
| 7964bbdf12 | |||
| e296f3f012 | |||
| 759bdcb469 | |||
| ee985ff4d6 | |||
| 4fdaa6e2f2 | |||
| 445e61337e | |||
| d632b423d5 | |||
| 4a4ef229e6 | |||
| 2c51b803e3 | |||
| 6690bf46c6 | |||
| 58266bb4ba | |||
| 69f512e520 | |||
| 83e5fe437f | |||
| ef81d340cd | |||
| 5ce1b4a3e3 | |||
| e155ef7c4b |
@@ -26,7 +26,6 @@
|
||||
|
||||
(define %sundry-texlive-packages
|
||||
(list bibtool
|
||||
dvisvgm
|
||||
rubber
|
||||
texmaker
|
||||
texstudio
|
||||
|
||||
@@ -2386,6 +2386,7 @@ dist_patch_DATA = \
|
||||
%D%/packages/patches/rust-1.70-fix-rustix-build.patch \
|
||||
%D%/packages/patches/rust-1.78-unwinding-fix.patch \
|
||||
%D%/packages/patches/rust-1.81-fix-riscv64-bootstrap.patch \
|
||||
%D%/packages/patches/rust-candle-0.9.1-add-candle-onnx-to-workspace.patch \
|
||||
%D%/packages/patches/rust-codex-0.98.0-core-remove-self-dep.patch \
|
||||
%D%/packages/patches/rust-codex-0.98.0-test-shebangs.patch \
|
||||
%D%/packages/patches/rust-codex-0.98.0-test-timeout.patch \
|
||||
@@ -2624,6 +2625,17 @@ dist_patch_DATA = \
|
||||
%D%/packages/patches/yggdrasil-extra-config.patch \
|
||||
%D%/packages/patches/ypsilon-Use-GNU-toolchain-as-default.patch \
|
||||
%D%/packages/patches/zabbix-agent2-test-timezone-fix.patch \
|
||||
%D%/packages/patches/zed-0.225.10-add-message-notification-action.patch \
|
||||
%D%/packages/patches/zed-0.225.10-add-guix-container-support.patch \
|
||||
%D%/packages/patches/zed-0.225.10-collapse-multiline-git-deps.patch \
|
||||
%D%/packages/patches/zed-0.225.10-exclude-libwebrtc-from-audio.patch \
|
||||
%D%/packages/patches/zed-0.225.10-disable-dlopen.patch \
|
||||
%D%/packages/patches/zed-0.225.10-fix-sqlite-memory-mode.patch \
|
||||
%D%/packages/patches/zed-0.225.10-fix-test-db-isolation.patch \
|
||||
%D%/packages/patches/zed-0.225.10-fix-workspace-race.patch \
|
||||
%D%/packages/patches/zed-0.225.10-keep-regular-file-workspaces.patch \
|
||||
%D%/packages/patches/zed-0.225.10-remove-patch-crates-io.patch \
|
||||
%D%/packages/patches/zed-0.225.10-use-mock-livekit-on-linux.patch \
|
||||
%D%/packages/patches/zig-0.9-build-respect-PKG_CONFIG-env-var.patch \
|
||||
%D%/packages/patches/zig-0.9-fix-runpath.patch \
|
||||
%D%/packages/patches/zig-0.9-riscv-support.patch \
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
(define-public aspell
|
||||
(package
|
||||
(name "aspell")
|
||||
(version "0.60.8.1")
|
||||
(version "0.60.8.2")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
@@ -60,7 +60,7 @@
|
||||
version ".tar.gz"))
|
||||
(sha256
|
||||
(base32
|
||||
"06yjhwlgpcvbrl5g83qjrpzjwjx7hka5lhsfc3x5gm229nri5nnn"))
|
||||
"06b9szgm9cj1zh58r7sbl5fbi3vi9fs7b1as4ir8y176x9ilizjp"))
|
||||
(patches (search-patches "aspell-default-dict-dir.patch"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
|
||||
@@ -1877,18 +1877,9 @@ R. Seaman's protocol}
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0n2jzlpwvjgj8ydg7hsqxnvy8s9pdi5z96id0231kgi87pyfkh7s"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "thirdparty" "thirdparty.cmake")))))
|
||||
(build-system cmake-build-system)
|
||||
(arguments
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
;;; Copyright © 2026 Luis Guilherme Coelho <lgcoelho@disroot.org>
|
||||
;;; Copyright © 2026 Noé Lopez <noelopez@free.fr>
|
||||
;;; Copyright © 2026 Carlos Durán Domínguez <wurt@wurt.eu>
|
||||
;;; Copyright © 2026 Daniel Martins <email@danielfm.me>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
@@ -3703,6 +3704,44 @@ compensation, (de)interleaving, and byte-swapping
|
||||
;; original developer.
|
||||
(license license:expat)))
|
||||
|
||||
(define-public rtcqs
|
||||
(package
|
||||
(name "rtcqs")
|
||||
(version "0.6.7")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://codeberg.org/rtcqs/rtcqs")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1kc3niyaq4m8di68832pgfb1b0m54q5gm68dwlzwwilgxi61ifzc"))))
|
||||
(build-system pyproject-build-system)
|
||||
(arguments
|
||||
(list
|
||||
#:tests? #f ;no test suite
|
||||
#:phases
|
||||
#~(modify-phases %standard-phases
|
||||
(add-after 'unpack 'remove-gui
|
||||
(lambda _
|
||||
(substitute* "pyproject.toml"
|
||||
(("\"FreeSimpleGUI\",?")
|
||||
"")
|
||||
(("rtcqs_gui = \"rtcqs\\.rtcqs_gui:main\"")
|
||||
""))
|
||||
(delete-file "src/rtcqs/rtcqs_gui.py")
|
||||
(delete-file "src/rtcqs/rtcqs_qt_gui.py"))))))
|
||||
(native-inputs (list python-setuptools))
|
||||
(home-page "https://codeberg.org/rtcqs/rtcqs")
|
||||
(synopsis "Linux audio real-time performance analyzer")
|
||||
(description
|
||||
"rtcqs analyzes a Linux system to detect possible bottlenecks that could
|
||||
have a negative impact on real-time audio performance. It checks kernel
|
||||
configuration, IRQ priorities, CPU governor, swappiness, and other settings
|
||||
relevant to low-latency audio work.")
|
||||
(license license:expat)))
|
||||
|
||||
(define-public rtosc
|
||||
(package
|
||||
(name "rtosc")
|
||||
|
||||
+17
-17
@@ -98,24 +98,24 @@
|
||||
(cut patch-shebang <> path)
|
||||
(find-files (string-append #$output "/etc/avahi"))))))))
|
||||
(inputs
|
||||
`(("bash-minimal" ,bash-minimal)
|
||||
("dbus" ,dbus)
|
||||
("expat" ,expat)
|
||||
("gdbm" ,gdbm)
|
||||
("glib" ,glib)
|
||||
;; Do not use libcap when cross-compiling since it's not quite
|
||||
;; cross-compilable; and use it only for supported systems.
|
||||
,@(if (and (not (%current-target-system))
|
||||
(member (%current-system)
|
||||
(package-supported-systems libcap)))
|
||||
`(("libcap" ,libcap)) ;to enable chroot support in avahi-daemon
|
||||
'())
|
||||
("libdaemon" ,libdaemon)
|
||||
("libevent" ,libevent)))
|
||||
(cons* bash-minimal
|
||||
dbus
|
||||
expat
|
||||
gdbm
|
||||
glib
|
||||
libdaemon
|
||||
libevent
|
||||
;; Do not use libcap when cross-compiling since it's not quite
|
||||
;; cross-compilable; and use it only for supported systems.
|
||||
(if (and (not (%current-target-system))
|
||||
(member (%current-system)
|
||||
(package-supported-systems libcap)))
|
||||
(list libcap) ;to enable chroot support in avahi-daemon
|
||||
(list))))
|
||||
(native-inputs
|
||||
`(("gettext" ,gettext-minimal)
|
||||
("glib" ,glib "bin")
|
||||
("pkg-config" ,pkg-config)))
|
||||
(list gettext-minimal
|
||||
(list glib "bin")
|
||||
pkg-config))
|
||||
(synopsis "Implementation of mDNS/DNS-SD protocols")
|
||||
(description
|
||||
"Avahi is a system which facilitates service discovery on a local
|
||||
|
||||
@@ -95,8 +95,8 @@ supported content to the Kodi media center.")
|
||||
;; Arbitrary commit of branch master,
|
||||
;; Update when updating uBlockOrigin.
|
||||
(let* ((name "ublock-main-assets")
|
||||
(commit "011eef4a5b36a7ebf4adedc486d96b77cfa25c54")
|
||||
(revision "5")
|
||||
(commit "004af606e6a0efc22bc65ab1016b553441cacb71")
|
||||
(revision "6")
|
||||
(version (git-version "0" revision commit)))
|
||||
(origin
|
||||
(method git-fetch)
|
||||
@@ -105,14 +105,14 @@ supported content to the Kodi media center.")
|
||||
(commit commit)))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0ng8a88zdvrxg30fz83gswjy27b3hfx9q11n2i715id7az7kqf9x")))))
|
||||
(base32 "1bfd2d53flrkgvjcr1kj9nbxj4y9a4pcr7m3dycccdhd21x6k0ln")))))
|
||||
|
||||
(define ublock-prod-assets
|
||||
;; Arbitrary commit of branch gh-pages,
|
||||
;; Update when updating uBlockOrigin.
|
||||
(let* ((name "ublock-prod-assets")
|
||||
(commit "6844322800de647da0c4fe06dd6a0b212a3942e4")
|
||||
(revision "5")
|
||||
(commit "6c15e4ef91888c610caf73829dc78ae9549ed24a")
|
||||
(revision "6")
|
||||
(version (git-version "0" revision commit)))
|
||||
(origin
|
||||
(method git-fetch)
|
||||
@@ -121,12 +121,12 @@ supported content to the Kodi media center.")
|
||||
(commit commit)))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "13vxq4z1wxivz5xklncxd2sj5aqkyhq919vzbbfp0fgh0imhikib")))))
|
||||
(base32 "0n2h6drqh44b1zgl729bfr70n08mkm536a2vqgivw7dm5dmi8zd3")))))
|
||||
|
||||
(define ublock-origin
|
||||
(package
|
||||
(name "ublock-origin")
|
||||
(version "1.66.2")
|
||||
(version "1.70.0")
|
||||
(home-page "https://github.com/gorhill/uBlock")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
@@ -136,7 +136,7 @@ supported content to the Kodi media center.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"16ph031hb8bf4rxyxvm6jr0bxmy0snza11jfrbjgfb390gax9r63"))))
|
||||
"0j1m80nz86yc69c42hv5di5zza0vkycqmjaydb9jgx0abcvi19x5"))))
|
||||
(build-system gnu-build-system)
|
||||
(outputs '("xpi" "firefox" "chromium"))
|
||||
(properties '((addon-id . "uBlock0@raymondhill.net")))
|
||||
|
||||
@@ -714,7 +714,7 @@ Its main purpose is to support the key usage by @code{docker-init}:
|
||||
(define-public podman
|
||||
(package
|
||||
(name "podman")
|
||||
(version "5.8.1")
|
||||
(version "5.8.2")
|
||||
(outputs '("out" "docker"))
|
||||
(properties
|
||||
`((output-synopsis "docker" "docker alias for podman")
|
||||
@@ -727,7 +727,7 @@ Its main purpose is to support the key usage by @code{docker-init}:
|
||||
(url "https://github.com/containers/podman")
|
||||
(commit (string-append "v" version))))
|
||||
(sha256
|
||||
(base32 "1wdsdc0nj4m1v8mn95dhavi87ad0adqmld70da59gvp2abff5f0f"))
|
||||
(base32 "12bmzbfyjsf0mwnam38cw9ib54wj1znh5b7lxzdyll9cvvkhqisr"))
|
||||
(file-name (git-file-name name version))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
|
||||
@@ -1096,17 +1096,9 @@ to aid in debugging.")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256 (base32 "0ppx8r9isc772y0ahpgl8g5b3yxka7ffqzlcsa920aib5nj39lrg"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(substitute* "pyproject.toml"
|
||||
;; Python is linked with GNU readline on all Guix targets.
|
||||
((".*gnureadline.*") "")
|
||||
|
||||
@@ -1586,31 +1586,21 @@ exploration and optimization.")
|
||||
(commit version)
|
||||
(recursive? #t)))
|
||||
(file-name (git-file-name name version))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "libs"
|
||||
"delaunay-triangulation"
|
||||
"dxflib"
|
||||
;; "fontobene-qt"
|
||||
;; "googletest"
|
||||
;; "hoedown"
|
||||
"librepcb"
|
||||
;; "muparser"
|
||||
"optional"
|
||||
"parseagle"
|
||||
;; "polyclipping"
|
||||
;; "quazip"
|
||||
"type_safe")))
|
||||
#~(delete-all-but "libs"
|
||||
"delaunay-triangulation"
|
||||
"dxflib"
|
||||
;; "fontobene-qt"
|
||||
;; "googletest"
|
||||
;; "hoedown"
|
||||
"librepcb"
|
||||
;; "muparser"
|
||||
"optional"
|
||||
"parseagle"
|
||||
;; "polyclipping"
|
||||
;; "quazip"
|
||||
"type_safe"))
|
||||
(sha256
|
||||
(base32 "1g3k2g2p5yy7zk971bg7qh4k38p30aydp27c5bfb02gn7djknz7w"))))
|
||||
(build-system cmake-build-system)
|
||||
@@ -2166,18 +2156,9 @@ layout of a circuit corresponds to the desired netlists.")
|
||||
;; no longer have their original upstream.
|
||||
(recursive? #t)))
|
||||
(file-name (git-file-name name version))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(use-modules (guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26))
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "3rdparty"
|
||||
;; The following sources have all been patched, so
|
||||
;; cannot easily be unbundled.
|
||||
|
||||
@@ -15925,18 +15925,9 @@ placed at the margin of the minibuffer for your completion candidates.")
|
||||
(url "https://github.com/Fuco1/smartparens")
|
||||
(commit commit)))
|
||||
(file-name (git-file-name name version))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
'(begin
|
||||
;; Taken from nextpnr package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred
|
||||
(negate (cut member <> (append '("." "..") preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each delete-file items))))
|
||||
;; Only activate basic tests.
|
||||
(delete-all-but "test"
|
||||
"test-helper.el"
|
||||
|
||||
@@ -460,13 +460,6 @@ It aims to support Nintendo DSi and 3DS as well.")
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
|
||||
;; Clean up the source from bundled libraries we don't need.
|
||||
(delete-all-but "Externals"
|
||||
;; XXX: The build system is currently hard-coded
|
||||
@@ -656,14 +649,6 @@ turbo speed, networked multiplayer, and graphical enhancements.")
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
|
||||
;; Clean up the source from bundled libraries we don't need.
|
||||
(delete-all-but "Externals"
|
||||
;; XXX: The build system is currently hard-coded
|
||||
@@ -1079,17 +1064,9 @@ The following systems are supported:
|
||||
(sha256
|
||||
(base32
|
||||
"0dfsz4dsh49dc9xx9rjhfzfkg4h91i2ksgp2inlr9yhgldw9q8h3"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <> (cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
|
||||
(delete-all-but "src/third-party"
|
||||
"blip_buf"
|
||||
"inih")))))
|
||||
@@ -2319,42 +2296,9 @@ physical device and the RetroPad virtual controller.")
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
'(begin
|
||||
(use-modules (guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-1)
|
||||
(srfi srfi-26))
|
||||
(define (delete-all-but . preserve)
|
||||
;; Walk the file tree and delete everything except the paths
|
||||
;; listed in PRESERVE. Directories listed PRESERVE will cause
|
||||
;; their whole contents to be preserved.
|
||||
(let ((preserve (map (compose (cut string-trim-right <> #\/)
|
||||
(cut string-append "./" <>))
|
||||
preserve)))
|
||||
(file-system-fold
|
||||
(lambda (path stat result) ;enter
|
||||
(or (any (lambda (x)
|
||||
(or (string-prefix? path x)
|
||||
(string-prefix? x path)))
|
||||
preserve)
|
||||
(begin
|
||||
(delete-file-recursively path)
|
||||
#f)))
|
||||
(lambda (path stat result) ;leaf (file)
|
||||
(unless (any (cut string-prefix? <> path) preserve)
|
||||
(delete-file path)))
|
||||
(const #t) ;down (directory)
|
||||
(const #t) ;up (directory)
|
||||
(lambda (path stat result) ;skip
|
||||
(when (file-exists? path)
|
||||
(error "could not enter unreadable directory" path)))
|
||||
(lambda (path stat errno result) ;error
|
||||
(error "error processing" path (strerror errno)))
|
||||
0
|
||||
".")))
|
||||
|
||||
;; This is an allow-list of the shaders explicitly licensed as
|
||||
;; free software.
|
||||
(delete-all-but
|
||||
(delete-all-but "."
|
||||
"anamorphic/shaders/anamorphic.slang" ;expat
|
||||
"anamorphic/anamorphic.slangp"
|
||||
"annotated_passthru.slang" ;public license
|
||||
@@ -3011,16 +2955,7 @@ GLSL (@file{.slang}) shaders for use with RetroArch.")
|
||||
(commit (string-append "v" version))))
|
||||
(snippet
|
||||
#~(begin
|
||||
(use-modules (guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26))
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(use-modules (guix build utils))
|
||||
;; Remove as much bundled sources as possible, shaving off about
|
||||
;; 65 MiB.
|
||||
(delete-all-but "deps"
|
||||
@@ -3827,24 +3762,14 @@ de-interlacing patches for use with PCSX2.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0nr53cjifqwnz3icxsj01yd3aw1vfsfxga4zz5zi8aqr175mvq27"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(substitute* "cmake/Pcsx2Utils.cmake"
|
||||
(("(PCSX2_GIT_REV \")Unknown" _ prefix)
|
||||
(string-append prefix #$version "-guix")))
|
||||
(delete-file "3rdparty/include/Packet32.h") ;"not open source"
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but
|
||||
"3rdparty"
|
||||
(delete-all-but "3rdparty"
|
||||
;; asl2.0 and cc0
|
||||
"glad" ;Is tailored.
|
||||
;; bsd-3
|
||||
|
||||
@@ -792,16 +792,16 @@ the freedesktop.org XDG Base Directory specification.")
|
||||
(define-public elogind
|
||||
(package
|
||||
(name "elogind")
|
||||
(version "255.17")
|
||||
(version "255.22")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/elogind/elogind")
|
||||
(commit (string-append "v" version))))
|
||||
(commit (string-append "V" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"0cb6p559281dzh24is91v6d4v4kz45yhyizibi4sfql9nign865h"))))
|
||||
"0hnzks8f0jl2hkf954pqky5490zacqaipz20k38qvzl5g8i1if5l"))))
|
||||
(build-system meson-build-system)
|
||||
(arguments
|
||||
`(#:configure-flags
|
||||
|
||||
@@ -1182,17 +1182,9 @@ It is capable of creating games for SCUMM version 6 and partially version 7.")
|
||||
(sha256
|
||||
(base32
|
||||
"12f1d45995qf5sazjmmfdydllcd6alhqs1s4xwv3jiq1fw66hcy9"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
'(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <> (cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "extlibs/headers"
|
||||
"glad"))))) ;pre-generated headers
|
||||
(build-system cmake-build-system)
|
||||
|
||||
@@ -5521,7 +5521,7 @@ falling, themeable graphics and sounds, and replays.")
|
||||
(name "wesnoth")
|
||||
;; Even-numbered minor versions indicate stable versions:
|
||||
;; https://wiki.wesnoth.org/ReleasingWesnoth#Version_numbering
|
||||
(version "1.18.6")
|
||||
(version "1.18.7")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
@@ -5530,7 +5530,7 @@ falling, themeable graphics and sounds, and replays.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"0cdlczxczqgzdaqwydb9gfgi7d9jc39li72p2rb5nk1rlgfff79s"))))
|
||||
"0hdrp4xm9d8kj8id2g5q0wwdwykx4a0f1cs8a7fghmv0czryfv7f"))))
|
||||
(build-system cmake-build-system)
|
||||
(arguments
|
||||
(list #:tests? #f ;no test target
|
||||
|
||||
+21
-24
@@ -19,10 +19,12 @@
|
||||
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
(define-module (gnu packages gkrellm)
|
||||
#:use-module (guix build-system gnu)
|
||||
#:use-module (guix download)
|
||||
#:use-module (guix gexp)
|
||||
#:use-module ((guix licenses) #:prefix license:)
|
||||
#:use-module (guix packages)
|
||||
#:use-module (guix download)
|
||||
#:use-module (guix build-system gnu)
|
||||
#:use-module (guix utils)
|
||||
#:use-module (gnu packages gettext)
|
||||
#:use-module (gnu packages gtk)
|
||||
#:use-module (gnu packages pkg-config)
|
||||
@@ -31,32 +33,27 @@
|
||||
(define-public gkrellm
|
||||
(package
|
||||
(name "gkrellm")
|
||||
(version "2.3.11")
|
||||
(version "2.5.1")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "http://gkrellm.srcbox.net/releases/gkrellm-"
|
||||
version ".tar.bz2"))
|
||||
(sha256
|
||||
(base32 "01lccz4fga40isv09j8rjgr0qy10rff9vj042n6gi6gdv4z69q0y"))))
|
||||
(method url-fetch)
|
||||
(uri (string-append "https://gkrellm.srcbox.net/releases/gkrellm-"
|
||||
version ".tar.bz2"))
|
||||
(sha256
|
||||
(base32 "0qvy2xmwmfy5f0g09yn9lr262shnx82ba04r5il2wj4qscg3r7h8"))))
|
||||
(build-system gnu-build-system)
|
||||
(inputs
|
||||
`(("gettext" ,gettext-minimal)
|
||||
("gtk+" ,gtk+-2)
|
||||
("libice" ,libice)
|
||||
("libsm" ,libsm)))
|
||||
(native-inputs
|
||||
(list pkg-config))
|
||||
(inputs (list gtk+-2 libsm))
|
||||
(native-inputs (list gettext-minimal pkg-config))
|
||||
(arguments
|
||||
`(#:tests? #f ; there is no check target
|
||||
#:phases
|
||||
(modify-phases %standard-phases
|
||||
(delete 'configure)) ; no configure script
|
||||
#:make-flags
|
||||
(let ((out (assoc-ref %outputs "out")))
|
||||
(list (string-append "INSTALLROOT=" out)
|
||||
"CC=gcc"))))
|
||||
(home-page "http://gkrellm.srcbox.net/")
|
||||
(list
|
||||
#:tests? #f ;there is no check target
|
||||
#:phases
|
||||
#~(modify-phases %standard-phases
|
||||
(delete 'configure)) ;no configure script
|
||||
#:make-flags
|
||||
#~(list (string-append "INSTALLROOT=" #$output)
|
||||
(string-append "CC=" #$(cc-for-target)))))
|
||||
(home-page "https://gkrellm.srcbox.net/")
|
||||
(synopsis "System monitors")
|
||||
(description
|
||||
"GKrellM is a single process stack of system monitors which supports
|
||||
|
||||
@@ -165,14 +165,14 @@ tool to extract metadata from a file and print the results.")
|
||||
(define-public libmicrohttpd
|
||||
(package
|
||||
(name "libmicrohttpd")
|
||||
(version "1.0.2")
|
||||
(version "1.0.3")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "mirror://gnu/libmicrohttpd/libmicrohttpd-"
|
||||
version ".tar.gz"))
|
||||
(sha256
|
||||
(base32
|
||||
"1ix843yqhcl8d5gh5652pw2scx4p5n836ca80ymms5rl136lycnz"))))
|
||||
"0shj6kk4xp3k45vv696bzgx4s2jzpvhp11syck1zb70rmrxba5kq"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
(list #:configure-flags
|
||||
|
||||
@@ -192,17 +192,9 @@ definitions in Go programs.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0c1rxbj3v3m0fqb8q96xlbawxm9scyx6vvr8pddkiwp7zkx4ajym"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "cmd" "godoc")
|
||||
(delete-all-but "." "cmd")))))
|
||||
(build-system go-build-system)
|
||||
|
||||
@@ -1535,17 +1535,9 @@ Go programming language.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0sjvngpahkb5x573i855fjlb1fdmr6n269nmb5xxnbabjb27mnvg"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "go" "expect")
|
||||
(delete-all-but "." "go")))))
|
||||
(build-system go-build-system)
|
||||
@@ -1575,17 +1567,9 @@ Go source code (including go.mod and go.work files) as test expectations.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0sjvngpahkb5x573i855fjlb1fdmr6n269nmb5xxnbabjb27mnvg"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "go" "packages")
|
||||
(delete-all-but "go/packages" "packagestest")
|
||||
(delete-all-but "." "go")))))
|
||||
@@ -1618,18 +1602,9 @@ tools on.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1blk22apy424j9v58lfy4pxnrgh93yqchqhxsnf78dmx4vx5yi9r"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "godoc")))))
|
||||
#~(begin (delete-all-but "." "godoc")))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
|
||||
+72
-571
File diff suppressed because it is too large
Load Diff
+24
-163
@@ -1237,26 +1237,8 @@ may be interactive or produce standard formats such as SVG or PDF.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1np11if704xzyhsx9mqhz7djx23g6wnz62r1v9ra6xaz91yfic0n"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(define (directory? x)
|
||||
(and=> (stat x #f)
|
||||
(compose (cut eq? 'directory <>) stat:type)))
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred
|
||||
(negate (cut member <> (append '("." "..") preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (lambda (item)
|
||||
(if (directory? item)
|
||||
(delete-file-recursively item)
|
||||
(delete-file item)))
|
||||
items))))
|
||||
(delete-all-but "." "generate")))))
|
||||
(modules '((guix build utils)))
|
||||
(snippet #~(delete-all-but "." "generate"))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -4817,18 +4799,9 @@ and multi-selects with a focus on user experience and aesthetics.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "083zj3yqb48li8w389iabi1b1zklbw7cwam2grvvglcqrrsj3bsf"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "ansi")))))
|
||||
#~(begin (delete-all-but "." "ansi")))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -4865,14 +4838,7 @@ ECMA-48} specs.")
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "cellbuf")))))
|
||||
#~(begin (delete-all-but "." "cellbuf")))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -4930,18 +4896,8 @@ ECMA-48} specs.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "088786ak8jsgvssbb5y16z066vfq9f6078sjc7iv766knfr2i0x2"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "errors")))))
|
||||
(modules '((guix build utils)))
|
||||
(snippet #~(delete-all-but "." "errors"))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -5093,18 +5049,9 @@ package provides an API for comparing Golden files.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1shw55110fnn4xz80wmgr18czmiil6z1j064m90iw8c7j9llfzn5"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "term")))))
|
||||
#~(begin (delete-all-but "." "term")))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -5192,21 +5139,8 @@ package provides an API for comparing Golden files.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0blpb8vpl7sc6pb43h0730wdcwrkvnhly6qhik6wljrzn2nqz5g2"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
;; Consider implementing it as a reusable procedure in
|
||||
;; guix/build/utils or guix/build-system/go.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "xpty")))))
|
||||
(modules '((guix build utils)))
|
||||
(snippet #~(delete-all-but "." "xpty"))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -6244,21 +6178,8 @@ packages.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0afaljkkd388f6igr3f2vjnd14yr8h20fcfzglw8j5q1q7a1cvik"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
;; Consider implementing it as a reusable procedure in
|
||||
;; guix/build/utils or guix/build-system/go.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "pkg")))))
|
||||
(modules '((guix build utils)))
|
||||
(snippet #~(delete-all-but "." "pkg"))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -15180,18 +15101,9 @@ Twisted's manhole library} .")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0xj782ghf0iv8r2xxmg2vrh72b02h216y4yfyi60y9z0691lrsip"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "tools")))))
|
||||
#~(begin (delete-all-but "." "tools")))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -18795,18 +18707,9 @@ publish–subscribe pattern}.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "0an8ypp8v9gfxbbb71mpimb1g9labl4v7lgazcphysn6c5smgmiw"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "atomicwriter")))))
|
||||
#~(begin (delete-all-but "." "atomicwriter")))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -18861,18 +18764,9 @@ https://github.com/syndtr/gocapability.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1nh1disclgydvq7k10awzks6k8kw9cjj3q19f83ksi4b76p5l475"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "mount")))))
|
||||
#~(begin (delete-all-but "." "mount")))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -29615,21 +29509,8 @@ when they'd prefer a more familiar, loosely typed API.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "05i15278swdmpif3p6g18sy0sn7rnfdl3m2rj5p30cnyb0j29vig"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
;; Consider implementing it as a reusable procedure in
|
||||
;; guix/build/utils or guix/build-system/go.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "exp")))))
|
||||
(modules '((guix build utils)))
|
||||
(snippet #~(delete-all-but "." "exp"))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -31028,18 +30909,9 @@ code.")
|
||||
(name "go-modernc-org-ccgo-v4")
|
||||
(source (origin
|
||||
(inherit (package-source go-modernc-org-ccgo-v3))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "v4")))))
|
||||
#~(begin (delete-all-but "." "v4")))))
|
||||
(arguments
|
||||
(substitute-keyword-arguments
|
||||
(package-arguments go-modernc-org-ccgo-v3)
|
||||
@@ -31995,20 +31867,9 @@ unmarshaling functions based on @code{encoding/json} @code{Unmarshal()}.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "12n8ij4gisah5mvxcgq263iic61gjpxdj3ml03826zckzn7wlv46"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
;; Consider implementing it as a reusable procedure in
|
||||
;; guix/build/utils or guix/build-system/go.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "cmd")
|
||||
(delete-all-but "cmd" "config")))))
|
||||
(build-system go-build-system)
|
||||
|
||||
@@ -47,13 +47,13 @@
|
||||
(define-public groff
|
||||
(package
|
||||
(name "groff")
|
||||
(version "1.22.4")
|
||||
(version "1.24.0")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "mirror://gnu/groff/groff-" version
|
||||
".tar.gz"))
|
||||
(sha256 (base32
|
||||
"14q2mldnr1vx0l9lqp9v2f6iww24gj28iyh4j2211hyynx67p3p7"))))
|
||||
"0w3mf9jb5j1gbw1160lr5498q4ayl5i3jpf5g8721l1yzzcbr6z7"))))
|
||||
(build-system gnu-build-system)
|
||||
(outputs '("out"
|
||||
"doc")) ;12MiB of PS, PDF, HTML, and examples
|
||||
|
||||
@@ -5787,6 +5787,43 @@ reading and writing PNG data, as well as some graphic primitives and basic image
|
||||
processing filters.")
|
||||
(license license:gpl3+)))
|
||||
|
||||
(define-public guile-pnm
|
||||
(package
|
||||
(name "guile-pnm")
|
||||
(version "0.1.0")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/artyom-poptsov/guile-pnm")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1yvsni4hll20g99zq4wl734f9i8gpjr1sqsnk3a93k2dd7b6ymac"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
(list
|
||||
#:make-flags
|
||||
#~(list "GUILE_AUTO_COMPILE=0"))) ;to prevent guild warnings
|
||||
(native-inputs (list autoconf
|
||||
automake
|
||||
pkg-config
|
||||
texinfo
|
||||
;; needed when cross-compiling.
|
||||
guile-3.0
|
||||
guile-lib
|
||||
guile-smc))
|
||||
(inputs (list guile-3.0 guile-lib))
|
||||
(propagated-inputs (list guile-smc))
|
||||
(home-page "https://github.com/artyom-poptsov/guile-pnm")
|
||||
(synopsis "NetBPM (PNM) library for GNU Guile")
|
||||
(description
|
||||
"@code{guile-pnm} is a GNU Guile library for working with the
|
||||
@url{https://en.wikipedia.org/wiki/Netpbm, NetPBM} format (also known as PNM),
|
||||
including portable bitmap (PBM), portable graymap (PGM) and portable
|
||||
pixel (PPM) variants.")
|
||||
(license license:gpl3+)))
|
||||
|
||||
(define-public guile-cv
|
||||
(package
|
||||
(name "guile-cv")
|
||||
|
||||
@@ -601,24 +601,16 @@ different data arrays similar to those available in the numdiff software.")
|
||||
(file-name (git-file-name name version))
|
||||
(snippet
|
||||
#~(begin
|
||||
(use-modules (guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26))
|
||||
(use-modules (guix build utils))
|
||||
;; Delete any bundled .jar files.
|
||||
(for-each delete-file (find-files "." "\\.jar$"))
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "3rdparty"
|
||||
"fastcv" ;TODO: Unbundle these
|
||||
"libspng"
|
||||
"libtim-vx"
|
||||
"orbbecsdk"
|
||||
"quirc"
|
||||
"zlib-ng")))
|
||||
"fastcv" ;TODO: Unbundle these
|
||||
"libspng"
|
||||
"libtim-vx"
|
||||
"orbbecsdk"
|
||||
"quirc"
|
||||
"zlib-ng")))
|
||||
(sha256
|
||||
(base32
|
||||
"15w4fqjqv5k1yw70jbjsnlgiky39mqpy05rvmm2fbyjrif4kbgkl"))))
|
||||
|
||||
+2
-14
@@ -1362,21 +1362,9 @@ code prior to it getting merged into @code{go-cid}.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "00lwizzdfdx6kynxddal3all6q9dhwqanpkw0d0vxlwik4nkvxa5"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
;; Consider to implement it as re-usable procedure in
|
||||
;; guix/build/utils or guix/build-system/go.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "." "ipfs")))))
|
||||
#~(begin (delete-all-but "." "ipfs")))))
|
||||
(build-system go-build-system)
|
||||
(arguments
|
||||
(list
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
(define-public jemalloc
|
||||
(package
|
||||
(name "jemalloc")
|
||||
(version "5.3.0")
|
||||
(version "5.3.1")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
@@ -44,7 +44,7 @@
|
||||
version "/jemalloc-" version ".tar.bz2"))
|
||||
(sha256
|
||||
(base32
|
||||
"1apyxjd1ixy4g8xkr61p0ny8jiz8vyv1j0k4nxqkxpqrf4g2vf1d"))))
|
||||
"14kgf0hs864hp5xxqfqh37l1d8wwg57h7wv28rffs8ig4f0bq9iq"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
(list
|
||||
|
||||
+30
-41
@@ -87,6 +87,7 @@
|
||||
;;; Copyright © 2025 John Kehayias <john.kehayias@protonmail.com>
|
||||
;;; Copyright © 2025 Arjan Adriaanse <arjan@adriaan.se>
|
||||
;;; Copyright © 2026 Justin Veilleux <terramorpha@cock.li>
|
||||
;;; Copyright © 2025 Dariqq <dariqq@posteo.net>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
@@ -3202,57 +3203,45 @@ accepted as a quirk (ie AMD Vega 10).")
|
||||
(define-public linux-pam
|
||||
(package
|
||||
(name "linux-pam")
|
||||
(version "1.5.2")
|
||||
(version "1.7.2")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
"https://github.com/linux-pam/linux-pam/releases/download/v"
|
||||
version "/Linux-PAM-" version ".tar.xz"))
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/linux-pam/linux-pam")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"0kgrsj2scv5mx6w925h9hxf11jnqqs9z8s22aw94b90xm4qp3v74"))
|
||||
"1z5apric696zsci28c7651spvdll0zrpfm9z574gcjf45mp22gmi"))
|
||||
(patches (search-patches "linux-pam-unix_chkpwd.patch"
|
||||
"linux-pam-no-setfsuid.patch"))))
|
||||
|
||||
(build-system gnu-build-system)
|
||||
(build-system meson-build-system)
|
||||
(outputs '("out" "doc")) ;; 0.8 MiB of html
|
||||
(inputs (list libxcrypt))
|
||||
(native-inputs
|
||||
(list flex
|
||||
;; TODO: optional dependencies
|
||||
;; ("cracklib" ,cracklib)
|
||||
))
|
||||
(list gettext-minimal
|
||||
flex bison
|
||||
;; manpages
|
||||
libxslt
|
||||
libxml2
|
||||
docbook-xml
|
||||
docbook-xsl))
|
||||
(arguments
|
||||
(list
|
||||
;; Most users, such as `shadow', expect the headers to be under
|
||||
;; `security'.
|
||||
#:configure-flags #~(list (string-append "--includedir="
|
||||
(assoc-ref %outputs "out")
|
||||
"/include/security")
|
||||
;; explicit libdir for pkgconfig files
|
||||
;; drop with 1.5.3, which fixes
|
||||
;; https://github.com/linux-pam/linux-pam/issues/466
|
||||
(string-append "--libdir="
|
||||
(assoc-ref %outputs "out")
|
||||
"/lib")
|
||||
|
||||
;; XXX: <rpc/rpc.h> is missing from glibc when
|
||||
;; cross-compiling, so we have to disable NIS
|
||||
;; support altogether.
|
||||
#$@(if (%current-target-system)
|
||||
#~("--disable-nis")
|
||||
#~()))
|
||||
|
||||
#:phases (if (target-hurd?)
|
||||
#~(modify-phases %standard-phases
|
||||
(add-after 'unpack 'skip-pam-limits
|
||||
(lambda _
|
||||
;; 'pam_limits.c' uses <sys/prctl.h>, which is
|
||||
;; Linux-specific. Skip it on GNU/Hurd.
|
||||
(substitute* "modules/Makefile.in"
|
||||
(("pam_limits") "")))))
|
||||
#~%standard-phases)
|
||||
|
||||
#:configure-flags
|
||||
#~(list
|
||||
;; lastlog is deprecated since 1.5.3
|
||||
"-Dpam_lastlog=enabled"
|
||||
(string-append "-Dvendordir=" #$output "/share/pam")
|
||||
(string-append "-Ddocbook-rng="
|
||||
#$(let ((docbook-xml (this-package-native-input
|
||||
"docbook-xml")))
|
||||
(file-append docbook-xml
|
||||
"/xml/docbook/"
|
||||
(package-version docbook-xml)
|
||||
"/rng/docbookxi.rng")))
|
||||
(string-append "-Dhtmldir=" #$output:doc "/share/doc/" #$name "/html"))
|
||||
;; XXX: Tests won't run in chroot, presumably because /etc/pam.d
|
||||
;; isn't available.
|
||||
#:tests? #f))
|
||||
|
||||
@@ -12982,8 +12982,8 @@ score. When evaluated, the musical score is rendered to an image.")
|
||||
(sbcl-package->ecl-package sbcl-cmn))
|
||||
|
||||
(define-public sbcl-coalton
|
||||
(let ((commit "939342495f55991812c2c2767322c5e51e755216")
|
||||
(revision "4"))
|
||||
(let ((commit "bf475c8c53e02a2e0cb29deab4d101d25743bfca")
|
||||
(revision "5"))
|
||||
(package
|
||||
(name "sbcl-coalton")
|
||||
(version (git-version "0.0.1" revision commit))
|
||||
@@ -12995,7 +12995,7 @@ score. When evaluated, the musical score is rendered to an image.")
|
||||
(commit commit)))
|
||||
(file-name (git-file-name "cl-coalton" version))
|
||||
(sha256
|
||||
(base32 "08qzj3v4fvn9h87whyqg650rpap8lva7jr94d1akv6m2z62l5q68"))))
|
||||
(base32 "0zrp2s82n2mxx7knbnbsdj64zar21nnnf8iwzrqzs4g3v6xpyz9z"))))
|
||||
(build-system asdf-build-system/sbcl)
|
||||
(native-inputs
|
||||
(list sbcl-fiasco))
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
;;; Copyright © 2024 Suhail Singh <suhail@bayesians.ca>
|
||||
;;; Copyright © 2024 David Pflug <david@pflug.io>
|
||||
;;; Copyright © 2024 Janneke Nieuwenhuizen <janneke@gnu.org>
|
||||
;;; Copyright © 2026 Igorj Gorjaĉev <igor@goryachev.org>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
@@ -912,7 +913,7 @@ assembler, PEG) is less than 1MB.")
|
||||
(define-public jpm
|
||||
(package
|
||||
(name "jpm")
|
||||
(version "1.1.0")
|
||||
(version "1.2.0")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
@@ -921,7 +922,7 @@ assembler, PEG) is less than 1MB.")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "05rdxigmiy7vf93s16a8n2029lq33073jccz1rjl4iisxj6piw4l"))))
|
||||
(base32 "06ywq1ajvqx3lfpldwbakc21hxhb313r0196xnmrrbb6k1f8hsfx"))))
|
||||
(build-system copy-build-system)
|
||||
(arguments
|
||||
(list
|
||||
|
||||
+4
-14
@@ -780,20 +780,10 @@ operating systems.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1sg6ifabci7xyp3zds1w906vx6jsmyjlfr6bqld7m7hj07by9ndd"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "autosetup"
|
||||
"mutt-gettext.tcl"
|
||||
"mutt-iconv.tcl")))))
|
||||
(modules '((guix build utils)))
|
||||
(snippet #~(delete-all-but "autosetup"
|
||||
"mutt-gettext.tcl"
|
||||
"mutt-iconv.tcl"))))
|
||||
(build-system gnu-build-system)
|
||||
(inputs
|
||||
(list cyrus-sasl
|
||||
|
||||
+1
-10
@@ -428,18 +428,9 @@ software vendors, application developers and computer science researchers.")
|
||||
(uri (string-append "https://www.open-mpi.org/software/ompi/v"
|
||||
(version-major+minor version)
|
||||
"/downloads/openmpi-" version ".tar.bz2"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
'(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
;; Delete as many bundled libraries as permitted by the build
|
||||
;; system.
|
||||
(delete-all-but "3rd-party" "treematch" "Makefile.in" "Makefile.am")
|
||||
|
||||
@@ -165,11 +165,7 @@ from the protocol files.")
|
||||
(arguments
|
||||
`(#:configure-flags '("--disable-static")))
|
||||
(native-inputs
|
||||
`(("autoconf" ,autoconf)
|
||||
("automake" ,automake)
|
||||
("gettext" ,gettext-minimal)
|
||||
("libtool" ,libtool)
|
||||
("pkg-config" ,pkg-config)))
|
||||
(list autoconf automake gettext-minimal libtool pkg-config))
|
||||
(inputs
|
||||
(list libtirpc))
|
||||
(synopsis "Public client interface for NIS(YP) and NIS+")
|
||||
|
||||
@@ -2,8 +2,14 @@ unix_chkpwd is designed to have a suid bit, but it's not possible to set it
|
||||
for files in the store. This patch tells unix_pam.so to look for
|
||||
unix_chkpwd in setuid program directory on Guix System.
|
||||
|
||||
--- a/modules/pam_unix/Makefile.in
|
||||
+++ b/modules/pam_unix/Makefile.in
|
||||
@@ -651,1 +651,1 @@
|
||||
- -DCHKPWD_HELPER=\"$(sbindir)/unix_chkpwd\" \
|
||||
+ -DCHKPWD_HELPER=\"/run/setuid-programs/unix_chkpwd\" \
|
||||
--- a/modules/module-meson.build
|
||||
+++ b/modules/module-meson.build
|
||||
@@ -114,7 +114,7 @@ if module == 'pam_unix'
|
||||
if enable_nis
|
||||
pam_module_src += ['yppasswd_xdr.c']
|
||||
endif
|
||||
- pam_module_c_args += ['-DCHKPWD_HELPER="@0@"'.format(sbindir / 'unix_chkpwd'),
|
||||
+ pam_module_c_args += ['-DCHKPWD_HELPER="@0@"'.format('/run/privileged/bin' / 'unix_chkpwd'),
|
||||
'-DUPDATE_HELPER="@0@"'.format(sbindir / 'unix_update')]
|
||||
pam_module_deps += [libcrypt, libselinux, libtirpc, libnsl]
|
||||
endif
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
Author: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Subject: Move candle-onnx from exclude to members so cargo package can build it.
|
||||
Date: 2026-03-01
|
||||
|
||||
--- a/Cargo.toml
|
||||
+++ b/Cargo.toml
|
||||
@@ -4,6 +4,7 @@
|
||||
"candle-datasets",
|
||||
"candle-examples",
|
||||
"candle-nn",
|
||||
+ "candle-onnx",
|
||||
"candle-pyo3",
|
||||
"candle-transformers",
|
||||
"candle-wasm-examples/*",
|
||||
@@ -15,7 +16,6 @@
|
||||
"candle-flash-attn",
|
||||
"candle-kernels",
|
||||
"candle-metal-kernels",
|
||||
- "candle-onnx",
|
||||
]
|
||||
resolver = "2"
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,107 @@
|
||||
Author: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Subject: Add non-dismissing notification action hooks.
|
||||
Date: 2026-03-08
|
||||
License: gpl3+
|
||||
|
||||
MessageNotification only supports primary and secondary buttons that always
|
||||
dismiss the notification after running their handlers. That is too restrictive
|
||||
for flows where the user needs to inspect something first and then return to the
|
||||
same prompt.
|
||||
|
||||
Add a generic non-dismissing `more_info_on_click` action alongside the existing
|
||||
URL-based more-info button. This keeps the notification component reusable for
|
||||
"inspect first, decide second" workflows without forcing every caller to build a
|
||||
custom notification view.
|
||||
diff --git a/crates/workspace/src/notifications.rs b/crates/workspace/src/notifications.rs
|
||||
index 84f479b77e..9e210cb554 100644
|
||||
--- a/crates/workspace/src/notifications.rs
|
||||
+++ b/crates/workspace/src/notifications.rs
|
||||
@@ -714,6 +714,7 @@ pub mod simple_message_notification {
|
||||
secondary_icon_color: Option<Color>,
|
||||
secondary_on_click: Option<Arc<dyn Fn(&mut Window, &mut Context<Self>)>>,
|
||||
more_info_message: Option<SharedString>,
|
||||
+ more_info_on_click: Option<Arc<dyn Fn(&mut Window, &mut Context<Self>)>>,
|
||||
more_info_url: Option<Arc<str>>,
|
||||
show_close_button: bool,
|
||||
show_suppress_button: bool,
|
||||
@@ -758,6 +759,7 @@ pub mod simple_message_notification {
|
||||
secondary_icon_color: None,
|
||||
secondary_on_click: None,
|
||||
more_info_message: None,
|
||||
+ more_info_on_click: None,
|
||||
more_info_url: None,
|
||||
show_close_button: true,
|
||||
show_suppress_button: true,
|
||||
@@ -843,6 +845,22 @@ pub mod simple_message_notification {
|
||||
self
|
||||
}
|
||||
|
||||
+ pub fn more_info_on_click<F>(mut self, on_click: F) -> Self
|
||||
+ where
|
||||
+ F: 'static + Fn(&mut Window, &mut Context<Self>),
|
||||
+ {
|
||||
+ self.more_info_on_click = Some(Arc::new(on_click));
|
||||
+ self
|
||||
+ }
|
||||
+
|
||||
+ pub fn more_info_on_click_arc<F>(mut self, on_click: Arc<F>) -> Self
|
||||
+ where
|
||||
+ F: 'static + Fn(&mut Window, &mut Context<Self>),
|
||||
+ {
|
||||
+ self.more_info_on_click = Some(on_click);
|
||||
+ self
|
||||
+ }
|
||||
+
|
||||
pub fn more_info_url<S>(mut self, url: S) -> Self
|
||||
where
|
||||
S: Into<Arc<str>>,
|
||||
@@ -946,20 +964,36 @@ pub mod simple_message_notification {
|
||||
}))
|
||||
.child(
|
||||
h_flex().w_full().justify_end().children(
|
||||
- self.more_info_message
|
||||
- .iter()
|
||||
- .zip(self.more_info_url.iter())
|
||||
- .map(|(message, url)| {
|
||||
- let url = url.clone();
|
||||
- Button::new(message.clone(), message.clone())
|
||||
- .label_size(LabelSize::Small)
|
||||
- .icon(IconName::ArrowUpRight)
|
||||
- .icon_size(IconSize::Indicator)
|
||||
- .icon_color(Color::Muted)
|
||||
- .on_click(cx.listener(move |_, _, _, cx| {
|
||||
+ self.more_info_message.iter().filter_map(|message| {
|
||||
+ let more_info_on_click = self.more_info_on_click.clone();
|
||||
+ let more_info_url = self.more_info_url.clone();
|
||||
+
|
||||
+ if more_info_on_click.is_none() && more_info_url.is_none() {
|
||||
+ return None;
|
||||
+ }
|
||||
+
|
||||
+ let mut button = Button::new(message.clone(), message.clone())
|
||||
+ .label_size(LabelSize::Small)
|
||||
+ .icon(IconName::ArrowUpRight)
|
||||
+ .icon_size(IconSize::Indicator)
|
||||
+ .icon_color(Color::Muted);
|
||||
+
|
||||
+ button = match (more_info_on_click, more_info_url) {
|
||||
+ (Some(on_click), _) => button.on_click(cx.listener(
|
||||
+ move |_, _, window, cx| {
|
||||
+ (on_click)(window, cx);
|
||||
+ },
|
||||
+ )),
|
||||
+ (None, Some(url)) => button.on_click(cx.listener(
|
||||
+ move |_, _, _, cx| {
|
||||
cx.open_url(&url);
|
||||
- }))
|
||||
- }),
|
||||
+ },
|
||||
+ )),
|
||||
+ (None, None) => button,
|
||||
+ };
|
||||
+
|
||||
+ Some(button)
|
||||
+ }),
|
||||
),
|
||||
),
|
||||
)
|
||||
@@ -0,0 +1,65 @@
|
||||
Author: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Subject: Collapse multi-line git dependency entries to single lines
|
||||
Date: 2026-03-01
|
||||
License: expat
|
||||
|
||||
Collapse multi-line git dependency entries to single lines so that
|
||||
line-based substitute* patterns can process them.
|
||||
|
||||
--- a/Cargo.toml 2026-03-01 19:09:53.710020628 +0000
|
||||
+++ b/Cargo.toml 2026-03-01 19:20:31.697337662 +0000
|
||||
@@ -626,15 +626,7 @@
|
||||
rayon = "1.8"
|
||||
regex = "1.5"
|
||||
# WARNING: If you change this, you must also publish a new version of zed-reqwest to crates.io
|
||||
-reqwest = { git = "https://github.com/zed-industries/reqwest.git", rev = "c15662463bda39148ba154100dd44d3fba5873a4", default-features = false, features = [
|
||||
- "charset",
|
||||
- "http2",
|
||||
- "macos-system-configuration",
|
||||
- "multipart",
|
||||
- "rustls-tls-native-roots",
|
||||
- "socks",
|
||||
- "stream",
|
||||
-], package = "zed-reqwest", version = "0.12.15-zed" }
|
||||
+reqwest = { git = "https://github.com/zed-industries/reqwest.git", rev = "c15662463bda39148ba154100dd44d3fba5873a4", default-features = false, features = ["charset", "http2", "macos-system-configuration", "multipart", "rustls-tls-native-roots", "socks", "stream"], package = "zed-reqwest", version = "0.12.15-zed" }
|
||||
rsa = "0.9.6"
|
||||
runtimelib = { version = "1.2.0", default-features = false, features = [
|
||||
"async-dispatcher-runtime", "aws-lc-rs"
|
||||
--- a/crates/gpui/Cargo.toml 2026-03-01 19:12:33.129039363 +0000
|
||||
+++ b/crates/gpui/Cargo.toml 2026-03-01 19:20:33.133327405 +0000
|
||||
@@ -167,9 +167,7 @@
|
||||
cosmic-text = { version = "0.17.0", optional = true }
|
||||
swash = { version = "0.2.6" }
|
||||
# WARNING: If you change this, you must also publish a new version of zed-font-kit to crates.io
|
||||
-font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "110523127440aefb11ce0cf280ae7c5071337ec5", package = "zed-font-kit", version = "0.14.1-zed", features = [
|
||||
- "source-fontconfig-dlopen",
|
||||
-], optional = true }
|
||||
+font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "110523127440aefb11ce0cf280ae7c5071337ec5", package = "zed-font-kit", version = "0.14.1-zed", features = ["source-fontconfig-dlopen"], optional = true }
|
||||
calloop = "0.14.3"
|
||||
filedescriptor = { version = "0.8.2", optional = true }
|
||||
open = { version = "5.2.0", optional = true }
|
||||
@@ -207,10 +205,7 @@
|
||||
"sync",
|
||||
], optional = true }
|
||||
# WARNING: If you change this, you must also publish a new version of zed-xim to crates.io
|
||||
-xim = { git = "https://github.com/zed-industries/xim-rs.git", rev = "16f35a2c881b815a2b6cdfd6687988e84f8447d8" , features = [
|
||||
- "x11rb-xcb",
|
||||
- "x11rb-client",
|
||||
-], package = "zed-xim", version = "0.4.0-zed", optional = true }
|
||||
+xim = { git = "https://github.com/zed-industries/xim-rs.git", rev = "16f35a2c881b815a2b6cdfd6687988e84f8447d8" , features = ["x11rb-xcb", "x11rb-client"], package = "zed-xim", version = "0.4.0-zed", optional = true }
|
||||
x11-clipboard = { version = "0.9.3", optional = true }
|
||||
|
||||
[target.'cfg(target_os = "windows")'.dependencies]
|
||||
--- a/crates/livekit_client/Cargo.toml 2026-03-01 19:12:33.133661336 +0000
|
||||
+++ b/crates/livekit_client/Cargo.toml 2026-03-01 19:20:33.893321975 +0000
|
||||
@@ -46,9 +46,7 @@
|
||||
|
||||
[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))'.dependencies]
|
||||
libwebrtc = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks" }
|
||||
-livekit = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks", features = [
|
||||
- "__rustls-tls"
|
||||
-] }
|
||||
+livekit = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks", features = ["__rustls-tls"] }
|
||||
|
||||
[target.'cfg(any(target_os = "linux", target_os = "freebsd", target_os = "windows"))'.dependencies]
|
||||
scap.workspace = true
|
||||
@@ -0,0 +1,31 @@
|
||||
Author: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Subject: Disable dlopen for wayland-backend and fontconfig in gpui.
|
||||
Date: 2026-03-01
|
||||
License: ASL2.0
|
||||
|
||||
Remove the "dlopen" feature from wayland-backend and the
|
||||
"source-fontconfig-dlopen" feature from zed-font-kit so that libwayland
|
||||
and libfontconfig are linked directly rather than loaded at runtime via
|
||||
dlopen. This ensures these dependencies are visible to the package
|
||||
manager and avoids runtime failures when the libraries are not in the
|
||||
dlopen search path.
|
||||
|
||||
--- a/crates/gpui/Cargo.toml 2026-03-01 21:21:38.661240897 +0000
|
||||
+++ b/crates/gpui/Cargo.toml 2026-03-01 21:23:00.282205935 +0000
|
||||
@@ -167,7 +167,7 @@
|
||||
cosmic-text = { version = "0.17.0", optional = true }
|
||||
swash = { version = "0.2.6" }
|
||||
# WARNING: If you change this, you must also publish a new version of zed-font-kit to crates.io
|
||||
-font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "110523127440aefb11ce0cf280ae7c5071337ec5", package = "zed-font-kit", version = "0.14.1-zed", features = ["source-fontconfig-dlopen"], optional = true }
|
||||
+font-kit = { git = "https://github.com/zed-industries/font-kit", rev = "110523127440aefb11ce0cf280ae7c5071337ec5", package = "zed-font-kit", version = "0.14.1-zed", optional = true }
|
||||
calloop = "0.14.3"
|
||||
filedescriptor = { version = "0.8.2", optional = true }
|
||||
open = { version = "5.2.0", optional = true }
|
||||
@@ -177,7 +177,6 @@
|
||||
calloop-wayland-source = { version = "0.4.1", optional = true }
|
||||
wayland-backend = { version = "0.3.3", features = [
|
||||
"client_system",
|
||||
- "dlopen",
|
||||
], optional = true }
|
||||
wayland-client = { version = "0.31.11", optional = true }
|
||||
wayland-cursor = { version = "0.31.11", optional = true }
|
||||
@@ -0,0 +1,113 @@
|
||||
Author: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Subject: Exclude libwebrtc dependency from audio crate on Linux.
|
||||
Date: 2026-03-01
|
||||
|
||||
The audio crate conditionally depends on libwebrtc for echo cancellation
|
||||
on platforms that have it. It already cfg-guards the libwebrtc usage for
|
||||
Windows-GNU and FreeBSD. Add target_os = "linux" to those cfg conditions
|
||||
so libwebrtc is not required on Linux either. The rest of the audio crate
|
||||
(sound playback, output streams, end_call) continues to work without it.
|
||||
|
||||
--- a/crates/audio/Cargo.toml 2026-03-01 21:21:38.652107544 +0000
|
||||
+++ b/crates/audio/Cargo.toml 2026-03-01 21:22:20.494478427 +0000
|
||||
@@ -29,5 +29,5 @@
|
||||
thiserror.workspace = true
|
||||
util.workspace = true
|
||||
|
||||
-[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))'.dependencies]
|
||||
+[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd", target_os = "linux")))'.dependencies]
|
||||
libwebrtc = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks" }
|
||||
--- a/crates/audio/src/audio.rs 2026-03-01 21:21:38.656793329 +0000
|
||||
+++ b/crates/audio/src/audio.rs 2026-03-01 21:40:18.939230433 +0000
|
||||
@@ -6,7 +6,7 @@
|
||||
};
|
||||
use gpui::{App, AsyncApp, BackgroundExecutor, BorrowAppContext, Global};
|
||||
|
||||
-#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))]
|
||||
+#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd", target_os = "linux")))]
|
||||
mod non_windows_and_freebsd_deps {
|
||||
pub(super) use cpal::Sample;
|
||||
pub(super) use libwebrtc::native::apm;
|
||||
@@ -15,7 +15,7 @@
|
||||
pub(super) use std::sync::Arc;
|
||||
}
|
||||
|
||||
-#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))]
|
||||
+#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd", target_os = "linux")))]
|
||||
use non_windows_and_freebsd_deps::*;
|
||||
|
||||
use rodio::{
|
||||
@@ -102,7 +102,7 @@
|
||||
|
||||
pub struct Audio {
|
||||
output_handle: Option<MixerDeviceSink>,
|
||||
- #[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))]
|
||||
+ #[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd", target_os = "linux")))]
|
||||
pub echo_canceller: Arc<Mutex<apm::AudioProcessingModule>>,
|
||||
source_cache: HashMap<Sound, Buffered<Decoder<Cursor<Vec<u8>>>>>,
|
||||
replays: replays::Replays,
|
||||
@@ -114,7 +114,7 @@
|
||||
output_handle: Default::default(),
|
||||
#[cfg(not(any(
|
||||
all(target_os = "windows", target_env = "gnu"),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd", target_os = "linux"
|
||||
)))]
|
||||
echo_canceller: Arc::new(Mutex::new(apm::AudioProcessingModule::new(
|
||||
true, false, false, false,
|
||||
@@ -140,13 +140,13 @@
|
||||
// The webrtc apm is not yet compiling for windows & freebsd
|
||||
#[cfg(not(any(
|
||||
any(all(target_os = "windows", target_env = "gnu")),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd", target_os = "linux"
|
||||
)))]
|
||||
let echo_canceller = Arc::clone(&self.echo_canceller);
|
||||
|
||||
#[cfg(not(any(
|
||||
any(all(target_os = "windows", target_env = "gnu")),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd", target_os = "linux"
|
||||
)))]
|
||||
{
|
||||
let source = rodio::source::Zero::new(CHANNEL_COUNT, SAMPLE_RATE)
|
||||
@@ -166,10 +166,10 @@
|
||||
|
||||
#[cfg(any(
|
||||
any(all(target_os = "windows", target_env = "gnu")),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd", target_os = "linux"
|
||||
))]
|
||||
{
|
||||
- let source = rodio::source::Zero::<f32>::new(CHANNEL_COUNT, SAMPLE_RATE);
|
||||
+ let source = rodio::source::Zero::new(CHANNEL_COUNT, SAMPLE_RATE);
|
||||
output_handle.mixer().add(source);
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
self.replays.replays_to_tar(executor)
|
||||
}
|
||||
|
||||
- #[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))]
|
||||
+ #[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd", target_os = "linux")))]
|
||||
pub fn open_microphone(voip_parts: VoipParts) -> anyhow::Result<impl Source> {
|
||||
let stream = open_input_stream(voip_parts.input_audio_device)?;
|
||||
let stream = stream
|
||||
@@ -319,7 +319,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
-#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))]
|
||||
+#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd", target_os = "linux")))]
|
||||
pub struct VoipParts {
|
||||
echo_canceller: Arc<Mutex<apm::AudioProcessingModule>>,
|
||||
replays: replays::Replays,
|
||||
@@ -327,7 +327,7 @@
|
||||
input_audio_device: Option<DeviceId>,
|
||||
}
|
||||
|
||||
-#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))]
|
||||
+#[cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd", target_os = "linux")))]
|
||||
impl VoipParts {
|
||||
pub fn new(cx: &AsyncApp) -> anyhow::Result<Self> {
|
||||
let (apm, replays) = cx.read_default_global::<Audio, _>(|audio, _| {
|
||||
@@ -0,0 +1,320 @@
|
||||
From: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Date: Fri, 6 Mar 2026 21:06:00 +0000
|
||||
Subject: [PATCH] sqlez: Fix named in-memory SQLite mode
|
||||
License: expat
|
||||
|
||||
Zed's named "in-memory" SQLite databases were being opened with
|
||||
URI-looking paths such as `file:DB?mode=memory&cache=shared` but without
|
||||
`SQLITE_OPEN_URI`. SQLite therefore treated those strings as literal
|
||||
filenames, which leaked test databases to disk and defeated the intended
|
||||
shared-memory behavior.
|
||||
|
||||
Fix that by opening named in-memory databases with `SQLITE_OPEN_URI` so
|
||||
`mode=memory&cache=shared` is interpreted correctly, and add coverage to
|
||||
ensure no literal backing files are created.
|
||||
|
||||
That URI fix makes shared-cache schema locking real, which in turn
|
||||
exposes a second bug in `ThreadSafeConnection`: per-thread connection
|
||||
initialization can race schema setup on another connection to the same
|
||||
named in-memory database and fail while preparing `PRAGMA foreign_keys`.
|
||||
|
||||
Fix that by retrying connection initialization queries when SQLite
|
||||
reports a transient schema/database lock, and add a regression test for
|
||||
that case.
|
||||
|
||||
diff --git a/crates/sqlez/src/connection.rs b/crates/sqlez/src/connection.rs
|
||||
index 53f0d4e261..3dc530757a 100644
|
||||
--- a/crates/sqlez/src/connection.rs
|
||||
+++ b/crates/sqlez/src/connection.rs
|
||||
@@ -18,7 +18,7 @@ pub struct Connection {
|
||||
unsafe impl Send for Connection {}
|
||||
|
||||
impl Connection {
|
||||
- pub(crate) fn open(uri: &str, persistent: bool) -> Result<Self> {
|
||||
+ fn open_with_flags(uri: &str, persistent: bool, flags: i32) -> Result<Self> {
|
||||
let mut connection = Self {
|
||||
sqlite3: ptr::null_mut(),
|
||||
persistent,
|
||||
@@ -26,7 +26,6 @@ impl Connection {
|
||||
_sqlite: PhantomData,
|
||||
};
|
||||
|
||||
- let flags = SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE;
|
||||
unsafe {
|
||||
sqlite3_open_v2(
|
||||
CString::new(uri)?.as_ptr(),
|
||||
@@ -44,6 +43,14 @@ impl Connection {
|
||||
Ok(connection)
|
||||
}
|
||||
|
||||
+ pub(crate) fn open(uri: &str, persistent: bool) -> Result<Self> {
|
||||
+ Self::open_with_flags(
|
||||
+ uri,
|
||||
+ persistent,
|
||||
+ SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_READWRITE,
|
||||
+ )
|
||||
+ }
|
||||
+
|
||||
/// Attempts to open the database at uri. If it fails, a shared memory db will be opened
|
||||
/// instead.
|
||||
pub fn open_file(uri: &str) -> Self {
|
||||
@@ -51,13 +58,20 @@ impl Connection {
|
||||
}
|
||||
|
||||
pub fn open_memory(uri: Option<&str>) -> Self {
|
||||
- let in_memory_path = if let Some(uri) = uri {
|
||||
- format!("file:{}?mode=memory&cache=shared", uri)
|
||||
+ if let Some(uri) = uri {
|
||||
+ let in_memory_path = format!("file:{}?mode=memory&cache=shared", uri);
|
||||
+ return Self::open_with_flags(
|
||||
+ &in_memory_path,
|
||||
+ false,
|
||||
+ SQLITE_OPEN_CREATE
|
||||
+ | SQLITE_OPEN_NOMUTEX
|
||||
+ | SQLITE_OPEN_READWRITE
|
||||
+ | SQLITE_OPEN_URI,
|
||||
+ )
|
||||
+ .expect("Could not create fallback in memory db");
|
||||
} else {
|
||||
- ":memory:".to_string()
|
||||
- };
|
||||
-
|
||||
- Self::open(&in_memory_path, false).expect("Could not create fallback in memory db")
|
||||
+ Self::open(":memory:", false).expect("Could not create fallback in memory db")
|
||||
+ }
|
||||
}
|
||||
|
||||
pub fn persistent(&self) -> bool {
|
||||
@@ -265,9 +279,50 @@ impl Drop for Connection {
|
||||
mod test {
|
||||
use anyhow::Result;
|
||||
use indoc::indoc;
|
||||
+ use std::{
|
||||
+ fs,
|
||||
+ sync::atomic::{AtomicUsize, Ordering},
|
||||
+ };
|
||||
|
||||
use crate::connection::Connection;
|
||||
|
||||
+ static NEXT_NAMED_MEMORY_DB_ID: AtomicUsize = AtomicUsize::new(0);
|
||||
+
|
||||
+ fn unique_named_memory_db(prefix: &str) -> String {
|
||||
+ format!(
|
||||
+ "{prefix}_{}_{}",
|
||||
+ std::process::id(),
|
||||
+ NEXT_NAMED_MEMORY_DB_ID.fetch_add(1, Ordering::Relaxed)
|
||||
+ )
|
||||
+ }
|
||||
+
|
||||
+ fn literal_named_memory_paths(name: &str) -> [String; 3] {
|
||||
+ let main = format!("file:{name}?mode=memory&cache=shared");
|
||||
+ [main.clone(), format!("{main}-wal"), format!("{main}-shm")]
|
||||
+ }
|
||||
+
|
||||
+ struct NamedMemoryPathGuard {
|
||||
+ paths: [String; 3],
|
||||
+ }
|
||||
+
|
||||
+ impl NamedMemoryPathGuard {
|
||||
+ fn new(name: &str) -> Self {
|
||||
+ let paths = literal_named_memory_paths(name);
|
||||
+ for path in &paths {
|
||||
+ let _ = fs::remove_file(path);
|
||||
+ }
|
||||
+ Self { paths }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ impl Drop for NamedMemoryPathGuard {
|
||||
+ fn drop(&mut self) {
|
||||
+ for path in &self.paths {
|
||||
+ let _ = fs::remove_file(path);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
#[test]
|
||||
fn string_round_trips() -> Result<()> {
|
||||
let connection = Connection::open_memory(Some("string_round_trips"));
|
||||
@@ -382,6 +437,41 @@ mod test {
|
||||
assert_eq!(read_blobs, vec![blob]);
|
||||
}
|
||||
|
||||
+ #[test]
|
||||
+ fn named_memory_connections_do_not_create_literal_backing_files() {
|
||||
+ let name = unique_named_memory_db("named_memory_connections_do_not_create_backing_files");
|
||||
+ let guard = NamedMemoryPathGuard::new(&name);
|
||||
+
|
||||
+ let connection1 = Connection::open_memory(Some(&name));
|
||||
+ connection1
|
||||
+ .exec(indoc! {"
|
||||
+ CREATE TABLE shared (
|
||||
+ value INTEGER
|
||||
+ )"})
|
||||
+ .unwrap()()
|
||||
+ .unwrap();
|
||||
+ connection1
|
||||
+ .exec("INSERT INTO shared (value) VALUES (7)")
|
||||
+ .unwrap()()
|
||||
+ .unwrap();
|
||||
+
|
||||
+ let connection2 = Connection::open_memory(Some(&name));
|
||||
+ assert_eq!(
|
||||
+ connection2
|
||||
+ .select_row::<i64>("SELECT value FROM shared")
|
||||
+ .unwrap()()
|
||||
+ .unwrap(),
|
||||
+ Some(7)
|
||||
+ );
|
||||
+
|
||||
+ for path in &guard.paths {
|
||||
+ assert!(
|
||||
+ fs::metadata(path).is_err(),
|
||||
+ "named in-memory database unexpectedly created backing file {path}"
|
||||
+ );
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
#[test]
|
||||
fn multi_step_statement_works() {
|
||||
let connection = Connection::open_memory(Some("multi_step_statement_works"));
|
||||
diff --git a/crates/sqlez/src/thread_safe_connection.rs b/crates/sqlez/src/thread_safe_connection.rs
|
||||
index 966f14a9c2..9d868fcba4 100644
|
||||
--- a/crates/sqlez/src/thread_safe_connection.rs
|
||||
+++ b/crates/sqlez/src/thread_safe_connection.rs
|
||||
@@ -7,12 +7,15 @@ use std::{
|
||||
ops::Deref,
|
||||
sync::{Arc, LazyLock},
|
||||
thread,
|
||||
+ time::Duration,
|
||||
};
|
||||
use thread_local::ThreadLocal;
|
||||
|
||||
use crate::{connection::Connection, domain::Migrator, util::UnboundedSyncSender};
|
||||
|
||||
const MIGRATION_RETRIES: usize = 10;
|
||||
+const CONNECTION_INITIALIZE_RETRIES: usize = 50;
|
||||
+const CONNECTION_INITIALIZE_RETRY_DELAY: Duration = Duration::from_millis(1);
|
||||
|
||||
type QueuedWrite = Box<dyn 'static + Send + FnOnce()>;
|
||||
type WriteQueue = Box<dyn 'static + Send + Sync + Fn(QueuedWrite)>;
|
||||
@@ -197,21 +200,50 @@ impl ThreadSafeConnection {
|
||||
Self::open_shared_memory(uri)
|
||||
};
|
||||
|
||||
+ if let Some(initialize_query) = connection_initialize_query {
|
||||
+ let mut last_error = None;
|
||||
+ let initialized = (0..CONNECTION_INITIALIZE_RETRIES).any(|attempt| {
|
||||
+ match connection.exec(initialize_query).and_then(|mut statement| statement()) {
|
||||
+ Ok(()) => true,
|
||||
+ Err(err)
|
||||
+ if is_schema_lock_error(&err)
|
||||
+ && attempt + 1 < CONNECTION_INITIALIZE_RETRIES =>
|
||||
+ {
|
||||
+ last_error = Some(err);
|
||||
+ thread::sleep(CONNECTION_INITIALIZE_RETRY_DELAY);
|
||||
+ false
|
||||
+ }
|
||||
+ Err(err) => {
|
||||
+ panic!(
|
||||
+ "Initialize query failed to execute: {}\n\nCaused by:\n{err:#}",
|
||||
+ initialize_query
|
||||
+ )
|
||||
+ }
|
||||
+ }
|
||||
+ });
|
||||
+
|
||||
+ if !initialized {
|
||||
+ let err = last_error.expect("connection initialization retries should record the last error");
|
||||
+ panic!(
|
||||
+ "Initialize query failed to execute after retries: {}\n\nCaused by:\n{err:#}",
|
||||
+ initialize_query
|
||||
+ );
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
// Disallow writes on the connection. The only writes allowed for thread safe connections
|
||||
// are from the background thread that can serialize them.
|
||||
*connection.write.get_mut() = false;
|
||||
|
||||
- if let Some(initialize_query) = connection_initialize_query {
|
||||
- connection.exec(initialize_query).unwrap_or_else(|_| {
|
||||
- panic!("Initialize query failed to execute: {}", initialize_query)
|
||||
- })()
|
||||
- .unwrap()
|
||||
- }
|
||||
-
|
||||
connection
|
||||
}
|
||||
}
|
||||
|
||||
+fn is_schema_lock_error(err: &anyhow::Error) -> bool {
|
||||
+ let message = format!("{err:#}");
|
||||
+ message.contains("database schema is locked") || message.contains("database is locked")
|
||||
+}
|
||||
+
|
||||
impl ThreadSafeConnection {
|
||||
/// Special constructor for ThreadSafeConnection which disallows db initialization and migrations.
|
||||
/// This allows construction to be infallible and not write to the db.
|
||||
@@ -282,7 +314,7 @@ mod test {
|
||||
use indoc::indoc;
|
||||
use std::ops::Deref;
|
||||
|
||||
- use std::thread;
|
||||
+ use std::{thread, time::Duration};
|
||||
|
||||
use crate::{domain::Domain, thread_safe_connection::ThreadSafeConnection};
|
||||
|
||||
@@ -318,38 +350,21 @@ mod test {
|
||||
}
|
||||
|
||||
#[test]
|
||||
- #[should_panic]
|
||||
- fn wild_zed_lost_failure() {
|
||||
- enum TestWorkspace {}
|
||||
- impl Domain for TestWorkspace {
|
||||
- const NAME: &str = "workspace";
|
||||
-
|
||||
- const MIGRATIONS: &[&str] = &["
|
||||
- CREATE TABLE workspaces(
|
||||
- workspace_id INTEGER PRIMARY KEY,
|
||||
- dock_visible INTEGER, -- Boolean
|
||||
- dock_anchor TEXT, -- Enum: 'Bottom' / 'Right' / 'Expanded'
|
||||
- dock_pane INTEGER, -- NULL indicates that we don't have a dock pane yet
|
||||
- timestamp TEXT DEFAULT CURRENT_TIMESTAMP NOT NULL,
|
||||
- FOREIGN KEY(dock_pane) REFERENCES panes(pane_id),
|
||||
- FOREIGN KEY(active_pane) REFERENCES panes(pane_id)
|
||||
- ) STRICT;
|
||||
-
|
||||
- CREATE TABLE panes(
|
||||
- pane_id INTEGER PRIMARY KEY,
|
||||
- workspace_id INTEGER NOT NULL,
|
||||
- active INTEGER NOT NULL, -- Boolean
|
||||
- FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
|
||||
- ON DELETE CASCADE
|
||||
- ON UPDATE CASCADE
|
||||
- ) STRICT;
|
||||
- "];
|
||||
- }
|
||||
+ fn connection_initialize_query_retries_transient_schema_lock() {
|
||||
+ let name = "connection_initialize_query_retries_transient_schema_lock";
|
||||
+ let locking_connection = crate::connection::Connection::open_memory(Some(name));
|
||||
+ locking_connection.exec("BEGIN IMMEDIATE").unwrap()().unwrap();
|
||||
+ locking_connection
|
||||
+ .exec("CREATE TABLE test(col TEXT)")
|
||||
+ .unwrap()()
|
||||
+ .unwrap();
|
||||
|
||||
- let builder =
|
||||
- ThreadSafeConnection::builder::<TestWorkspace>("wild_zed_lost_failure", false)
|
||||
- .with_connection_initialize_query("PRAGMA FOREIGN_KEYS=true");
|
||||
+ let releaser = thread::spawn(move || {
|
||||
+ thread::sleep(Duration::from_millis(10));
|
||||
+ locking_connection.exec("ROLLBACK").unwrap()().unwrap();
|
||||
+ });
|
||||
|
||||
- smol::block_on(builder.build()).unwrap();
|
||||
+ ThreadSafeConnection::create_connection(false, name, Some("PRAGMA FOREIGN_KEYS=true"));
|
||||
+ releaser.join().unwrap();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,328 @@
|
||||
From: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Date: Fri, 6 Mar 2026 21:22:41 +0000
|
||||
Subject: [PATCH] db: Scope default test databases to the current test
|
||||
License: expat
|
||||
|
||||
In test builds, the default database statics use fixed names such as
|
||||
`DB` and `KEY_VALUE_STORE`. That makes unrelated tests in the same test
|
||||
binary share the same named in-memory databases, which leaks state
|
||||
across tests and makes failures depend on execution order and
|
||||
concurrency.
|
||||
|
||||
A first attempt at isolating those statics by thread is not sufficient:
|
||||
one test can legitimately use multiple threads, and splitting the test's
|
||||
workspace state across separate databases breaks parent-child foreign key
|
||||
relationships.
|
||||
|
||||
Fix this by scoping the default test databases by the current test name
|
||||
instead. The `gpui::test` harness now installs the current test name on
|
||||
the executing thread, the test dispatcher propagates that scope to its
|
||||
realtime worker threads, and the default test statics resolve one shared
|
||||
database wrapper per test scope rather than per thread.
|
||||
|
||||
That keeps sharing within a single test where it is intentional, while
|
||||
stopping hidden cross-test state leakage.
|
||||
|
||||
diff --git a/crates/db/src/db.rs b/crates/db/src/db.rs
|
||||
index 36f0365af9..3ff8499c1d 100644
|
||||
--- a/crates/db/src/db.rs
|
||||
+++ b/crates/db/src/db.rs
|
||||
@@ -19,6 +19,12 @@ use std::future::Future;
|
||||
use std::path::Path;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
use std::sync::{LazyLock, atomic::Ordering};
|
||||
+#[cfg(any(test, feature = "test-support"))]
|
||||
+use std::collections::HashMap;
|
||||
+#[cfg(any(test, feature = "test-support"))]
|
||||
+use std::sync::Mutex;
|
||||
+#[cfg(any(test, feature = "test-support"))]
|
||||
+use std::{borrow::Cow, ops::Deref};
|
||||
use util::{ResultExt, maybe};
|
||||
use zed_env_vars::ZED_STATELESS;
|
||||
|
||||
@@ -97,7 +103,8 @@ async fn open_fallback_db<M: Migrator>() -> ThreadSafeConnection {
|
||||
pub async fn open_test_db<M: Migrator>(db_name: &str) -> ThreadSafeConnection {
|
||||
use sqlez::thread_safe_connection::locking_queue;
|
||||
|
||||
- ThreadSafeConnection::builder::<M>(db_name, false)
|
||||
+ let db_name = scoped_test_db_name(db_name);
|
||||
+ ThreadSafeConnection::builder::<M>(&db_name, false)
|
||||
.with_db_initialization_query(DB_INITIALIZE_QUERY)
|
||||
.with_connection_initialize_query(CONNECTION_INITIALIZE_QUERY)
|
||||
// Serialize queued writes via a mutex and run them synchronously
|
||||
@@ -107,6 +114,69 @@ pub async fn open_test_db<M: Migrator>(db_name: &str) -> ThreadSafeConnection {
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
+#[cfg(any(test, feature = "test-support"))]
|
||||
+fn scoped_test_db_name(db_name: &str) -> Cow<'_, str> {
|
||||
+ let Some(test_name) = current_test_scope_name() else {
|
||||
+ return Cow::Borrowed(db_name);
|
||||
+ };
|
||||
+
|
||||
+ let mut scoped_name = String::with_capacity(db_name.len() + test_name.len() + 2);
|
||||
+ scoped_name.push_str(db_name);
|
||||
+ scoped_name.push('@');
|
||||
+ for ch in test_name.chars() {
|
||||
+ if ch.is_ascii_alphanumeric() || matches!(ch, '-' | '_' | '.') {
|
||||
+ scoped_name.push(ch);
|
||||
+ } else {
|
||||
+ scoped_name.push('_');
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ Cow::Owned(scoped_name)
|
||||
+}
|
||||
+
|
||||
+#[cfg(any(test, feature = "test-support"))]
|
||||
+fn current_test_scope_name() -> Option<String> {
|
||||
+ if let Some(test_name) = gpui::current_test_name() {
|
||||
+ return Some(test_name.to_string());
|
||||
+ }
|
||||
+
|
||||
+ let current_thread = std::thread::current();
|
||||
+ if let Some(test_name) = current_thread.name() {
|
||||
+ return Some(test_name.to_string());
|
||||
+ }
|
||||
+
|
||||
+ Some(format!("thread_{:?}", current_thread.id()))
|
||||
+}
|
||||
+
|
||||
+#[cfg(any(test, feature = "test-support"))]
|
||||
+pub struct TestScopedStatic<T: Send + Sync + 'static> {
|
||||
+ initializer: fn() -> T,
|
||||
+ values: Mutex<HashMap<String, &'static T>>,
|
||||
+}
|
||||
+
|
||||
+#[cfg(any(test, feature = "test-support"))]
|
||||
+impl<T: Send + Sync + 'static> TestScopedStatic<T> {
|
||||
+ pub fn new(initializer: fn() -> T) -> Self {
|
||||
+ Self {
|
||||
+ initializer,
|
||||
+ values: Mutex::new(HashMap::new()),
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+#[cfg(any(test, feature = "test-support"))]
|
||||
+impl<T: Send + Sync + 'static> Deref for TestScopedStatic<T> {
|
||||
+ type Target = T;
|
||||
+
|
||||
+ fn deref(&self) -> &Self::Target {
|
||||
+ let scope_name = current_test_scope_name().unwrap_or_else(|| "default".to_string());
|
||||
+ let mut values = self.values.lock().unwrap();
|
||||
+ *values
|
||||
+ .entry(scope_name)
|
||||
+ .or_insert_with(|| Box::leak(Box::new((self.initializer)())))
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/// Implements a basic DB wrapper for a given domain
|
||||
///
|
||||
/// Arguments:
|
||||
@@ -126,16 +196,23 @@ macro_rules! static_connection {
|
||||
|
||||
impl $t {
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
- pub async fn open_test_db(name: &'static str) -> Self {
|
||||
+ pub async fn open_test_db(name: &str) -> Self {
|
||||
$t($crate::open_test_db::<$t>(name).await)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
- pub static $id: std::sync::LazyLock<$t> = std::sync::LazyLock::new(|| {
|
||||
- #[allow(unused_parens)]
|
||||
- $t($crate::smol::block_on($crate::open_test_db::<($($d,)* $t)>(stringify!($id))))
|
||||
- });
|
||||
+ pub static $id: std::sync::LazyLock<$crate::TestScopedStatic<$t>> =
|
||||
+ std::sync::LazyLock::new(|| {
|
||||
+ fn initializer() -> $t {
|
||||
+ #[allow(unused_parens)]
|
||||
+ $t($crate::smol::block_on(
|
||||
+ $crate::open_test_db::<($($d,)* $t)>(stringify!($id))
|
||||
+ ))
|
||||
+ }
|
||||
+
|
||||
+ $crate::TestScopedStatic::new(initializer)
|
||||
+ });
|
||||
|
||||
#[cfg(not(any(test, feature = "test-support")))]
|
||||
pub static $id: std::sync::LazyLock<$t> = std::sync::LazyLock::new(|| {
|
||||
@@ -161,9 +238,10 @@ where
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
+ use anyhow::Result;
|
||||
use std::thread;
|
||||
|
||||
- use sqlez::domain::Domain;
|
||||
+ use sqlez::{domain::Domain, thread_safe_connection::ThreadSafeConnection};
|
||||
use sqlez_macros::sql;
|
||||
|
||||
use crate::open_db;
|
||||
@@ -295,4 +373,64 @@ mod tests {
|
||||
assert!(guard.join().is_ok());
|
||||
}
|
||||
}
|
||||
+
|
||||
+ pub struct ScopedStaticDb(ThreadSafeConnection);
|
||||
+
|
||||
+ impl Domain for ScopedStaticDb {
|
||||
+ const NAME: &str = "test_scoped_static_db";
|
||||
+ const MIGRATIONS: &[&str] = &[sql!(
|
||||
+ CREATE TABLE IF NOT EXISTS scoped_values(
|
||||
+ value INTEGER NOT NULL
|
||||
+ ) STRICT;
|
||||
+ )];
|
||||
+ }
|
||||
+
|
||||
+ crate::static_connection!(SCOPED_STATIC_DB, ScopedStaticDb, []);
|
||||
+
|
||||
+ impl ScopedStaticDb {
|
||||
+ fn replace_value(&self, value: i64) -> Result<()> {
|
||||
+ smol::block_on(self.write(move |connection| {
|
||||
+ connection.exec("DELETE FROM scoped_values")?()?;
|
||||
+ connection
|
||||
+ .exec_bound("INSERT INTO scoped_values(value) VALUES (?)")
|
||||
+ ?(value)?;
|
||||
+ anyhow::Ok(())
|
||||
+ }))
|
||||
+ }
|
||||
+
|
||||
+ fn read_value(&self) -> Result<Option<i64>> {
|
||||
+ self.select_row::<i64>("SELECT value FROM scoped_values").unwrap()()
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn static_test_connections_are_scoped_by_test_name() {
|
||||
+ gpui::with_test_name(Some("static_test_connections_are_scoped_by_test_name_a"), || {
|
||||
+ assert_eq!(SCOPED_STATIC_DB.read_value().unwrap(), None);
|
||||
+ SCOPED_STATIC_DB.replace_value(7).unwrap();
|
||||
+ assert_eq!(SCOPED_STATIC_DB.read_value().unwrap(), Some(7));
|
||||
+ });
|
||||
+
|
||||
+ gpui::with_test_name(Some("static_test_connections_are_scoped_by_test_name_b"), || {
|
||||
+ assert_eq!(SCOPED_STATIC_DB.read_value().unwrap(), None);
|
||||
+ SCOPED_STATIC_DB.replace_value(11).unwrap();
|
||||
+ assert_eq!(SCOPED_STATIC_DB.read_value().unwrap(), Some(11));
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
+ #[test]
|
||||
+ fn static_test_connections_share_state_across_threads_with_same_test_name() {
|
||||
+ gpui::with_test_name(
|
||||
+ Some("static_test_connections_share_state_across_threads_with_same_test_name"),
|
||||
+ || {
|
||||
+ SCOPED_STATIC_DB.replace_value(13).unwrap();
|
||||
+
|
||||
+ let test_name = gpui::current_test_name();
|
||||
+ let thread = std::thread::spawn(move || {
|
||||
+ gpui::with_test_name(test_name, || SCOPED_STATIC_DB.read_value().unwrap())
|
||||
+ });
|
||||
+ assert_eq!(thread.join().unwrap(), Some(13));
|
||||
+ },
|
||||
+ );
|
||||
+ }
|
||||
}
|
||||
diff --git a/crates/gpui/src/platform/test/dispatcher.rs b/crates/gpui/src/platform/test/dispatcher.rs
|
||||
index fc3f7f253a..0d98b082ca 100644
|
||||
--- a/crates/gpui/src/platform/test/dispatcher.rs
|
||||
+++ b/crates/gpui/src/platform/test/dispatcher.rs
|
||||
@@ -136,8 +136,9 @@ impl PlatformDispatcher for TestDispatcher {
|
||||
}
|
||||
|
||||
fn spawn_realtime(&self, f: Box<dyn FnOnce() + Send>) {
|
||||
+ let test_name = crate::current_test_name();
|
||||
std::thread::spawn(move || {
|
||||
- f();
|
||||
+ crate::with_test_name(test_name, f);
|
||||
});
|
||||
}
|
||||
}
|
||||
diff --git a/crates/gpui/src/test.rs b/crates/gpui/src/test.rs
|
||||
index 9f8fd8b198..469affdc1c 100644
|
||||
--- a/crates/gpui/src/test.rs
|
||||
+++ b/crates/gpui/src/test.rs
|
||||
@@ -29,11 +29,44 @@ use crate::{Entity, Subscription, TestAppContext, TestDispatcher};
|
||||
use futures::StreamExt as _;
|
||||
use smol::channel;
|
||||
use std::{
|
||||
+ cell::Cell,
|
||||
env,
|
||||
panic::{self, RefUnwindSafe},
|
||||
pin::Pin,
|
||||
};
|
||||
|
||||
+thread_local! {
|
||||
+ static CURRENT_TEST_NAME: Cell<Option<&'static str>> = const { Cell::new(None) };
|
||||
+}
|
||||
+
|
||||
+/// Returns the test name currently associated with this thread, if any.
|
||||
+pub fn current_test_name() -> Option<&'static str> {
|
||||
+ CURRENT_TEST_NAME.with(Cell::get)
|
||||
+}
|
||||
+
|
||||
+/// Runs the closure with the given test name installed for the current thread.
|
||||
+pub fn with_test_name<R>(name: Option<&'static str>, f: impl FnOnce() -> R) -> R {
|
||||
+ CURRENT_TEST_NAME.with(|current_name| {
|
||||
+ struct RestoreTestName<'a> {
|
||||
+ current_name: &'a Cell<Option<&'static str>>,
|
||||
+ previous_name: Option<&'static str>,
|
||||
+ }
|
||||
+
|
||||
+ impl Drop for RestoreTestName<'_> {
|
||||
+ fn drop(&mut self) {
|
||||
+ self.current_name.set(self.previous_name);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ let previous_name = current_name.replace(name);
|
||||
+ let _restore = RestoreTestName {
|
||||
+ current_name,
|
||||
+ previous_name,
|
||||
+ };
|
||||
+ f()
|
||||
+ })
|
||||
+}
|
||||
+
|
||||
/// Run the given test function with the configured parameters.
|
||||
/// This is intended for use with the `gpui::test` macro
|
||||
/// and generally should not be used directly.
|
||||
diff --git a/crates/gpui_macros/src/test.rs b/crates/gpui_macros/src/test.rs
|
||||
index 490ea07fee..3abcaad3ae 100644
|
||||
--- a/crates/gpui_macros/src/test.rs
|
||||
+++ b/crates/gpui_macros/src/test.rs
|
||||
@@ -191,10 +191,12 @@ fn generate_test_function(
|
||||
&[#seeds],
|
||||
#max_retries,
|
||||
&mut |dispatcher, _seed| {
|
||||
- let foreground_executor = gpui::ForegroundExecutor::new(std::sync::Arc::new(dispatcher.clone()));
|
||||
- #cx_vars
|
||||
- foreground_executor.block_test(#inner_fn_name(#inner_fn_args));
|
||||
- #cx_teardowns
|
||||
+ gpui::with_test_name(Some(stringify!(#outer_fn_name)), || {
|
||||
+ let foreground_executor = gpui::ForegroundExecutor::new(std::sync::Arc::new(dispatcher.clone()));
|
||||
+ #cx_vars
|
||||
+ foreground_executor.block_test(#inner_fn_name(#inner_fn_args));
|
||||
+ #cx_teardowns
|
||||
+ })
|
||||
},
|
||||
#on_failure_fn_name
|
||||
);
|
||||
@@ -274,9 +276,11 @@ fn generate_test_function(
|
||||
&[#seeds],
|
||||
#max_retries,
|
||||
&mut |dispatcher, _seed| {
|
||||
- #cx_vars
|
||||
- #inner_fn_name(#inner_fn_args);
|
||||
- #cx_teardowns
|
||||
+ gpui::with_test_name(Some(stringify!(#outer_fn_name)), || {
|
||||
+ #cx_vars
|
||||
+ #inner_fn_name(#inner_fn_args);
|
||||
+ #cx_teardowns
|
||||
+ })
|
||||
},
|
||||
#on_failure_fn_name,
|
||||
);
|
||||
@@ -0,0 +1,310 @@
|
||||
Author: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Subject: Fix workspace persistence races during restoration.
|
||||
Date: 2026-03-01
|
||||
License: expat
|
||||
|
||||
In 0.225.10, workspace persistence has three separate ordering problems.
|
||||
|
||||
First, newly allocated workspace IDs could be used for item persistence before a
|
||||
parent row had been inserted into the workspaces table. That made editor
|
||||
persistence race with workspace creation and could fail with a foreign key
|
||||
constraint error.
|
||||
|
||||
Second, workspace layout persistence and per-item persistence run on separate
|
||||
asynchronous paths. That allowed the workspace layout to be saved with item IDs
|
||||
before the background item-serialization worker had finished writing the
|
||||
corresponding per-item rows. On restore, deserializers that require persisted
|
||||
item state could then fail with "No entry in database for item_id ...", which
|
||||
could drop restored state and break restoration features that depend on that
|
||||
persisted item state, including edited-window restoration.
|
||||
|
||||
Third, restore-side cleanup assumed that deserialized items had already been
|
||||
saved under their new runtime item IDs after being added to panes. In reality,
|
||||
adding a deserialized item only enqueues that serialization work. Cleanup could
|
||||
therefore delete the old persisted rows before the new rows existed, leaving the
|
||||
next reopen with a pane/item layout that still referenced state that had just
|
||||
been deleted.
|
||||
|
||||
This change fixes all three issues:
|
||||
|
||||
- eagerly create the parent workspaces row as soon as a new workspace ID is
|
||||
allocated, before any item serializer can write child rows
|
||||
- keep item persistence on the existing serialization queue, but add an
|
||||
ordering barrier before saving workspace layout so the layout is never
|
||||
published ahead of the item state it references
|
||||
- during restore, wait for the queued serialization of newly added
|
||||
deserialized items before cleaning up stale persisted item IDs, and skip
|
||||
that cleanup pass if the barrier cannot be established or awaited so stale
|
||||
rows are kept rather than deleting still-needed state
|
||||
|
||||
See also <https://github.com/zed-industries/zed/pull/50873>.
|
||||
|
||||
diff --git a/crates/workspace/src/persistence.rs b/crates/workspace/src/persistence.rs
|
||||
index e0ad046e8d..aeb4c3ba39 100644
|
||||
--- a/crates/workspace/src/persistence.rs
|
||||
+++ b/crates/workspace/src/persistence.rs
|
||||
@@ -2124,6 +2124,13 @@ impl WorkspaceDb {
|
||||
}
|
||||
}
|
||||
|
||||
+ query! {
|
||||
+ pub(crate) async fn ensure_workspace_row(workspace_id: WorkspaceId) -> Result<()> {
|
||||
+ INSERT OR IGNORE INTO workspaces(workspace_id)
|
||||
+ VALUES (?1)
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
query! {
|
||||
pub(crate) async fn set_window_open_status(workspace_id: WorkspaceId, bounds: SerializedWindowBounds, display: Uuid) -> Result<()> {
|
||||
UPDATE workspaces
|
||||
diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs
|
||||
index 4141952cc7..3ea631ed6f 100644
|
||||
--- a/crates/workspace/src/workspace.rs
|
||||
+++ b/crates/workspace/src/workspace.rs
|
||||
@@ -1175,6 +1175,11 @@ enum WorkspaceLocation {
|
||||
None,
|
||||
}
|
||||
|
||||
+enum SerializableItemMessage {
|
||||
+ Item(Box<dyn SerializableItemHandle>),
|
||||
+ Barrier(oneshot::Sender<()>),
|
||||
+}
|
||||
+
|
||||
type PromptForNewPath = Box<
|
||||
dyn Fn(
|
||||
&mut Workspace,
|
||||
@@ -1253,7 +1258,7 @@ pub struct Workspace {
|
||||
on_prompt_for_open_path: Option<PromptForOpenPath>,
|
||||
terminal_provider: Option<Box<dyn TerminalProvider>>,
|
||||
debugger_provider: Option<Arc<dyn DebuggerProvider>>,
|
||||
- serializable_items_tx: UnboundedSender<Box<dyn SerializableItemHandle>>,
|
||||
+ serializable_items_tx: UnboundedSender<SerializableItemMessage>,
|
||||
_items_serializer: Task<Result<()>>,
|
||||
session_id: Option<String>,
|
||||
scheduled_tasks: Vec<Task<()>>,
|
||||
@@ -1554,7 +1559,7 @@ impl Workspace {
|
||||
}
|
||||
|
||||
let (serializable_items_tx, serializable_items_rx) =
|
||||
- mpsc::unbounded::<Box<dyn SerializableItemHandle>>();
|
||||
+ mpsc::unbounded::<SerializableItemMessage>();
|
||||
let _items_serializer = cx.spawn_in(window, async move |this, cx| {
|
||||
Self::serialize_items(&this, serializable_items_rx, cx).await
|
||||
});
|
||||
@@ -1759,6 +1764,7 @@ impl Workspace {
|
||||
} else {
|
||||
DB.next_id().await.unwrap_or_else(|_| Default::default())
|
||||
};
|
||||
+ DB.ensure_workspace_row(workspace_id).await?;
|
||||
|
||||
let toolchains = DB.toolchains(workspace_id).await?;
|
||||
|
||||
@@ -6036,8 +6042,16 @@ impl Workspace {
|
||||
window_id: Some(window.window_handle().window_id().as_u64()),
|
||||
user_toolchains,
|
||||
};
|
||||
+ let item_serialization_barrier = self.item_serialization_barrier();
|
||||
|
||||
window.spawn(cx, async move |_| {
|
||||
+ let Some(item_serialization_barrier) = item_serialization_barrier.log_err()
|
||||
+ else {
|
||||
+ return;
|
||||
+ };
|
||||
+ if item_serialization_barrier.await.log_err().is_none() {
|
||||
+ return;
|
||||
+ }
|
||||
persistence::DB.save_workspace(serialized_workspace).await;
|
||||
})
|
||||
}
|
||||
@@ -6108,31 +6122,49 @@ impl Workspace {
|
||||
|
||||
async fn serialize_items(
|
||||
this: &WeakEntity<Self>,
|
||||
- items_rx: UnboundedReceiver<Box<dyn SerializableItemHandle>>,
|
||||
+ mut items_rx: UnboundedReceiver<SerializableItemMessage>,
|
||||
cx: &mut AsyncWindowContext,
|
||||
) -> Result<()> {
|
||||
const CHUNK_SIZE: usize = 200;
|
||||
|
||||
- let mut serializable_items = items_rx.ready_chunks(CHUNK_SIZE);
|
||||
+ while let Some(message) = items_rx.next().await {
|
||||
+ let mut unique_items = HashMap::default();
|
||||
+ let mut barrier = None;
|
||||
+ let mut channel_closed = false;
|
||||
|
||||
- while let Some(items_received) = serializable_items.next().await {
|
||||
- let unique_items =
|
||||
- items_received
|
||||
- .into_iter()
|
||||
- .fold(HashMap::default(), |mut acc, item| {
|
||||
- acc.entry(item.item_id()).or_insert(item);
|
||||
- acc
|
||||
- });
|
||||
+ Self::push_serializable_item_message(message, &mut unique_items, &mut barrier);
|
||||
|
||||
- // We use into_iter() here so that the references to the items are moved into
|
||||
- // the tasks and not kept alive while we're sleeping.
|
||||
- for (_, item) in unique_items.into_iter() {
|
||||
- if let Ok(Some(task)) = this.update_in(cx, |workspace, window, cx| {
|
||||
- item.serialize(workspace, false, window, cx)
|
||||
- }) {
|
||||
- cx.background_spawn(async move { task.await.log_err() })
|
||||
- .detach();
|
||||
+ while barrier.is_none() && unique_items.len() < CHUNK_SIZE {
|
||||
+ match items_rx.try_next() {
|
||||
+ Ok(Some(message)) => {
|
||||
+ Self::push_serializable_item_message(
|
||||
+ message,
|
||||
+ &mut unique_items,
|
||||
+ &mut barrier,
|
||||
+ );
|
||||
+ }
|
||||
+ Ok(None) => {
|
||||
+ channel_closed = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ Err(_) => break,
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ let batch_succeeded = Self::serialize_item_batch(this, unique_items, cx)
|
||||
+ .await
|
||||
+ .log_err()
|
||||
+ .is_some();
|
||||
+
|
||||
+ if let Some(barrier) = barrier {
|
||||
+ if batch_succeeded {
|
||||
+ let _ = barrier.send(());
|
||||
}
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if channel_closed {
|
||||
+ break;
|
||||
}
|
||||
|
||||
cx.background_executor()
|
||||
@@ -6143,12 +6175,54 @@ impl Workspace {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
+ fn push_serializable_item_message(
|
||||
+ message: SerializableItemMessage,
|
||||
+ unique_items: &mut HashMap<EntityId, Box<dyn SerializableItemHandle>>,
|
||||
+ barrier: &mut Option<oneshot::Sender<()>>,
|
||||
+ ) {
|
||||
+ match message {
|
||||
+ SerializableItemMessage::Item(item) => {
|
||||
+ unique_items.entry(item.item_id()).or_insert(item);
|
||||
+ }
|
||||
+ SerializableItemMessage::Barrier(sender) => {
|
||||
+ *barrier = Some(sender);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ async fn serialize_item_batch(
|
||||
+ this: &WeakEntity<Self>,
|
||||
+ unique_items: HashMap<EntityId, Box<dyn SerializableItemHandle>>,
|
||||
+ cx: &mut AsyncWindowContext,
|
||||
+ ) -> Result<()> {
|
||||
+ let serialize_tasks = match this.update_in(cx, move |workspace, window, cx| {
|
||||
+ unique_items
|
||||
+ .into_values()
|
||||
+ .filter_map(|item| item.serialize(workspace, false, window, cx))
|
||||
+ .collect::<Vec<_>>()
|
||||
+ }) {
|
||||
+ Ok(serialize_tasks) => serialize_tasks,
|
||||
+ Err(_) => return Ok(()),
|
||||
+ };
|
||||
+
|
||||
+ try_join_all(serialize_tasks).await?;
|
||||
+ Ok(())
|
||||
+ }
|
||||
+
|
||||
+ fn item_serialization_barrier(&self) -> Result<oneshot::Receiver<()>> {
|
||||
+ let (sender, receiver) = oneshot::channel();
|
||||
+ self.serializable_items_tx
|
||||
+ .unbounded_send(SerializableItemMessage::Barrier(sender))
|
||||
+ .map_err(|err| anyhow!("failed to send item serialization barrier: {err}"))?;
|
||||
+ Ok(receiver)
|
||||
+ }
|
||||
+
|
||||
pub(crate) fn enqueue_item_serialization(
|
||||
&mut self,
|
||||
item: Box<dyn SerializableItemHandle>,
|
||||
) -> Result<()> {
|
||||
self.serializable_items_tx
|
||||
- .unbounded_send(item)
|
||||
+ .unbounded_send(SerializableItemMessage::Item(item))
|
||||
.map_err(|err| anyhow!("failed to send serializable item over channel: {err}"))
|
||||
}
|
||||
|
||||
@@ -6252,24 +6326,42 @@ impl Workspace {
|
||||
// after loading the items, we might have different items and in order to avoid
|
||||
// the database filling up, we delete items that haven't been loaded now.
|
||||
//
|
||||
- // The items that have been loaded, have been saved after they've been added to the workspace.
|
||||
- let clean_up_tasks = workspace.update_in(cx, |_, window, cx| {
|
||||
- item_ids_by_kind
|
||||
- .into_iter()
|
||||
- .map(|(item_kind, loaded_items)| {
|
||||
- SerializableItemRegistry::cleanup(
|
||||
- item_kind,
|
||||
- serialized_workspace.id,
|
||||
- loaded_items,
|
||||
- window,
|
||||
- cx,
|
||||
- )
|
||||
- .log_err()
|
||||
- })
|
||||
- .collect::<Vec<_>>()
|
||||
- })?;
|
||||
+ // Newly deserialized items only enqueue serialization when they are added to their panes.
|
||||
+ // Wait for that queued work to finish before deleting the old persisted item ids.
|
||||
+ let item_serialization_barrier = workspace
|
||||
+ .update_in(cx, |workspace, _, _| {
|
||||
+ workspace.item_serialization_barrier().log_err()
|
||||
+ })
|
||||
+ .log_err()
|
||||
+ .flatten();
|
||||
+
|
||||
+ let item_serialization_flushed = if let Some(item_serialization_barrier) =
|
||||
+ item_serialization_barrier
|
||||
+ {
|
||||
+ item_serialization_barrier.await.log_err().is_some()
|
||||
+ } else {
|
||||
+ false
|
||||
+ };
|
||||
|
||||
- futures::future::join_all(clean_up_tasks).await;
|
||||
+ if item_serialization_flushed {
|
||||
+ let clean_up_tasks = workspace.update_in(cx, |_, window, cx| {
|
||||
+ item_ids_by_kind
|
||||
+ .into_iter()
|
||||
+ .map(|(item_kind, loaded_items)| {
|
||||
+ SerializableItemRegistry::cleanup(
|
||||
+ item_kind,
|
||||
+ serialized_workspace.id,
|
||||
+ loaded_items,
|
||||
+ window,
|
||||
+ cx,
|
||||
+ )
|
||||
+ .log_err()
|
||||
+ })
|
||||
+ .collect::<Vec<_>>()
|
||||
+ })?;
|
||||
+
|
||||
+ futures::future::join_all(clean_up_tasks).await;
|
||||
+ }
|
||||
|
||||
workspace
|
||||
.update_in(cx, |workspace, window, cx| {
|
||||
@@ -9001,6 +9093,7 @@ fn deserialize_remote_project(
|
||||
} else {
|
||||
persistence::DB.next_id().await?
|
||||
};
|
||||
+ persistence::DB.ensure_workspace_row(workspace_id).await?;
|
||||
|
||||
Ok((workspace_id, serialized_workspace))
|
||||
})
|
||||
@@ -0,0 +1,163 @@
|
||||
From: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Date: Fri, 6 Mar 2026 20:20:00 +0000
|
||||
Subject: [PATCH] workspace: Keep local workspaces whose roots are only regular files
|
||||
License: expat
|
||||
|
||||
Zed persists local workspaces for standalone regular files as well as
|
||||
directory-backed projects. Recent-workspace cleanup and last-session
|
||||
restoration were using a helper that only kept local workspaces if all
|
||||
saved paths existed and at least one of them was a directory.
|
||||
|
||||
That made local workspaces whose roots were only regular files look
|
||||
invalid. A background recent-workspaces pass could then delete the
|
||||
workspace row, which in turn cascaded to item-specific state such as
|
||||
editors. In the window edited-state restore test, reopening a
|
||||
standalone regular file could therefore fail because the saved editor
|
||||
row had been deleted by that cleanup path.
|
||||
|
||||
Fix this by treating a local workspace as valid whenever all of its
|
||||
saved paths still exist, whether those paths are directories or
|
||||
regular files. Apply the same rule to last-session workspace
|
||||
restoration, and add regression coverage for both code paths.
|
||||
|
||||
diff --git a/crates/workspace/src/persistence.rs b/crates/workspace/src/persistence.rs
|
||||
--- a/crates/workspace/src/persistence.rs
|
||||
+++ b/crates/workspace/src/persistence.rs
|
||||
@@ -1783,19 +1783,13 @@ impl WorkspaceDb {
|
||||
}
|
||||
}
|
||||
|
||||
- async fn all_paths_exist_with_a_directory(paths: &[PathBuf], fs: &dyn Fs) -> bool {
|
||||
- let mut any_dir = false;
|
||||
+ async fn all_paths_exist(paths: &[PathBuf], fs: &dyn Fs) -> bool {
|
||||
for path in paths {
|
||||
- match fs.metadata(path).await.ok().flatten() {
|
||||
- None => return false,
|
||||
- Some(meta) => {
|
||||
- if meta.is_dir {
|
||||
- any_dir = true;
|
||||
- }
|
||||
- }
|
||||
+ if fs.metadata(path).await.ok().flatten().is_none() {
|
||||
+ return false;
|
||||
}
|
||||
}
|
||||
- any_dir
|
||||
+ true
|
||||
}
|
||||
|
||||
// Returns the recent locations which are still valid on disk and deletes ones which no longer
|
||||
@@ -1843,7 +1837,11 @@ impl WorkspaceDb {
|
||||
// If a local workspace points to WSL, this check will cause us to wait for the
|
||||
// WSL VM and file server to boot up. This can block for many seconds.
|
||||
// Supported scenarios use remote workspaces.
|
||||
- if !has_wsl_path && Self::all_paths_exist_with_a_directory(paths.paths(), fs).await {
|
||||
+ //
|
||||
+ // Local workspaces may legitimately contain only regular files (for example, a
|
||||
+ // standalone file opened outside any worktree). Those should be preserved as
|
||||
+ // long as all of their saved paths still exist.
|
||||
+ if !has_wsl_path && Self::all_paths_exist(paths.paths(), fs).await {
|
||||
result.push((id, SerializedWorkspaceLocation::Local, paths, timestamp));
|
||||
} else {
|
||||
delete_tasks.push(self.delete_workspace_by_id(id));
|
||||
@@ -1903,7 +1901,7 @@ impl WorkspaceDb {
|
||||
window_id,
|
||||
});
|
||||
} else {
|
||||
- if Self::all_paths_exist_with_a_directory(paths.paths(), fs).await {
|
||||
+ if Self::all_paths_exist(paths.paths(), fs).await {
|
||||
workspaces.push(SessionWorkspace {
|
||||
workspace_id,
|
||||
location: SerializedWorkspaceLocation::Local,
|
||||
@@ -3425,6 +3423,91 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
+ #[gpui::test]
|
||||
+ async fn test_recent_workspaces_on_disk_keeps_regular_file_only_workspace(
|
||||
+ cx: &mut gpui::TestAppContext,
|
||||
+ ) {
|
||||
+ let dir = tempfile::TempDir::with_prefix("regular-file-workspace").unwrap();
|
||||
+ let regular_file = dir.path().join("a");
|
||||
+
|
||||
+ let fs = fs::FakeFs::new(cx.executor());
|
||||
+ fs.insert_tree(dir.path(), json!({"a": "hey"})).await;
|
||||
+
|
||||
+ let db = WorkspaceDb::open_test_db("test_recent_workspaces_keeps_regular_file_only")
|
||||
+ .await;
|
||||
+ let workspace = SerializedWorkspace {
|
||||
+ id: WorkspaceId(1),
|
||||
+ paths: PathList::new(&[regular_file.clone()]),
|
||||
+ location: SerializedWorkspaceLocation::Local,
|
||||
+ center_group: Default::default(),
|
||||
+ window_bounds: Default::default(),
|
||||
+ display: Default::default(),
|
||||
+ docks: Default::default(),
|
||||
+ centered_layout: false,
|
||||
+ breakpoints: Default::default(),
|
||||
+ session_id: None,
|
||||
+ window_id: Some(1),
|
||||
+ user_toolchains: Default::default(),
|
||||
+ };
|
||||
+
|
||||
+ db.save_workspace(workspace.clone()).await;
|
||||
+
|
||||
+ let recent = db.recent_workspaces_on_disk(fs.as_ref()).await.unwrap();
|
||||
+ assert_eq!(
|
||||
+ recent,
|
||||
+ vec![(
|
||||
+ workspace.id,
|
||||
+ SerializedWorkspaceLocation::Local,
|
||||
+ workspace.paths.clone(),
|
||||
+ recent[0].3,
|
||||
+ )]
|
||||
+ );
|
||||
+ assert_eq!(db.workspace_for_roots(&[regular_file]).unwrap().id, workspace.id);
|
||||
+ }
|
||||
+
|
||||
+ #[gpui::test]
|
||||
+ async fn test_last_session_workspace_locations_keeps_regular_file_only_workspace(
|
||||
+ cx: &mut gpui::TestAppContext,
|
||||
+ ) {
|
||||
+ let dir = tempfile::TempDir::with_prefix("regular-file-workspace-session").unwrap();
|
||||
+ let regular_file = dir.path().join("a");
|
||||
+
|
||||
+ let fs = fs::FakeFs::new(cx.executor());
|
||||
+ fs.insert_tree(dir.path(), json!({"a": "hey"})).await;
|
||||
+
|
||||
+ let db = WorkspaceDb::open_test_db("test_last_session_keeps_regular_file_only").await;
|
||||
+ let workspace = SerializedWorkspace {
|
||||
+ id: WorkspaceId(1),
|
||||
+ paths: PathList::new(&[regular_file.clone()]),
|
||||
+ location: SerializedWorkspaceLocation::Local,
|
||||
+ center_group: Default::default(),
|
||||
+ window_bounds: Default::default(),
|
||||
+ display: Default::default(),
|
||||
+ docks: Default::default(),
|
||||
+ centered_layout: false,
|
||||
+ breakpoints: Default::default(),
|
||||
+ session_id: Some("one-session".to_owned()),
|
||||
+ window_id: Some(7),
|
||||
+ user_toolchains: Default::default(),
|
||||
+ };
|
||||
+
|
||||
+ db.save_workspace(workspace.clone()).await;
|
||||
+
|
||||
+ let locations = db
|
||||
+ .last_session_workspace_locations("one-session", None, fs.as_ref())
|
||||
+ .await
|
||||
+ .unwrap();
|
||||
+ assert_eq!(
|
||||
+ locations,
|
||||
+ vec![SessionWorkspace {
|
||||
+ workspace_id: workspace.id,
|
||||
+ location: SerializedWorkspaceLocation::Local,
|
||||
+ paths: workspace.paths,
|
||||
+ window_id: Some(WindowId::from(7u64)),
|
||||
+ }]
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
#[gpui::test]
|
||||
async fn test_get_or_create_ssh_project() {
|
||||
let db = WorkspaceDb::open_test_db("test_get_or_create_ssh_project").await;
|
||||
@@ -0,0 +1,24 @@
|
||||
Author: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Subject: Remove the [patch.crates-io] section from Cargo.toml.
|
||||
Date: 2026-03-01
|
||||
License: expat
|
||||
|
||||
These overrides redirect crates-io dependencies to git sources, which cannot be
|
||||
fetched in an offline build. With vendored sources the overrides are unnecessary.
|
||||
|
||||
--- a/Cargo.toml
|
||||
+++ b/Cargo.toml
|
||||
@@ -804,13 +804,6 @@
|
||||
"Win32_Media",
|
||||
]
|
||||
|
||||
-[patch.crates-io]
|
||||
-async-task = { git = "https://github.com/smol-rs/async-task.git", rev = "b4486cd71e4e94fbda54ce6302444de14f4d190e" }
|
||||
-notify = { git = "https://github.com/zed-industries/notify.git", rev = "ce58c24cad542c28e04ced02e20325a4ec28a31d" }
|
||||
-notify-types = { git = "https://github.com/zed-industries/notify.git", rev = "ce58c24cad542c28e04ced02e20325a4ec28a31d" }
|
||||
-windows-capture = { git = "https://github.com/zed-industries/windows-capture.git", rev = "f0d6c1b6691db75461b732f6d5ff56eed002eeb9" }
|
||||
-calloop = { git = "https://github.com/zed-industries/calloop" }
|
||||
-
|
||||
[profile.dev]
|
||||
split-debuginfo = "unpacked"
|
||||
incremental = true
|
||||
@@ -0,0 +1,75 @@
|
||||
Author: Danny Milosavljevic <dannym@friendly-machines.com>
|
||||
Subject: Use mock livekit client on Linux to avoid libwebrtc dependency.
|
||||
Date: 2026-03-01
|
||||
License: GPL3+
|
||||
|
||||
libwebrtc is not packaged in Guix and is difficult to build from source.
|
||||
Zed already has a mock_client fallback for FreeBSD and Windows-GNU which
|
||||
lack libwebrtc. Add target_os = "linux" to those cfg conditions so Linux
|
||||
also uses mock_client, and exclude the libwebrtc/livekit dependencies from
|
||||
Cargo.toml on Linux. This disables voice/video calls but allows the rest
|
||||
of Zed to build.
|
||||
|
||||
--- a/crates/livekit_client/Cargo.toml 2026-03-01 21:21:38.647599342 +0000
|
||||
+++ b/crates/livekit_client/Cargo.toml 2026-03-01 21:22:19.846482866 +0000
|
||||
@@ -44,7 +44,7 @@
|
||||
ui.workspace = true
|
||||
util.workspace = true
|
||||
|
||||
-[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd")))'.dependencies]
|
||||
+[target.'cfg(not(any(all(target_os = "windows", target_env = "gnu"), target_os = "freebsd", target_os = "linux")))'.dependencies]
|
||||
libwebrtc = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks" }
|
||||
livekit = { rev = "5f04705ac3f356350ae31534ffbc476abc9ea83d", git = "https://github.com/zed-industries/livekit-rust-sdks", features = ["__rustls-tls"] }
|
||||
|
||||
--- a/crates/livekit_client/src/lib.rs 2026-03-01 21:21:44.752291052 +0000
|
||||
+++ b/crates/livekit_client/src/lib.rs 2026-03-01 21:22:37.234363786 +0000
|
||||
@@ -15,7 +15,8 @@
|
||||
test,
|
||||
feature = "test-support",
|
||||
all(target_os = "windows", target_env = "gnu"),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd",
|
||||
+ target_os = "linux"
|
||||
))
|
||||
))]
|
||||
mod livekit_client;
|
||||
@@ -25,7 +26,8 @@
|
||||
test,
|
||||
feature = "test-support",
|
||||
all(target_os = "windows", target_env = "gnu"),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd",
|
||||
+ target_os = "linux"
|
||||
))
|
||||
))]
|
||||
pub use livekit_client::*;
|
||||
@@ -36,7 +38,8 @@
|
||||
test,
|
||||
feature = "test-support",
|
||||
all(target_os = "windows", target_env = "gnu"),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd",
|
||||
+ target_os = "linux"
|
||||
)
|
||||
))]
|
||||
mod mock_client;
|
||||
@@ -46,7 +49,8 @@
|
||||
test,
|
||||
feature = "test-support",
|
||||
all(target_os = "windows", target_env = "gnu"),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd",
|
||||
+ target_os = "linux"
|
||||
)
|
||||
))]
|
||||
pub mod test;
|
||||
@@ -56,7 +60,8 @@
|
||||
test,
|
||||
feature = "test-support",
|
||||
all(target_os = "windows", target_env = "gnu"),
|
||||
- target_os = "freebsd"
|
||||
+ target_os = "freebsd",
|
||||
+ target_os = "linux"
|
||||
)
|
||||
))]
|
||||
pub use mock_client::*;
|
||||
@@ -4,7 +4,7 @@
|
||||
;;; Copyright © 2020 Brett Gilio <brettg@gnu.org>
|
||||
;;; Copyright © 2021, 2024 Efraim Flashner <efraim@flashner.co.il>
|
||||
;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
|
||||
;;; Copyright © 2024-2025 jgart <jgart@dismail.de>
|
||||
;;; Copyright © 2024-2026 jgart <jgart@dismail.de>
|
||||
;;;
|
||||
;;; This file is part of GNU Guix.
|
||||
;;;
|
||||
@@ -39,6 +39,7 @@
|
||||
#:use-module (gnu packages fontutils)
|
||||
#:use-module (gnu packages game-development)
|
||||
#:use-module (gnu packages image)
|
||||
#:use-module (gnu packages libedit)
|
||||
#:use-module (gnu packages libffi)
|
||||
#:use-module (gnu packages libunwind)
|
||||
#:use-module (gnu packages maths)
|
||||
@@ -236,7 +237,7 @@ it.")
|
||||
(define-public trealla
|
||||
(package
|
||||
(name "trealla")
|
||||
(version "2.92.29")
|
||||
(version "2.92.30")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
@@ -245,12 +246,13 @@ it.")
|
||||
(url "https://github.com/trealla-prolog/trealla")
|
||||
(commit (string-append "v" version))))
|
||||
(sha256
|
||||
(base32 "1032pza07dzyrsjrbh355h3cyrkwsg2vbzwwaaxcvfirjhn8zdam"))
|
||||
(base32 "1vbjv2nf3c2npf349i9y0zknc2g0hizksv0yhgscdpwzvzfp6n9m"))
|
||||
(file-name (git-file-name name version))))
|
||||
(build-system gnu-build-system)
|
||||
(inputs
|
||||
(list curl
|
||||
gsl
|
||||
libedit
|
||||
libffi
|
||||
openssl
|
||||
raylib
|
||||
|
||||
@@ -108,24 +108,9 @@ data in motion, or as a file format for data at rest.")
|
||||
(uri (git-reference
|
||||
(url "https://github.com/protocolbuffers/protobuf/")
|
||||
(commit (string-append "v" version))))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; XXX: 'delete-all-but' is copied from the turbovnc package.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(define (directory? x)
|
||||
(and=> (stat x #f)
|
||||
(compose (cut eq? 'directory <>) stat:type)))
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred
|
||||
(negate (cut member <> (append '("." "..") preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each delete-file-recursively items))))
|
||||
;; "utf8_range" development now takes place in main protobuf
|
||||
;; repository.
|
||||
(delete-all-but "third_party" "utf8_range")))
|
||||
(modules '((guix build utils)))
|
||||
;; "utf8_range" development now takes place in main protobuf repository.
|
||||
(snippet #~(delete-all-but "third_party" "utf8_range"))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1rdxm75bqwjj4qd3hz4vlydra6bw5dq391kwln2q0pjfx9gbrjhk"))))
|
||||
|
||||
+3915
-1
File diff suppressed because it is too large
Load Diff
@@ -59,6 +59,128 @@
|
||||
(base32
|
||||
"1yhs9lj9gnzbvimv0y5f1a4my0slbvygkcjjkaxd4wkkyfvfbkxy")))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
(define-public rust-alacritty-0.25.1.9d9640d
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-alacritty")
|
||||
(version "0.25.1")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/zed-industries/alacritty")
|
||||
(commit "9d9640d4e56d67a09d049f9c0a300aae08d4f61e")))
|
||||
(file-name
|
||||
(git-file-name "rust-alacritty" "0.25.1.9d9640d"))
|
||||
(sha256
|
||||
(base32 "16g4jdbwdhqihc2x403fdaxf6m9gcj44cm53dyk68b3wl7chh29s"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("alacritty_terminal")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")))
|
||||
(inputs (cargo-inputs 'rust-alacritty-0.25.1.9d9640d))
|
||||
(home-page "https://github.com/zed-industries/alacritty")
|
||||
(synopsis "Terminal emulator library")
|
||||
(description
|
||||
"This package provides a terminal emulator library.")
|
||||
(license license:asl2.0))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
(define-public rust-candle-0.9.1.724d75e
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-candle")
|
||||
(version "0.9.1")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/zed-industries/candle")
|
||||
(commit "724d75eb3deebefe83f2a7381a45d4fac6eda383")))
|
||||
(file-name
|
||||
(git-file-name "rust-candle" "0.9.1.724d75e"))
|
||||
(sha256
|
||||
(base32 "1n9g84g0ikldw42f0j3ad975vjvx6ildwqh8dw3zi3rps518hx14"))
|
||||
(patches
|
||||
(search-patches
|
||||
"rust-candle-0.9.1-add-candle-onnx-to-workspace.patch"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("candle-core"
|
||||
"candle-nn"
|
||||
"candle-onnx")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")))
|
||||
(inputs (cargo-inputs 'rust-candle-0.9.1.724d75e))
|
||||
(home-page "https://github.com/huggingface/candle")
|
||||
(synopsis "Minimalist ML framework for Rust")
|
||||
(description
|
||||
"This package provides a minimalist ML framework for Rust.")
|
||||
(license (list license:asl2.0 license:expat)))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
(define-public rust-dap-types-0.0.1.1b461b3
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-dap-types")
|
||||
(version "0.0.1")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/zed-industries/dap-types")
|
||||
(commit "1b461b310481d01e02b2603c16d7144b926339f8")))
|
||||
(file-name
|
||||
(git-file-name "rust-dap-types" "0.0.1.1b461b3"))
|
||||
(sha256
|
||||
(base32 "0snc05ia4jvykajavsvyxcyn24s2jxbw7k9wmby23r1aqxf31i0z"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("dap-types")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")))
|
||||
(inputs (cargo-inputs 'rust-dap-types-0.0.1.1b461b3))
|
||||
(home-page "https://github.com/zed-industries/dap-types")
|
||||
(synopsis "Rust types for the Debug Adapter Protocol")
|
||||
(description
|
||||
"This package provides Rust types for the Debug Adapter Protocol.")
|
||||
(license (list license:asl2.0 license:expat)))))
|
||||
|
||||
(define-public rust-deunicode-1
|
||||
(hidden-package
|
||||
(package
|
||||
@@ -102,6 +224,46 @@
|
||||
transliterating them. It supports Emoji and Chinese.")
|
||||
(license license:bsd-3))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
(define-public rust-gh-workflow-0.8.0.c9eac0e
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-gh-workflow")
|
||||
(version "0.8.0")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/zed-industries/gh-workflow")
|
||||
(commit "c9eac0ed361583e1072860d96776fa52775b82ac")))
|
||||
(file-name
|
||||
(git-file-name "rust-gh-workflow" "0.8.0.c9eac0e"))
|
||||
(sha256
|
||||
(base32 "172bn9b16f7qj3mn0h8r8bwiiiw2awgqlzj5n6f2gjcgk5nmh1hp"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("gh-workflow-macros"
|
||||
"gh-workflow")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")))
|
||||
(inputs (cargo-inputs 'rust-gh-workflow-0.8.0.c9eac0e))
|
||||
(home-page "https://github.com/tailcallhq/gh-workflow")
|
||||
(synopsis "Type-safe GitHub Actions workflow generation")
|
||||
(description
|
||||
"This package provides type-safe GitHub Actions workflow generation.")
|
||||
(license license:expat))))
|
||||
|
||||
(define-public rust-hypher-0.1
|
||||
(hidden-package
|
||||
(package
|
||||
@@ -145,6 +307,191 @@ transliterating them. It supports Emoji and Chinese.")
|
||||
(description "@code{hypher} is a Rust library for syllabification.")
|
||||
(license (list license:expat license:asl2.0)))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
;;
|
||||
;; Only livekit-protocol, livekit-runtime, and livekit-api are
|
||||
;; packaged. The libwebrtc, webrtc-sys, and livekit crates are
|
||||
;; disabled on Linux by our zed-use-mock-livekit-on-linux patch
|
||||
;; (which adds target_os = "linux" to the cfg gate), but their
|
||||
;; Cargo.toml files must remain for workspace resolution; their
|
||||
;; source is replaced with empty stubs. The snippet also deletes
|
||||
;; unused workspace members (livekit-ffi, soxr-sys, yuv-sys,
|
||||
;; imgproc, examples) and the 1.6 MiB generated livekit.serde.rs
|
||||
;; (guarded by a nonexistent "serde" feature, so never compiled).
|
||||
;;
|
||||
;; TODO: Regenerate livekit-protocol/src/livekit.rs (5650 lines)
|
||||
;; from the .proto source in the livekit-protocol/protocol
|
||||
;; submodule (github.com/livekit/protocol) using prost-build and
|
||||
;; pbjson-build as native-inputs, then delete the shipped copy.
|
||||
(define-public rust-livekit-0.7.8.5f04705
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-livekit")
|
||||
(version "0.7.8")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/zed-industries/livekit-rust-sdks")
|
||||
(commit "5f04705ac3f356350ae31534ffbc476abc9ea83d")))
|
||||
(file-name
|
||||
(git-file-name "rust-livekit" "0.7.8.5f04705"))
|
||||
(sha256
|
||||
(base32 "1irnw9dax0nl8rl7jxdxs5vw6hg166jj4gf1s5cza6igvmrkl6y9"))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
'(begin
|
||||
(for-each delete-file-recursively
|
||||
'(".github" "examples" "imgproc"
|
||||
"livekit-ffi" "soxr-sys" "yuv-sys"
|
||||
;; Keep Cargo.toml for workspace resolution
|
||||
;; but replace source with stubs.
|
||||
"libwebrtc/src"
|
||||
"livekit/src"
|
||||
"webrtc-sys/src"
|
||||
"webrtc-sys/include"
|
||||
"webrtc-sys/libwebrtc"))
|
||||
(for-each (lambda (f)
|
||||
(mkdir-p (dirname f))
|
||||
(call-with-output-file f (const #t)))
|
||||
'("libwebrtc/src/lib.rs"
|
||||
"livekit/src/lib.rs"
|
||||
"webrtc-sys/src/lib.rs"))
|
||||
(delete-file
|
||||
"livekit-protocol/src/livekit.serde.rs")
|
||||
(substitute* "Cargo.toml"
|
||||
(("\"livekit-ffi\",") "")
|
||||
(("\"soxr-sys\",") "")
|
||||
(("\"yuv-sys\",") "")
|
||||
(("\"imgproc\",") ""))))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("livekit-protocol"
|
||||
"livekit-runtime"
|
||||
"livekit-api"
|
||||
"webrtc-sys-build"
|
||||
"webrtc-sys"
|
||||
"libwebrtc"
|
||||
"livekit")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")
|
||||
#:phases
|
||||
#~(modify-phases %standard-phases
|
||||
(replace 'package
|
||||
(lambda* (#:key source (cargo-package-crates '())
|
||||
(cargo-package-flags '("--no-metadata" "--no-verify"))
|
||||
(vendor-dir "guix-vendor")
|
||||
#:allow-other-keys)
|
||||
(use-modules (ice-9 ftw))
|
||||
;; Same as the standard package phase, but deletes
|
||||
;; cargo's target/package/tmp-crate/ scratch directory
|
||||
;; between the packaging loop and the repacking step.
|
||||
;; Cargo copies .crate files there during packaging and
|
||||
;; does not clean up. The repacking step's recursive
|
||||
;; find-files picks them up, and scandir confuses the
|
||||
;; tmp-crate directory with an extracted crate when
|
||||
;; names sort after "tmp-crate" alphabetically.
|
||||
(when (file-exists? "Cargo.toml.orig")
|
||||
(delete-file "Cargo.toml.orig"))
|
||||
(for-each
|
||||
(lambda (pkg)
|
||||
(apply invoke "cargo" "package" "--offline"
|
||||
"--package" pkg cargo-package-flags)
|
||||
(for-each
|
||||
(lambda (crate)
|
||||
(invoke "tar" "xzf" crate "-C" vendor-dir))
|
||||
(find-files "target/package" "\\.crate$"))
|
||||
((assoc-ref %standard-phases 'patch-cargo-checksums)
|
||||
#:vendor-dir vendor-dir))
|
||||
cargo-package-crates)
|
||||
;; Delete cargo's scratch directory.
|
||||
(when (file-exists? "target/package/tmp-crate")
|
||||
(delete-file-recursively "target/package/tmp-crate"))
|
||||
;; Repack crates with deterministic timestamps.
|
||||
(with-directory-excursion "target/package"
|
||||
(for-each
|
||||
(lambda (crate)
|
||||
(invoke "tar" "xf" crate)
|
||||
(delete-file crate)
|
||||
(let ((dir
|
||||
(car (scandir
|
||||
"."
|
||||
(lambda (file)
|
||||
(and (not (member file '("." "..")))
|
||||
(not (string-suffix?
|
||||
".crate" file))))))))
|
||||
(for-each
|
||||
(lambda (file)
|
||||
(let ((s (lstat file)))
|
||||
(unless (eq? (stat:type s) 'symlink)
|
||||
(utime file 0 0 0 0))))
|
||||
(find-files dir #:directories? #t))
|
||||
(apply invoke "tar" "czf"
|
||||
(string-append dir ".crate")
|
||||
"--sort=name" "--mtime=@0"
|
||||
"--owner=root:0" "--group=root:0"
|
||||
(find-files dir #:directories? #t))
|
||||
(delete-file-recursively dir)))
|
||||
(find-files "." "\\.crate$"))))))))
|
||||
(inputs (cargo-inputs 'rust-livekit-0.7.8.5f04705))
|
||||
(home-page "https://github.com/livekit/rust-sdks")
|
||||
(synopsis "LiveKit real-time communication SDK for Rust")
|
||||
(description
|
||||
"This package provides a LiveKit real-time communication SDK for Rust.")
|
||||
(license license:asl2.0))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
(define-public rust-notify-8.2.0.ce58c24
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-notify")
|
||||
(version "8.2.0")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/zed-industries/notify.git")
|
||||
(commit "ce58c24cad542c28e04ced02e20325a4ec28a31d")))
|
||||
(file-name
|
||||
(git-file-name "rust-notify" "8.2.0.ce58c24"))
|
||||
(sha256
|
||||
(base32 "09zn3ll1vlsblgrdacyw3zx58xzdxlab8ba7h22bbb57n76dmkl0"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("notify-types"
|
||||
"notify")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")))
|
||||
(inputs (cargo-inputs 'rust-notify-8.2.0.ce58c24))
|
||||
(home-page "https://github.com/notify-rs/notify")
|
||||
(synopsis "Cross-platform filesystem notification library")
|
||||
(description
|
||||
"This package provides a cross-platform filesystem notification library
|
||||
for Rust.")
|
||||
(license (list license:asl2.0 license:expat)))))
|
||||
|
||||
(define-public rust-pcre2-utf32-0.2
|
||||
(hidden-package
|
||||
(package
|
||||
@@ -227,6 +574,77 @@ UTF-32 support.")
|
||||
"0zgqklzmyk893n82zq8d0is57npvy9lsfpqb83h1bbx9c42fl35p"))))
|
||||
(inputs (cargo-inputs 'rust-pipewire-0.8.0.93138d0))))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
(define-public rust-pet-0.1.0.d5b5bb0
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-pet")
|
||||
(version "0.1.0")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/microsoft/python-environment-tools.git")
|
||||
(commit "d5b5bb0c4558a51d8cc76b514bc870fd1c042f16")))
|
||||
(file-name
|
||||
(git-file-name "rust-pet" "0.1.0.d5b5bb0"))
|
||||
(sha256
|
||||
(base32 "01djr1761l7c889v9lng7igjqxiz208r2vrwij661cn2fy5xcm5f"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("pet-fs"
|
||||
"pet-core"
|
||||
"pet-python-utils"
|
||||
"pet-jsonrpc"
|
||||
"pet-reporter"
|
||||
"pet-conda"
|
||||
"pet-virtualenv"
|
||||
"pet-virtualenvwrapper"
|
||||
"pet-env-var-path"
|
||||
"pet-global-virtualenvs"
|
||||
"pet-homebrew"
|
||||
"pet-linux-global-python"
|
||||
"pet-mac-commandlinetools"
|
||||
"pet-mac-python-org"
|
||||
"pet-mac-xcode"
|
||||
"pet-pipenv"
|
||||
"pet-pixi"
|
||||
"pet-poetry"
|
||||
"pet-pyenv"
|
||||
"pet-telemetry"
|
||||
"pet-uv"
|
||||
"pet-venv"
|
||||
"pet-windows-store"
|
||||
"pet-windows-registry"
|
||||
"pet")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")
|
||||
#:phases
|
||||
#~(modify-phases %standard-phases
|
||||
(add-after 'unpack 'fix-versions
|
||||
(lambda _
|
||||
(let ((version #$(package-version this-package)))
|
||||
(substitute* (find-files "." "^Cargo[.]toml$")
|
||||
(("^(pet-[a-z-]*) = [{] path = \"([^\"]*)\" [}]" x pkg path)
|
||||
(string-append pkg " = { version = \"" version "\", path = \"" path "\" }")))))))))
|
||||
(inputs (cargo-inputs 'rust-pet-0.1.0.d5b5bb0))
|
||||
(home-page "https://github.com/microsoft/python-environment-tools")
|
||||
(synopsis "Python environment tools")
|
||||
(description
|
||||
"This package provides Python environment tools.")
|
||||
(license license:expat))))
|
||||
|
||||
(define-public rust-pubgrub-0.3.0.b70cf70
|
||||
(let ((commit "b70cf707aa43f21b32f3a61b8a0889b15032d5c4")
|
||||
(revision "0"))
|
||||
@@ -677,6 +1095,47 @@ intelligence.")
|
||||
(inputs (cons oniguruma
|
||||
(cargo-inputs 'rust-syntect-5.3))))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
(define-public rust-tiktoken-rs-0.9.1.2570c43
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-tiktoken-rs")
|
||||
(version "0.9.1")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/zed-industries/tiktoken-rs")
|
||||
(commit "2570c4387a8505fb8f1d3f3557454b474f1e8271")))
|
||||
(file-name
|
||||
(git-file-name "rust-tiktoken-rs" "0.9.1.2570c43"))
|
||||
(sha256
|
||||
(base32 "0yki1whx16xqgsrnr6gjsxakj6qzyvz958g6c9h15xp154kw6573"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("tiktoken-rs")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")))
|
||||
(inputs (cargo-inputs 'rust-tiktoken-rs-0.9.1.2570c43))
|
||||
(home-page "https://github.com/zurawiki/tiktoken-rs")
|
||||
(synopsis "Rust library for OpenAI's BPE tokenizer")
|
||||
(description
|
||||
"This package provides Rust bindings for OpenAI's @acronym{BPE, byte
|
||||
pair encoding} tokenizer, used to count and manage tokens for OpenAI
|
||||
language models.")
|
||||
(license license:expat))))
|
||||
|
||||
(define-public rust-tikv-jemallocator-for-polars
|
||||
(let ((commit "c7991e5bb6b3e9f79db6b0f48dcda67c5c3d2936")
|
||||
(revision "0"))
|
||||
@@ -960,3 +1419,95 @@ and runtime for AI-assisted coding.")
|
||||
(description "Glycin is a sandbox image decoder for image viewers and
|
||||
thumbnails to display untrusted content safely.")
|
||||
(license (list license:mpl2.0 license:lgpl2.1+))))
|
||||
|
||||
;; Workspace dependency of zed.
|
||||
;;
|
||||
;; Cargo side: Cargo unifies dependency versions across zed's
|
||||
;; workspace, including this package's transitive dependencies,
|
||||
;; and records them in zed's Cargo.lock.
|
||||
;;
|
||||
;; Guix side: zed's cargo-inputs entry (generated from zed's
|
||||
;; Cargo.lock) already contains all of this package's transitive
|
||||
;; dependencies, so this package reuses zed's cargo-inputs.
|
||||
(define-public rust-zed-xim-0.4.0-zed.16f35a2
|
||||
(hidden-package
|
||||
(package
|
||||
(name "rust-zed-xim")
|
||||
(version "0.4.0-zed")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri
|
||||
(git-reference
|
||||
(url "https://github.com/zed-industries/xim-rs.git")
|
||||
(commit "16f35a2c881b815a2b6cdfd6687988e84f8447d8")))
|
||||
(file-name
|
||||
(git-file-name "rust-zed-xim" "0.4.0-zed.16f35a2"))
|
||||
(sha256
|
||||
(base32 "14cyxxdgjpbkf8ny4c46cfqjinavi2cyxzwfngldlls97m5zh555"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:skip-build? #t
|
||||
#:install-source? #t
|
||||
#:cargo-package-crates ''("xim-ctext"
|
||||
"xim-parser"
|
||||
"zed-xim")
|
||||
#:cargo-package-flags ''("--no-metadata" "--no-verify"
|
||||
"--exclude-lockfile")
|
||||
#:phases
|
||||
#~(modify-phases %standard-phases
|
||||
(replace 'package
|
||||
(lambda* (#:key source (cargo-package-crates '())
|
||||
(cargo-package-flags '("--no-metadata" "--no-verify"))
|
||||
(vendor-dir "guix-vendor")
|
||||
#:allow-other-keys)
|
||||
(use-modules (ice-9 ftw))
|
||||
;; Same as the standard package phase, but deletes
|
||||
;; cargo's target/package/tmp-crate/ scratch directory
|
||||
;; between the packaging loop and the repacking step.
|
||||
(when (file-exists? "Cargo.toml.orig")
|
||||
(delete-file "Cargo.toml.orig"))
|
||||
(for-each
|
||||
(lambda (pkg)
|
||||
(apply invoke "cargo" "package" "--offline"
|
||||
"--package" pkg cargo-package-flags)
|
||||
(for-each
|
||||
(lambda (crate)
|
||||
(invoke "tar" "xzf" crate "-C" vendor-dir))
|
||||
(find-files "target/package" "\\.crate$"))
|
||||
((assoc-ref %standard-phases 'patch-cargo-checksums)
|
||||
#:vendor-dir vendor-dir))
|
||||
cargo-package-crates)
|
||||
(when (file-exists? "target/package/tmp-crate")
|
||||
(delete-file-recursively "target/package/tmp-crate"))
|
||||
(with-directory-excursion "target/package"
|
||||
(for-each
|
||||
(lambda (crate)
|
||||
(invoke "tar" "xf" crate)
|
||||
(delete-file crate)
|
||||
(let ((dir
|
||||
(car (scandir
|
||||
"."
|
||||
(lambda (file)
|
||||
(and (not (member file '("." "..")))
|
||||
(not (string-suffix?
|
||||
".crate" file))))))))
|
||||
(for-each
|
||||
(lambda (file)
|
||||
(let ((s (lstat file)))
|
||||
(unless (eq? (stat:type s) 'symlink)
|
||||
(utime file 0 0 0 0))))
|
||||
(find-files dir #:directories? #t))
|
||||
(apply invoke "tar" "czf"
|
||||
(string-append dir ".crate")
|
||||
"--sort=name" "--mtime=@0"
|
||||
"--owner=root:0" "--group=root:0"
|
||||
(find-files dir #:directories? #t))
|
||||
(delete-file-recursively dir)))
|
||||
(find-files "." "\\.crate$"))))))))
|
||||
(inputs (cargo-inputs 'rust-zed-xim-0.4.0-zed.16f35a2))
|
||||
(home-page "https://github.com/XDeme1/xim-rs")
|
||||
(synopsis "X input method client and server")
|
||||
(description
|
||||
"This package provides a library for @code{xim}, the X input method.")
|
||||
(license license:expat))))
|
||||
|
||||
@@ -893,7 +893,7 @@ A @code{andglob} program is also provided along with s.")
|
||||
(define-public oksh
|
||||
(package
|
||||
(name "oksh")
|
||||
(version "7.5")
|
||||
(version "7.8")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
@@ -902,7 +902,7 @@ A @code{andglob} program is also provided along with s.")
|
||||
version "/oksh-" version ".tar.gz"))
|
||||
(sha256
|
||||
(base32
|
||||
"0pgdxvy8jgydsyzk7vcc93pm09bihqvrn3i35gz1ncg9z31rbf20"))))
|
||||
"0l59x9mm6nbixcpz3zf3iplqili2gyw8l382rj89b0iv32hxac1v"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
`(#:tests? #f ; there are no tests available
|
||||
|
||||
@@ -46,19 +46,11 @@
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "17iqvqs7w3z5c4acnjc6mixqkqz4rff2c7flfpnlwgfjgqy1a2zw"))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
;; XXX: Keep just some portion with valulable data and no license
|
||||
;; issues.
|
||||
#~(begin
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
(delete-all-but "."
|
||||
"allsky"
|
||||
"coordinates"
|
||||
|
||||
@@ -1465,12 +1465,12 @@ inference for statistical models.")
|
||||
"|"))))))))
|
||||
(native-inputs
|
||||
(list bison
|
||||
dvisvgm
|
||||
flex
|
||||
python-numpydoc
|
||||
python-sphinx
|
||||
;; python-sphinx-gallery ;; Currently broken
|
||||
swig-4.0))
|
||||
swig-4.0
|
||||
texlive-dvisvgm))
|
||||
(inputs
|
||||
(list openblas ; the only required dependency
|
||||
;; The dependencies below are all optional.
|
||||
|
||||
+1
-40
@@ -77776,46 +77776,7 @@ documents. It makes writing LaTeX comfortable by providing features such as
|
||||
syntax-highlighting, an integrated viewer and reference checking.")
|
||||
(license license:gpl3)))
|
||||
|
||||
(define-public dvisvgm
|
||||
(package
|
||||
(name "dvisvgm")
|
||||
(version "3.0.3")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/mgieseki/dvisvgm")
|
||||
(commit version)))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"11r401yqbw61n1mwsfk5qmwx2c92djwpl0q756qkds5kh25l9ci8"))))
|
||||
(native-inputs (list pkg-config
|
||||
autoconf
|
||||
autoconf-archive
|
||||
automake
|
||||
python-wrapper
|
||||
libtool))
|
||||
(inputs (list texlive-libkpathsea
|
||||
freetype
|
||||
fontforge
|
||||
clipper
|
||||
ghostscript
|
||||
xxhash
|
||||
brotli
|
||||
woff2
|
||||
zlib))
|
||||
(build-system gnu-build-system)
|
||||
(synopsis "Command-line utility for generating SVG from DVI, EPS and PDF
|
||||
files")
|
||||
(description
|
||||
"Dvisvgm converts TeX DVI, EPS and PDF files into an
|
||||
SVG (Scalable Vector Graphics) image. It provides full font support including
|
||||
virtual fonts, font maps and sub-fonts. The embedded SVG fonts can optionally
|
||||
be replaced with graphics paths for applications that do not support SVG
|
||||
fonts. Dvisvgm supports also colors, emTeX, tpic, papersize, PDF mapfile
|
||||
and PostScript specials. A working TeX installation is needed.")
|
||||
(home-page "https://dvisvgm.de/")
|
||||
(license license:gpl3+)))
|
||||
(define-deprecated-package dvisvgm texlive-dvisvgm) ;14/04/26
|
||||
|
||||
(define-public teximpatient
|
||||
;; The homepage seems to be distributing this version which is currently the
|
||||
|
||||
@@ -121,6 +121,7 @@
|
||||
#:use-module (gnu packages pcre)
|
||||
#:use-module (gnu packages perl)
|
||||
#:use-module (gnu packages pkg-config)
|
||||
#:use-module (gnu packages protobuf)
|
||||
#:use-module (gnu packages python)
|
||||
#:use-module (gnu packages python-build)
|
||||
#:use-module (gnu packages python-web)
|
||||
@@ -133,7 +134,10 @@
|
||||
#:use-module (gnu packages sqlite)
|
||||
#:use-module (gnu packages terminals)
|
||||
#:use-module (gnu packages texinfo)
|
||||
#:use-module (gnu packages tls)
|
||||
#:use-module (gnu packages version-control)
|
||||
#:use-module (gnu packages vulkan)
|
||||
#:use-module (gnu packages xdisorg)
|
||||
#:use-module (gnu packages xml)
|
||||
#:use-module (gnu packages xorg))
|
||||
|
||||
@@ -2018,3 +2022,171 @@ with full unicode support and antialiased text rendering.")
|
||||
syntax highlighting, customizable color scheme (including support for 24-bit true
|
||||
colours), kitty keyboard protocol, editorconfig support, amongst other features.")
|
||||
(license license:gpl2)))
|
||||
|
||||
(define-public zed
|
||||
(package
|
||||
(name "zed")
|
||||
(version "0.225.10")
|
||||
(outputs '("out" ; editor, cli, icons, desktop file
|
||||
"remote" ; zed-remote-server for remote development
|
||||
"server" ; collab server daemon
|
||||
"tools")) ; extension_cli
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/zed-industries/zed")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1d6zr88s4nj4fw01gw908aw2mqgjj25baj4gx7qnm6rsbxqrp500"))
|
||||
(patches
|
||||
(search-patches "zed-0.225.10-add-message-notification-action.patch"
|
||||
"zed-0.225.10-add-guix-container-support.patch"
|
||||
"zed-0.225.10-collapse-multiline-git-deps.patch"
|
||||
"zed-0.225.10-disable-dlopen.patch"
|
||||
"zed-0.225.10-exclude-libwebrtc-from-audio.patch"
|
||||
"zed-0.225.10-fix-sqlite-memory-mode.patch"
|
||||
"zed-0.225.10-fix-test-db-isolation.patch"
|
||||
"zed-0.225.10-fix-workspace-race.patch"
|
||||
"zed-0.225.10-keep-regular-file-workspaces.patch"
|
||||
"zed-0.225.10-remove-patch-crates-io.patch"
|
||||
"zed-0.225.10-use-mock-livekit-on-linux.patch"))))
|
||||
(build-system cargo-build-system)
|
||||
(arguments
|
||||
(list #:install-source? #f
|
||||
#:cargo-build-flags ''("--release" "-p" "zed")
|
||||
;; Not installed:
|
||||
;; auto_update_helper - Windows-only (empty main on Linux)
|
||||
;; eval - internal AI agent benchmarking tool
|
||||
;; edit_prediction_cli - internal edit prediction training pipeline
|
||||
;; storybook - GPUI component viewer for Zed UI development
|
||||
;; docs_preprocessor - mdbook preprocessor for Zed's docs website
|
||||
;; zed_visual_test_runner - visual regression tests, macOS-only
|
||||
#:cargo-install-paths ''("crates/zed"
|
||||
"crates/cli" ; opens files in running Zed
|
||||
;;; Install remote_server via its own cargo invocation
|
||||
;;; to avoid feature unification with the zed build.
|
||||
"crates/remote_server" ; installs as zed-remote-server
|
||||
"crates/collab" ; self-hostable collaboration server
|
||||
"crates/extension_cli") ; builds extensions from source
|
||||
#:phases
|
||||
#~(modify-phases %standard-phases
|
||||
(add-after 'install 'install-extras
|
||||
(lambda* (#:key outputs #:allow-other-keys)
|
||||
(let* ((out (assoc-ref outputs "out"))
|
||||
(bin (string-append out "/bin"))
|
||||
(libexec (string-append out "/libexec"))
|
||||
(icons512 (string-append out "/share/icons/hicolor/512x512/apps"))
|
||||
(icons1024 (string-append out "/share/icons/hicolor/1024x1024/apps"))
|
||||
(apps (string-append out "/share/applications"))
|
||||
(remote-bin (string-append (assoc-ref outputs "remote") "/bin"))
|
||||
(server-bin (string-append (assoc-ref outputs "server") "/bin"))
|
||||
(tools-bin (string-append (assoc-ref outputs "tools") "/bin")))
|
||||
;;; The cli binary is the user-facing launcher that finds
|
||||
;;; and delegates to zed-editor via ../libexec/zed-editor.
|
||||
(mkdir-p libexec)
|
||||
(rename-file (string-append bin "/zed")
|
||||
(string-append libexec "/zed-editor"))
|
||||
(rename-file (string-append bin "/cli")
|
||||
(string-append bin "/zed"))
|
||||
;;; Move remote_server to "remote" output as zed-remote-server.
|
||||
(mkdir-p remote-bin)
|
||||
(rename-file (string-append bin "/remote_server")
|
||||
(string-append remote-bin "/zed-remote-server"))
|
||||
;;; Move collab to "server" output.
|
||||
(mkdir-p server-bin)
|
||||
(rename-file (string-append bin "/collab")
|
||||
(string-append server-bin "/collab"))
|
||||
(rename-file (string-append bin "/dotenv")
|
||||
(string-append server-bin "/dotenv"))
|
||||
;;; Move zed-extension to "tools" output.
|
||||
(mkdir-p tools-bin)
|
||||
(rename-file (string-append bin "/zed-extension")
|
||||
(string-append tools-bin "/zed-extension"))
|
||||
;;; Icons.
|
||||
(mkdir-p icons512)
|
||||
(mkdir-p icons1024)
|
||||
(copy-file "crates/zed/resources/app-icon.png"
|
||||
(string-append icons512 "/zed.png"))
|
||||
(copy-file "crates/zed/resources/app-icon@2x.png"
|
||||
(string-append icons1024 "/zed.png"))
|
||||
;;; Desktop file.
|
||||
(mkdir-p apps)
|
||||
(copy-file "crates/zed/resources/zed.desktop.in"
|
||||
(string-append apps "/dev.zed.Zed.desktop"))
|
||||
(substitute* (string-append apps "/dev.zed.Zed.desktop")
|
||||
(("\\$APP_NAME") "Zed")
|
||||
(("\\$APP_CLI") "zed")
|
||||
(("\\$APP_ARGS") "%U")
|
||||
(("\\$APP_ICON") "zed")
|
||||
(("\\$DO_STARTUP_NOTIFY") "true")))))
|
||||
(add-after 'unpack 'set-env
|
||||
(lambda _
|
||||
(setenv "LIBGIT2_NO_VENDOR" "1")
|
||||
(setenv "LIBSQLITE3_SYS_USE_PKG_CONFIG" "1")))
|
||||
(add-after 'set-env 'patch-git-deps
|
||||
(lambda _
|
||||
;; All multi-line entries are collapsed to single
|
||||
;; lines by the patch. reqwest and scap already
|
||||
;; carry version fields; just strip the git source.
|
||||
(substitute* "Cargo.toml"
|
||||
(("(reqwest = \\{) git = \"[^\"]+\", rev = \"[^\"]+\", " _ prefix)
|
||||
(string-append prefix " "))
|
||||
(("(scap = \\{) git = \"[^\"]+\", rev = \"[^\"]+\", " _ prefix)
|
||||
(string-append prefix " ")))
|
||||
;; Replace all remaining git fields with version = "*"
|
||||
;; and strip rev/branch.
|
||||
(substitute* "Cargo.toml"
|
||||
(("git = \"https://[^\"]+\"")
|
||||
"version = \"*\"")
|
||||
((", rev = \"[^\"]+\"") "")
|
||||
((", branch = \"[^\"]+\"") ""))
|
||||
;; Sub-crate Cargo.toml files also have git deps.
|
||||
(for-each
|
||||
(lambda (file)
|
||||
;; rev-before-git deps: replace pair with version = "*".
|
||||
(substitute* file
|
||||
(("rev = \"[^\"]+\", git = \"[^\"]+\"")
|
||||
"version = \"*\""))
|
||||
;; git-before-rev deps that already carry a version
|
||||
;; field: strip git+rev, keep everything else.
|
||||
(substitute* file
|
||||
(("git = \"[^\"]+\" *, rev = \"[^\"]+\" *, ") "")
|
||||
((", git *= *\"[^\"]+\"") "")
|
||||
((", branch = \"[^\"]+\"") "")))
|
||||
(find-files "crates" "^Cargo\\.toml$"))
|
||||
;; nvim-rs has no version field; add one.
|
||||
(substitute* "crates/vim/Cargo.toml"
|
||||
(("(nvim-rs = \\{) " _ prefix)
|
||||
(string-append prefix " version = \"*\", "))))))))
|
||||
(native-inputs (list cmake-minimal pkg-config protobuf))
|
||||
(inputs
|
||||
(cons* alsa-lib
|
||||
bzip2
|
||||
dbus
|
||||
fontconfig
|
||||
freetype
|
||||
libgit2-1.9
|
||||
libx11
|
||||
libxcb
|
||||
libxkbcommon
|
||||
openssl
|
||||
sqlite
|
||||
vulkan-loader
|
||||
wayland
|
||||
wayland-protocols
|
||||
xcb-util-cursor
|
||||
zlib
|
||||
(list zstd "lib")
|
||||
(cargo-inputs 'zed)))
|
||||
(home-page "https://zed.dev")
|
||||
(synopsis "High-performance, multiplayer code editor")
|
||||
(description
|
||||
"Zed is a high-performance, multiplayer code editor written in Rust.
|
||||
|
||||
Note: This build disables WebRTC (libwebrtc) support because libwebrtc is
|
||||
not yet packaged in Guix. As a result, voice and video calls in collaborative
|
||||
sessions are not available. Text-based collaboration, editing, and all other
|
||||
features work normally.")
|
||||
(license license:gpl3+)))
|
||||
|
||||
@@ -191,7 +191,7 @@ libenca and several charset conversion libraries and tools.")
|
||||
(hidden-package
|
||||
(package
|
||||
(name "utf8proc-bootstrap")
|
||||
(version "2.10.0")
|
||||
(version "2.11.3")
|
||||
(source
|
||||
(origin
|
||||
(method git-fetch)
|
||||
@@ -200,7 +200,7 @@ libenca and several charset conversion libraries and tools.")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32 "1n1k67x39sk8xnza4w1xkbgbvgb1g7w2a7j2qrqzqaw1lyilqsy2"))))
|
||||
(base32 "1ssix4zf3lac1afzlw2gbfg3n52gmggip8lv224gywqf3zyvyp8c"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
(list #:tests? #f ;To break dependency cycle.
|
||||
@@ -223,7 +223,7 @@ case-folding, and other operations for data in the UTF-8 encoding.")
|
||||
(inherit utf8proc-bootstrap)
|
||||
(name "utf8proc")
|
||||
(native-inputs
|
||||
(let ((UNICODE_VERSION "16.0.0")) ; defined in data/Makefile
|
||||
(let ((UNICODE_VERSION "17.0.0")) ; defined in data/Makefile
|
||||
;; Only if the tests will be run should these be added.
|
||||
(if (and (%current-system)
|
||||
(supported-package? julia))
|
||||
@@ -235,7 +235,7 @@ case-folding, and other operations for data in the UTF-8 encoding.")
|
||||
UNICODE_VERSION "/ucd/NormalizationTest.txt"))
|
||||
(sha256
|
||||
(base32
|
||||
"1cffwlxgn6sawxb627xqaw3shnnfxq0v7cbgsld5w1z7aca9f4fq")))
|
||||
"1nw7i89q42r0plwlc8qj6qm18brk23hc0jf800cp86km63azy6ah")))
|
||||
(origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
@@ -243,7 +243,7 @@ case-folding, and other operations for data in the UTF-8 encoding.")
|
||||
UNICODE_VERSION "/ucd/auxiliary/GraphemeBreakTest.txt"))
|
||||
(sha256
|
||||
(base32
|
||||
"1d9w6vdfxakjpp38qjvhgvbl2qx0zv5655ph54dhdb3hs9a96azf")))
|
||||
"1v4k2x52bzwgqxw89hdf3wdgwm8q3ianmfrya37bl699qp939lg2")))
|
||||
(origin
|
||||
(method url-fetch)
|
||||
(uri (string-append
|
||||
@@ -251,7 +251,7 @@ case-folding, and other operations for data in the UTF-8 encoding.")
|
||||
UNICODE_VERSION "/ucd/DerivedCoreProperties.txt"))
|
||||
(sha256
|
||||
(base32
|
||||
"1gfsq4vdmzi803i2s8ih7mm4fgs907kvkg88kvv9fi4my9hm3lrr")))
|
||||
"021clafsjmjblsxcszp0dpxy2phwhbmyghfmxym2yj2w378zxir4")))
|
||||
;; For tests.
|
||||
julia
|
||||
perl
|
||||
|
||||
+25
-27
@@ -1469,10 +1469,10 @@ designed to encode video or images into an H.265 / HEVC encoded bitstream.")
|
||||
(native-inputs
|
||||
(list pkg-config nasm))
|
||||
(propagated-inputs
|
||||
`(("freetype" ,freetype)
|
||||
("fribidi" ,fribidi)
|
||||
("fontconfig" ,fontconfig)
|
||||
("harfbuzz" ,harfbuzz)))
|
||||
(list freetype
|
||||
fribidi
|
||||
fontconfig
|
||||
harfbuzz))
|
||||
(home-page "https://github.com/libass/libass")
|
||||
(synopsis "Subtitle rendering library for the ASS/SSA format")
|
||||
(description "libass is a subtitle rendering library for the
|
||||
@@ -5194,14 +5194,14 @@ specifications.")
|
||||
(define-public libaacs
|
||||
(package
|
||||
(name "libaacs")
|
||||
(version "0.11.0")
|
||||
(version "0.11.1")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "https://ftp.videolan.org/pub/videolan/libaacs/"
|
||||
version "/libaacs-" version ".tar.bz2"))
|
||||
(sha256
|
||||
(base32 "11skjqjlldmbjkyxdcz4fmcn6y4p95r1xagbcnjy4ndnzf0l723d"))))
|
||||
(base32 "0f8ax9dp49mrm1484bl2df659b34xyrjmngzmvvpg2n9wkms12m8"))))
|
||||
(inputs
|
||||
(list libgcrypt))
|
||||
(native-inputs
|
||||
@@ -6250,32 +6250,30 @@ spec for MP4), which can be obtained from the ISO or found online.")
|
||||
(license license:expat)))
|
||||
|
||||
(define-public vidstab
|
||||
(let ((commit "aeabc8daa7904f9edf7441a11f293965a5ef53b8")
|
||||
(revision "0"))
|
||||
(package
|
||||
(name "vidstab")
|
||||
(version (git-version "1.1.0" revision commit))
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/georgmartius/vid.stab")
|
||||
(commit commit)))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"042iy0f3khwzr68djzvqgn301sy21ljvkf52rnc2c73q7ircnzzn"))))
|
||||
(build-system cmake-build-system)
|
||||
(arguments
|
||||
'(#:tests? #f)) ; tests are not run as part of standard build process
|
||||
(home-page "http://public.hronopik.de/vid.stab/")
|
||||
(synopsis "Video stabilization library")
|
||||
(description "Vidstab is a video stabilization library which can be used
|
||||
(package
|
||||
(name "vidstab")
|
||||
(version "1.1.1")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
(url "https://github.com/georgmartius/vid.stab")
|
||||
(commit (string-append "v" version))))
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"19k822bwsnw58ikbfh4fhh97zpn89ji9k1gdvh9r2ljy82g52md7"))))
|
||||
(build-system cmake-build-system)
|
||||
(arguments
|
||||
'(#:tests? #f)) ; tests are not run as part of standard build process
|
||||
(home-page "http://public.hronopik.de/vid.stab/")
|
||||
(synopsis "Video stabilization library")
|
||||
(description "Vidstab is a video stabilization library which can be used
|
||||
with FFmpeg. A video acquired using a hand-held camera or a camera mounted on a
|
||||
vehicle typically suffers from undesirable shakes and jitters. Activities such
|
||||
as surfing, skiing, riding and walking while shooting videos are especially
|
||||
prone to erratic camera shakes. Vidstab targets these video contents to help
|
||||
create smoother and stable videos.")
|
||||
(license license:gpl2+))))
|
||||
(license license:gpl2+)))
|
||||
|
||||
(define-public libopenshot
|
||||
(package
|
||||
|
||||
@@ -2560,7 +2560,7 @@ Open Container Initiative (OCI) image layout and its tagged images.")
|
||||
(define-public skopeo
|
||||
(package
|
||||
(name "skopeo")
|
||||
(version "1.22.1")
|
||||
(version "1.22.2")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
(uri (git-reference
|
||||
@@ -2569,7 +2569,7 @@ Open Container Initiative (OCI) image layout and its tagged images.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"0h32h02dvh6dx587idqi11938k293kawvd4d3xk5hwdi6cmpabri"))))
|
||||
"05ag8rj2w6p78llhiwb2h460nf0vn7mppaara6l1dcb84sycj8jg"))))
|
||||
(build-system gnu-build-system)
|
||||
(native-inputs
|
||||
(list go-1.24
|
||||
|
||||
@@ -183,9 +183,7 @@ RDP, VNC, SPICE, NX, XDMCP, SSH and EXEC network protocols are supported.")
|
||||
(uri (git-reference
|
||||
(url "https://github.com/TurboVNC/turbovnc")
|
||||
(commit version)))
|
||||
(modules '((guix build utils)
|
||||
(ice-9 ftw)
|
||||
(srfi srfi-26)))
|
||||
(modules '((guix build utils)))
|
||||
(snippet
|
||||
#~(begin
|
||||
;; There are a few bundled Java libraries, such as jsch and jzlib,
|
||||
@@ -193,12 +191,6 @@ RDP, VNC, SPICE, NX, XDMCP, SSH and EXEC network protocols are supported.")
|
||||
;; bundled under java/org. These are used by the 'vncviewer'
|
||||
;; program. The jsch copy is modified and integrates changes from
|
||||
;; https://github.com/mwiede/jsch, so cannot easily be un-bundled.
|
||||
(define (delete-all-but directory . preserve)
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <>
|
||||
(cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
|
||||
;; d3des, rfb (headers) and turbojpeg-jni are small and not
|
||||
;; packaged in Guix, so preserve them.
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
;;; Copyright © 2025 Remco van 't Veer <remco@remworks.net>"
|
||||
;;; Copyright © 2025 Daniel Khodabakhsh <d@niel.khodabakh.sh>
|
||||
;;; Copyright © 2025 Josep Bigorra <jjbigorra@gmail.com>
|
||||
;;; Copyright © 2025 Ashish SHUKLA <ashish.is@lostca.se>
|
||||
;;; Copyright © 2025, 2026 Ashish SHUKLA <ashish.is@lostca.se>
|
||||
;;; Copyright © 2025 Philippe Swartvagher <phil.swart@gmx.fr>
|
||||
;;; Copyright © 2025 pinoaffe <pinoaffe@gmail.com>
|
||||
;;; Copyright © 2025, 2026 gemmaro <gemmaro.dev@gmail.com>
|
||||
@@ -1472,7 +1472,7 @@ used to train large language models, and poisoning the collected data.")
|
||||
(define-public jansson
|
||||
(package
|
||||
(name "jansson")
|
||||
(version "2.14")
|
||||
(version "2.15.0")
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "https://github.com/akheron/jansson"
|
||||
@@ -1480,7 +1480,7 @@ used to train large language models, and poisoning the collected data.")
|
||||
"/jansson-" version ".tar.bz2"))
|
||||
(sha256
|
||||
(base32
|
||||
"1fdgji964mrrz19glx0zh91asji542fvybymvzk6rrbagkr5dagv"))))
|
||||
"0m49glsr5v376jpyj2y0xyr11703pr4bfgipz5jk2dq0a1vcgsm7"))))
|
||||
(build-system gnu-build-system)
|
||||
(arguments
|
||||
(list
|
||||
@@ -9041,7 +9041,7 @@ derivation by David Revoy from the original MonsterID by Andreas Gohr.")
|
||||
(define-public nghttp2
|
||||
(package
|
||||
(name "nghttp2")
|
||||
(version "1.58.0")
|
||||
(version "1.68.1")
|
||||
(source
|
||||
(origin
|
||||
(method url-fetch)
|
||||
@@ -9050,7 +9050,7 @@ derivation by David Revoy from the original MonsterID by Andreas Gohr.")
|
||||
"nghttp2-" version ".tar.xz"))
|
||||
(sha256
|
||||
(base32
|
||||
"1q4ps8acr7nyia7mf2z11m0yh3fn1imhyv855j3xjbx91l2a6s2a"))))
|
||||
"1cph2j688zxxxl3944g5grjma15qbv4b6z252ichsn7ilyq7mgba"))))
|
||||
(build-system gnu-build-system)
|
||||
(outputs (list "out"
|
||||
"lib")) ; only libnghttp2
|
||||
|
||||
@@ -3863,7 +3863,7 @@ using @command{dmenu}.")
|
||||
(define-public fuzzel
|
||||
(package
|
||||
(name "fuzzel")
|
||||
(version "1.14.0")
|
||||
(version "1.14.1")
|
||||
(home-page "https://codeberg.org/dnkl/fuzzel")
|
||||
(source (origin
|
||||
(method git-fetch)
|
||||
@@ -3871,7 +3871,7 @@ using @command{dmenu}.")
|
||||
(file-name (git-file-name name version))
|
||||
(sha256
|
||||
(base32
|
||||
"1fx1y430iwdjzba1rb6m56k3phvjn8di5v7d6rnxdqvm30085vpl"))))
|
||||
"1bk49fq66a0fr9danpj7vnq3dcfmrw1hdcc2ygqkld9z5lv1h5an"))))
|
||||
(build-system meson-build-system)
|
||||
(arguments
|
||||
(list #:build-type "release"
|
||||
|
||||
@@ -1480,8 +1480,7 @@ treat it as part of their software base when porting.")
|
||||
(inputs
|
||||
(list libxt xorgproto libxext))
|
||||
(native-inputs
|
||||
`(("gettext" ,gettext-minimal)
|
||||
("pkg-config" ,pkg-config)))
|
||||
(list gettext-minimal pkg-config))
|
||||
(home-page "https://www.x.org/wiki/")
|
||||
(synopsis "Xorg XPM library")
|
||||
(description "XPM (X Pixmap) image file format library.")
|
||||
|
||||
@@ -77,6 +77,7 @@
|
||||
make-file-writable
|
||||
copy-recursively
|
||||
delete-file-recursively
|
||||
delete-all-but
|
||||
file-name-predicate
|
||||
find-files
|
||||
false-if-file-not-found
|
||||
@@ -522,6 +523,14 @@ errors."
|
||||
;; Don't follow symlinks.
|
||||
lstat)))
|
||||
|
||||
(define (delete-all-but directory . preserve)
|
||||
"Delete DIRECTORY recursively except for the files in PRESERVE immediately
|
||||
found under it."
|
||||
(with-directory-excursion directory
|
||||
(let* ((pred (negate (cut member <> (cons* "." ".." preserve))))
|
||||
(items (scandir "." pred)))
|
||||
(for-each (cut delete-file-recursively <>) items))))
|
||||
|
||||
(define (file-name-predicate regexp)
|
||||
"Return a predicate that returns true when passed a file name whose base
|
||||
name matches REGEXP."
|
||||
|
||||
Reference in New Issue
Block a user