packages: fix the three packaging failures, none of which were the build

Run 31394740824 compiled all 27 components on all three distributions --
two and a half hours each -- staged them, passed the completeness
assertions, and then failed in the packaging step on every one. Three
separate causes, none of them the desktop.

desktop-file-validate rejects DesktopNames (fedora, arch)

    hyprcosmic.desktop: error: file contains key "DesktopNames" in group
    "Desktop Entry", but keys extending the format should start with "X-"

DesktopNames is the key a display manager reads to set
XDG_CURRENT_DESKTOP, so a session entry needs it, but the Desktop Entry
Specification registers keys for application launchers and the validator
has no entry for it. This is not something the fork introduced:
cosmic.desktop is upstream cosmic-session's file, unchanged apart from the
Exec path, and the copy already installed on this machine as
cosmic-session-1.5.0-1.fc44 fails the identical check. Dropping the key
would satisfy the validator and break the session.

So the validation moves out of the three packaging recipes into one step
against the staged tree, and checks what desktop-file-validate would not
have caught anyway: that Exec is absolute and names an executable this
package actually installs. A wrong Exec puts an entry on the greeter's
menu that dies silently when it is chosen, which is the failure that
matters here; a key the validator has not heard of is not.

The check was run against a staged tree built from the real desktop files
before committing: it passes clean, and it rejects an Exec naming a binary
that is not in the tree, an Exec that exists but is not executable, a
relative Exec, a missing DesktopNames, a missing Name, a missing [Desktop
Entry] header and Type=Link, each with a message saying which file and
what.

SIGPIPE under pipefail (debian, and arch next)

    dpkg-deb: error: tar subprocess was killed by signal (Broken pipe)

The Debian package built: 217 MB, correct control, Depends computed by
dpkg-shlibdeps across 17 libraries. It failed on `dpkg-deb --contents
dist/*.deb | head -20` in the verify step -- head closes the pipe after
twenty lines, dpkg-deb dies of SIGPIPE, and Actions runs these steps with
pipefail. Both now write to a file and head the file. The Arch verify step
had the same line waiting for it and is fixed in the same way.

bogus date in %changelog (fedora)

10 August 2026 is a Monday.

