# slosh — Homebrew formula (a *formula*, not a cask: casks are for prebuilt # .app/.pkg/.dmg drops, formulae are for things brew builds and puts in bin). # # This file is the source of truth. `contrib/brew-release` rewrites the three # stanzas below (url/version/sha256) for a new commit or tag and copies the # result into the tap repo, which is what users actually tap: # # brew tap sl0p-foo/slosh # brew install slosh # # Try it without publishing anything: # # brew install --build-from-source contrib/homebrew/slosh.rb class Slosh < Formula desc "Terminal multiplexer with detachable sessions and programmable pane chrome" homepage "https://sl0p.foo" # GitHub's archive of a commit is deterministic per ref: same ref, same # bytes, so the sha256 below stays honest. Pinned to a full commit id rather # than a branch, because a branch tarball changes under you and brew would # keep the stale one. url "https://github.com/sl0p-foo/slosh/archive/c861d1d0fb80d6cc50d34565362767609580b0bd.tar.gz" version "0.1.8" sha256 "a40bf0af3f1a144b89de6143b3e2f4869ecd397c4704a02b93950d5e2c40b8fb" head "https://github.com/sl0p-foo/slosh.git", branch: "master" # zig is the whole toolchain: it compiles the C, builds the vendored # libghostty-vt, and links it statically. Nothing is needed at runtime, which # is why there is no `depends_on` without `=> :build`. # # Pinned to an exact minor, not plain "zig": the vendored libghostty-vt # rejects any mismatched major/minor outright (see src/build/zig.zig's # requireZig), so when homebrew-core moved "zig" to 0.17.0 every install # broke with "Your Zig version v0.17.0 does not meet the required build # version of v0.16.0". The pin has to be bumped in lockstep with # vendor/libghostty-vt.vendor.json's built_with_zig whenever we re-vendor. depends_on "zig@0.16" => :build def install # zig caches in ~/.cache/zig and ~/.zig-cache by default. Under brew that is # either a sandbox denial or pollution of the user's real cache, so both # caches go into the build directory and die with it. ENV["ZIG_GLOBAL_CACHE_DIR"] = buildpath/".zig-global-cache" ENV["ZIG_LOCAL_CACHE_DIR"] = buildpath/".zig-local-cache" # The pinned keg is keg-only, so it is deliberately absent from PATH and # from /opt/homebrew/opt/zig. Name it explicitly or the build picks up # whatever "zig" happens to be linked. args = ["ZIG=#{formula_opt_bin("zig@0.16")}/zig"] # In a snapshot tarball there is no .git, so the Makefile's `git describe` # would bake in "unknown" and `slosh --version` could not tell you which # build you are looking at. Hand it the commit the tarball came from. args << "GITDESC=#{version.to_s.split("-").last}" unless build.head? system "make", "vendor", *args system "make", "all", *args # Deliberately not `make install`: the formula must be able to build any # commit, including ones older than that target, and the layout is three # lines here. `make install PREFIX=...` exists for everyone not using brew # and puts the same files in the same places. bin.install "build/slosh" # Guarded because the formula must be able to build any commit, including # ones older than the manpages. man1.install "docs/slosh.1" if File.exist?("docs/slosh.1") man5.install "docs/slosh.5" if File.exist?("docs/slosh.5") pkgshare.install "config/config.kdl", "config/example.layout" %w[themes chrome shaders].each do |d| pkgshare.install Dir["contrib/#{d}"] if File.directory?("contrib/#{d}") end doc.install "README.md" doc.install Dir["docs/*.md"] end def caveats <<~EOS Example configuration, themes, chrome and shaders are installed in: #{opt_share}/slosh Start from the shipped config: mkdir -p ~/.config/slosh && cp #{opt_share}/slosh/config.kdl ~/.config/slosh/ Then: slosh (attach to session "main", creating it if needed) C-a ? (the keys) C-a p (every command by name) EOS end test do # The binary knows its own version, and it is the version brew installed. # Derived from `version`, never hardcoded: a literal goes stale at the next # release and fails a build that is otherwise perfectly good. out = shell_output("#{bin}/slosh --version") assert_match(/^slosh \S+/, out) # A HEAD build reports `git describe`, which is not the formula version. assert_match "slosh #{version}", out unless build.head? # The configuration we ship must parse with the binary we ship. assert_match "ok", shell_output("#{bin}/slosh --check #{share}/slosh/config.kdl") # And it composes a real screen headlessly: no tty, no session, no socket. # This exercises the vendored terminal core, the layout and the renderer. screen = shell_output("#{bin}/slosh --headless --cols 40 --rows 12 -- " \ "/bin/sh -c 'echo hello-brew'") assert_match "hello-brew", screen assert_match "pane 1/1", screen end end