Add scripts and configuration for building snap package (#25064)

Michael Sloan and Soumyadeep Ghosh created

Release Notes:

- N/A

---------

Co-authored-by: Soumyadeep Ghosh <soumyadeepghosh2004@zohomail.in>

Change summary

.gitignore                                  |  1 
crates/zed/resources/snap/snapcraft.yaml.in | 58 +++++++++++++++++++++++
script/snap-build                           | 27 ++++++++++
script/snap-try                             | 25 +++++++++
4 files changed, 111 insertions(+)

Detailed changes

.gitignore 🔗

@@ -26,6 +26,7 @@
 /dev.zed.Zed*.json
 /plugins/bin
 /script/node_modules
+/snap
 /zed.xcworkspace
 DerivedData/
 Packages

crates/zed/resources/snap/snapcraft.yaml.in 🔗

@@ -0,0 +1,58 @@
+name: zed
+title: Zed
+base: core24
+version: "$RELEASE_VERSION"
+summary: The editor for what's next
+description: |
+  Zed is a modern open-source code editor, built from the ground up in Rust with
+  a GPU-accelerated renderer. We help you build software faster than ever before.
+grade: stable
+confinement: classic
+compression: lzo
+icon: crates/zed/resources/app-icon.png
+website: https://zed.dev/
+source-code: https://github.com/zed-industries/zed
+issues: https://github.com/zed-industries/zed/issues
+contact: https://zed.dev/community-links#support-and-feedback
+
+parts:
+  zed:
+    plugin: dump
+    source: "https://github.com/zed-industries/zed/releases/download/v$RELEASE_VERSION/zed-linux-x86_64.tar.gz"
+
+    organize:
+      # These renames seem to not be necessary, but it's tidier.
+      bin: usr/bin
+      libexec: usr/libexec
+
+    stage-packages:
+      - libasound2t64
+      # snapcraft has a lint that this is unused, but without it Zed exits with
+      # "Missing Vulkan entry points: LibraryLoadFailure" in blade_graphics.
+      - libvulkan1
+      # snapcraft has a lint that this is unused, but without it Zed exits with
+      # "NoWaylandLib" when run with Wayland.
+      - libwayland-client0
+      - libxcb1
+      - libxkbcommon-x11-0
+      - libxkbcommon0
+
+    build-attributes:
+      - enable-patchelf
+
+    prime:
+      # Omit unneeded files from the tarball
+      - -lib
+      - -licenses.md
+      - -share
+
+      # Omit unneeded files from stage-packages
+      - -etc
+      - -usr/share/doc
+      - -usr/share/lintian
+      - -usr/share/man
+
+apps:
+  zed:
+    command: usr/bin/zed
+    common-id: dev.zed.Zed

script/snap-build 🔗

@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+set -euxo pipefail
+
+if [ "$#" -ne 1 ]; then
+  echo "Usage: $0 <release_version>"
+  exit 1
+fi
+
+mkdir -p snap/gui
+
+export DO_STARTUP_NOTIFY="true"
+export APP_NAME="Zed"
+export APP_CLI="zed"
+export APP_ICON="\${SNAP}/meta/gui/zed.png"
+export APP_ARGS="%U"
+envsubst < "crates/zed/resources/zed.desktop.in" > "snap/gui/zed.desktop"
+cp "crates/zed/resources/app-icon.png" "snap/gui/zed.png"
+
+RELEASE_VERSION="$1" envsubst < crates/zed/resources/snap/snapcraft.yaml.in > snap/snapcraft.yaml
+
+# Clean seems to be needed to actually check that the snapcraft.yaml
+# works.  For example, when a `stage-package` is removed, it will
+# still remain on rebuild.
+snapcraft clean
+
+snapcraft

script/snap-try 🔗

@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+# This script is intended to be run after `snap-build`.
+#
+# It expects a version to be passed as the first argument, and expects
+# the built `.snap` for that version to be in the current directory.
+#
+# This will uninstall the current `zed` snap, replacing it with a snap
+# that directly uses the `snap/unpacked` directory.
+
+set -euxo pipefail
+
+if [ "$#" -ne 1 ]; then
+  echo "Usage: $0 <release_version>"
+  exit 1
+fi
+
+# Rerun as root
+[ "$UID" -eq 0 ] || exec sudo bash -e "$0" "$@"
+
+snap remove zed || true
+mkdir -p snap
+rm -rf snap/unpacked
+unsquashfs -dest snap/unpacked "zed_$1_amd64.snap"
+snap try --classic snap/unpacked