Package: release.debian.org
Severity: normal
Tags: trixie
X-Debbugs-Cc: [email protected]
Control: affects -1 + src:cinnamon
User: [email protected]
Usertags: pu

[ Reason ]
Downloading and updating Cinnamon Spices (applets, desklets, extensions and
themes) from cinnamon-settings is broken in trixie. It is not a regression
introduced in Debian: the Spices server stopped sending a content-length
header, and Spices.py assumed it was always present, so
int(response.headers.get('content-length')) raises TypeError and every
download fails. This affects all users of the Spices download/update feature
in trixie, and it cannot be fixed by the user (except manually editing the
code).

[ Impact ]
Without the update, installing or updating any applet, desklet, extension or
theme from the Spices site keeps failing in trixie for as long as the server
does not send the header, with no workaround available in the GUI.

[ Tests ]
The package has no automated test coverage for this code path, so the fix was
verified by hand in a clean trixie VM running the full Cinnamon desktop from
the archive. With cinnamon 6.4.10-2 the failure reproduces: downloading or
updating a spice from cinnamon-settings fails. After installing the proposed
packages, built with sbuild in a trixie chroot, downloading and updating
spices completes normally, with the progress bar pulsing while the size is
unknown; nothing else in cinnamon-settings changed behaviour.

The same fix is in unstable since 6.6.9-1 (#1142724, closed on 2026-07-24) and
has been shipped by upstream in its 5.4.x to 6.6.x point releases.

[ Risks ]
Low. It is a small change to a single Python file, taken verbatim from
upstream: it is the 6.4-maintenance cherry-pick, so it applies to 6.4.10 as-is
and is part of upstream 6.4.14. It is limited to the Spices download code
path, where it treats a missing content-length as an unknown size (pulsing
progress bar instead of a fraction) and replaces the assert response.ok with
response.raise_for_status(). Nothing outside cinnamon-settings' Spices
downloader is touched.

[ Checklist ]
  [x] *all* changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in stable
  [x] the issue is verified as fixed in unstable

[ Changes ]
d/patches: added 
upstream/Spices.py-Gracefully-handle-a-missing-content-length-head.patch,
a verbatim cherry-pick of upstream commit 360f021e2 (branch 6.4-maintenance,
released in 6.4.14):

  - _url_retrieve(): content-length is read into a variable and, when
    absent, the total size is set to -1 instead of crashing in int(None);
    assert response.ok becomes response.raise_for_status()
  - _update_progress(): with a total size of -1 the progress bar pulses
    (new _set_progressbar_pulse()) instead of computing a fraction from an
    unknown total

The debdiff also shows the branch-keeping changes, with no functional effect:
Vcs-Git and debian/gbp.conf now point at the debian/trixie branch, and
debian/salsa-ci.yml sets RELEASE: trixie.

[ Other info ]
The breakage comes from a server-side change, so it hits users of the current
trixie package right now and will keep doing so until the fix is available. If
you consider it suitable for trixie-updates, that would get it to users
sooner; otherwise the next point release is fine.
diff -Nru cinnamon-6.4.10/debian/changelog cinnamon-6.4.10/debian/changelog
--- cinnamon-6.4.10/debian/changelog    2025-07-06 22:10:27.000000000 +0200
+++ cinnamon-6.4.10/debian/changelog    2026-08-08 13:43:06.000000000 +0200
@@ -1,3 +1,12 @@
+cinnamon (6.4.10-2+deb13u1) trixie; urgency=medium
+
+  * d/patches: add upstream patch to gracefully handle a missing
+    content-length header during downloads, fixing download and update
+    of spices (applets, desklets, extensions and themes), broken by a
+    server-side change (Closes: #1142724)
+
+ -- Fabio Fantoni <[email protected]>  Sat, 08 Aug 2026 13:43:06 +0200
+
 cinnamon (6.4.10-2) unstable; urgency=medium
 
   * d/control: add gnome-icon-theme to cinnamon depends (Closes: #1106195)
diff -Nru cinnamon-6.4.10/debian/control cinnamon-6.4.10/debian/control
--- cinnamon-6.4.10/debian/control      2025-07-06 22:10:27.000000000 +0200
+++ cinnamon-6.4.10/debian/control      2026-08-08 13:43:06.000000000 +0200
@@ -43,7 +43,7 @@
 Rules-Requires-Root: no
 Homepage: https://github.com/linuxmint/cinnamon
 Vcs-Browser: https://salsa.debian.org/cinnamon-team/cinnamon
-Vcs-Git: https://salsa.debian.org/cinnamon-team/cinnamon.git
+Vcs-Git: https://salsa.debian.org/cinnamon-team/cinnamon.git -b debian/trixie
 
 Package: cinnamon
 Architecture: any
diff -Nru cinnamon-6.4.10/debian/gbp.conf cinnamon-6.4.10/debian/gbp.conf
--- cinnamon-6.4.10/debian/gbp.conf     2025-07-06 22:10:27.000000000 +0200
+++ cinnamon-6.4.10/debian/gbp.conf     2026-08-08 13:43:06.000000000 +0200
@@ -1,6 +1,6 @@
 [DEFAULT]
 # DEP-14 format
-debian-branch = debian/latest
+debian-branch = debian/trixie
 upstream-branch = upstream/latest
 
 # Always use pristine tar
diff -Nru cinnamon-6.4.10/debian/patches/series 
cinnamon-6.4.10/debian/patches/series
--- cinnamon-6.4.10/debian/patches/series       2025-07-06 22:10:27.000000000 
+0200
+++ cinnamon-6.4.10/debian/patches/series       2026-08-08 13:43:06.000000000 
+0200
@@ -3,3 +3,4 @@
 new-iso-flags-folder.patch
 change-upload-system-info-path.patch
 upstream/Move-sass-compilation-to-its-own-custom-target-so-it-show.patch
+upstream/Spices.py-Gracefully-handle-a-missing-content-length-head.patch
diff -Nru 
cinnamon-6.4.10/debian/patches/upstream/Spices.py-Gracefully-handle-a-missing-content-length-head.patch
 
cinnamon-6.4.10/debian/patches/upstream/Spices.py-Gracefully-handle-a-missing-content-length-head.patch
--- 
cinnamon-6.4.10/debian/patches/upstream/Spices.py-Gracefully-handle-a-missing-content-length-head.patch
     1970-01-01 01:00:00.000000000 +0100
+++ 
cinnamon-6.4.10/debian/patches/upstream/Spices.py-Gracefully-handle-a-missing-content-length-head.patch
     2026-08-08 13:43:06.000000000 +0200
@@ -0,0 +1,57 @@
+From: Michael Webster <[email protected]>
+Date: Sun, 19 Jul 2026 09:07:13 -0400
+Subject: Spices.py: Gracefully handle a missing content-length header during
+ downloads.
+
+ref: #13868.
+
+Origin: upstream, 
https://github.com/linuxmint/cinnamon/commit/360f021e2abcdc93520ecd895453316064a84bb6
+Applied-Upstream: 6.4.14
+Bug-Debian: https://bugs.debian.org/1142724
+---
+ files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py 
b/files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py
+index a00c300..8258eec 100644
+--- a/files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py
++++ b/files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py
+@@ -315,6 +315,10 @@ class Spice_Harvester(GObject.Object):
+         if self.window:
+             self.window.set_progress(int(fraction*100))
+ 
++    def _set_progressbar_pulse(self):
++        for progressbar in self.progressbars:
++            progressbar.pulse()
++
+     def _set_progressbar_visible(self, visible):
+         for progressbar in self.progressbars:
+             progressbar.revealer.set_reveal_child(visible)
+@@ -327,10 +331,12 @@ class Spice_Harvester(GObject.Object):
+             fraction = float(current) / float(total)
+             text = _("Downloading images:") + f" {current}/{total}"
+             self._set_progressbar_text(text)
++            self._set_progressbar_fraction(fraction)
++        elif totalSize == -1:
++            self._set_progressbar_pulse()
+         else:
+             fraction = count * blockSize / float((totalSize / blockSize + 1) 
* blockSize)
+-
+-        self._set_progressbar_fraction(fraction)
++            self._set_progressbar_fraction(fraction)
+ 
+         while Gtk.events_pending():
+             Gtk.main_iteration()
+@@ -418,9 +424,10 @@ class Spice_Harvester(GObject.Object):
+ 
+         try:
+             response = requests.get(url, proxies=proxy_info, stream=True, 
timeout=15)
+-            assert response.ok
++            response.raise_for_status()
+ 
+-            totalSize = int(response.headers.get('content-length'))
++            content_length = response.headers.get('content-length')
++            totalSize = int(content_length) if content_length else -1
+ 
+             for data in response.iter_content(chunk_size=blockSize):
+                 count += 1
diff -Nru cinnamon-6.4.10/debian/salsa-ci.yml 
cinnamon-6.4.10/debian/salsa-ci.yml
--- cinnamon-6.4.10/debian/salsa-ci.yml 2025-07-06 22:10:27.000000000 +0200
+++ cinnamon-6.4.10/debian/salsa-ci.yml 2026-08-08 13:43:06.000000000 +0200
@@ -2,5 +2,6 @@
   - 
https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
 
 variables:
+  RELEASE: trixie
   SALSA_CI_DISABLE_MISSING_BREAKS: 0
   SALSA_CI_DISABLE_RC_BUGS: 0

Reply via email to