Also: the PKGBUILD still pointed at tools/make-packages.sh, which was
deleted when packaging moved to Actions. It now names the two commands
that stage a tree and build from it by hand.
This commit is contained in:
2026-08-10 23:23:35 +07:00
parent 7df465ef26
commit 5f521529a8
3 changed files with 80 additions and 15 deletions
+53 -2
View File
@@ -251,6 +251,47 @@ jobs:
test ! -e stage/usr/libexec/hyprcosmic
echo "staged files: $(find stage -type f | wc -l)"
# Checked here, once, rather than in each of the three packaging recipes,
# and not with desktop-file-validate.
#
# desktop-file-validate rejects DesktopNames -- "keys extending the format
# should start with X-" -- because the Desktop Entry Specification
# registers keys for application launchers, and these are session files.
# DesktopNames is what a display manager reads to set XDG_CURRENT_DESKTOP,
# so the session needs it. cosmic.desktop is upstream cosmic-session's
# file, unchanged here apart from the Exec path, and the copy Fedora ships
# as cosmic-session-1.5.0-1.fc44 fails the identical check: the validator
# has no entry for the key, and every distribution ships the file anyway.
#
# What the validator would not have caught is the failure that actually
# matters: an Exec naming a binary this package does not install puts an
# entry on the greeter's menu that dies silently when chosen. So that is
# what is checked, against the tree about to be packaged.
- name: Check the session entries
run: |
set -eu
for f in stage/usr/share/wayland-sessions/*.desktop; do
echo "== $f"
cat "$f"
test "$(sed -n 1p "$f")" = '[Desktop Entry]' || {
echo "$f: first line is not [Desktop Entry]" >&2; exit 1; }
for key in Name Type Exec DesktopNames; do
grep -q "^${key}=" "$f" || { echo "$f: no $key=" >&2; exit 1; }
done
grep -qx 'Type=Application' "$f" || {
echo "$f: Type is not Application; a greeter will ignore it" >&2; exit 1; }
exec_path=$(sed -n '0,/^Exec=/s/^Exec=//p' "$f" | cut -d' ' -f1)
case $exec_path in
/*) ;;
*) echo "$f: Exec=$exec_path is not absolute" >&2; exit 1 ;;
esac
test -x "stage${exec_path}" || {
echo "$f: Exec=$exec_path is not an executable this package installs" >&2
exit 1
}
echo " Exec -> stage${exec_path} ok"
done
# ---- Fedora -------------------------------------------------------
#
# The file list is generated rather than written into the spec. Across 27
@@ -325,7 +366,11 @@ jobs:
# dependencies without touching the filesystem, and this image is not
# a desktop, so a real install would fail on runtime libraries that
# say nothing about whether the package is well formed.
pacman -Qlp dist/*.pkg.tar.zst | head -20
# To a file and then head: `| head` would kill pacman with SIGPIPE
# once head has its 20 lines, and these steps run with pipefail.
pacman -Qlp dist/*.pkg.tar.zst > contents.txt
echo "entries: $(wc -l < contents.txt)"
head -20 contents.txt
# ---- Debian -------------------------------------------------------
#
@@ -364,7 +409,13 @@ jobs:
run: |
set -eux
dpkg-deb --info dist/*.deb
dpkg-deb --contents dist/*.deb | head -20
# To a file and then head, not `| head`. Actions runs these steps with
# pipefail, and head closing the pipe after 20 lines kills dpkg-deb
# with SIGPIPE, which pipefail reports as a failed step -- a green
# 217 MB package failed here on nothing but that.
dpkg-deb --contents dist/*.deb > contents.txt
echo "entries: $(wc -l < contents.txt)"
head -20 contents.txt
# lintian is not installed and would fail this package on a dozen
# policy points that do not apply to a desktop fork shipped outside
# the archive. What matters here is that dpkg can read it back.
+15 -7
View File
@@ -45,16 +45,24 @@ provides=("cosmic-comp=$pkgver" "cosmic-session=$pkgver")
options=('!strip' '!debug')
package() {
# Set by make-packages.sh. Failing loudly here beats producing an empty
# package, which is what a bare `cp -a "$unset/."` would do.
# Points at a tree `just install` has already staged. Failing loudly here
# beats producing an empty package, which is what a bare `cp -a "$unset/."`
# would do. The workflow sets it; by hand it is
# just install "$PWD/stage" /usr
# HYPRCOSMIC_STAGEDIR="$PWD/stage" makepkg --nodeps
if [ -z "$HYPRCOSMIC_STAGEDIR" ] || [ ! -d "$HYPRCOSMIC_STAGEDIR/usr" ]; then
echo "HYPRCOSMIC_STAGEDIR unset or has no usr/; see tools/make-packages.sh" >&2
echo "HYPRCOSMIC_STAGEDIR unset or has no usr/; see .github/workflows/packages.yml" >&2
return 1
fi
cp -a "$HYPRCOSMIC_STAGEDIR/." "$pkgdir/"
# The two files a broken install shows up in first: a bad Exec line puts an
# entry on the greeter's menu that fails silently when it is chosen.
desktop-file-validate "$pkgdir/usr/share/wayland-sessions/hyprcosmic.desktop"
desktop-file-validate "$pkgdir/usr/share/wayland-sessions/cosmic.desktop"
# No desktop-file-validate on the session entries. It rejects DesktopNames,
# the key a display manager reads to set XDG_CURRENT_DESKTOP, because the
# Desktop Entry Specification registers keys for application launchers and
# these are session files. cosmic.desktop here is upstream cosmic-session's,
# unchanged by this fork apart from the Exec path, and the copy Fedora ships
# as cosmic-session-1.5.0-1.fc44 fails the identical check -- so this is the
# validator's gap, not something the fork introduced. The workflow
# checks what actually matters instead -- that Exec names a file this
# package installs -- against the staged tree, before makepkg sees it.
}
+12 -6
View File
@@ -106,11 +106,17 @@ test -n "%{stagedir}" || { echo "define stagedir: see .github/workflows/packages
test -d "%{stagedir}/usr" || { echo "%{stagedir}/usr missing; run just install first" >&2; exit 1; }
cp -a "%{stagedir}/." "%{buildroot}/"
# The desktop entries are the two files a broken install shows up in first, so
# they are validated rather than assumed. A .desktop with a bad Exec line puts
# an entry on the greeter's menu that fails silently when chosen.
desktop-file-validate "%{buildroot}%{_datadir}/wayland-sessions/hyprcosmic.desktop"
desktop-file-validate "%{buildroot}%{_datadir}/wayland-sessions/cosmic.desktop"
# The session entries are checked by the workflow against the staged tree, not
# with desktop-file-validate here. desktop-file-validate rejects DesktopNames,
# the key a display manager reads to set XDG_CURRENT_DESKTOP, because the
# Desktop Entry Specification registers keys for application launchers and this
# is a session file. cosmic.desktop here is upstream cosmic-session's, unchanged
# by this fork apart from the Exec path, and the copy Fedora already ships as
# cosmic-session-1.5.0-1.fc44 fails the identical check -- so this is the
# validator's gap, not something the fork introduced. Dropping the key would
# satisfy the validator and break the session.
# See "Check the session entries" in .github/workflows/packages.yml, which
# tests what actually matters: that Exec names a file this package installs.
# Generated by the workflow from the staged tree rather than written out here.
# A hand-maintained list across 27 components would be wrong within a week, and
@@ -119,5 +125,5 @@ desktop-file-validate "%{buildroot}%{_datadir}/wayland-sessions/cosmic.desktop"
%files -f %{filelist}
%changelog
* Sun Aug 10 2026 dingo <[email protected]> - 0.1.0-1
* Mon Aug 10 2026 dingo <[email protected]> - 0.1.0-1
- First package of the fork: COSMIC replaced as a unit, HyDE shell, cosmic-conf.