From e2a32f0cdd581159bd962a3a25df9d14defc6c96 Mon Sep 17 00:00:00 2001 From: Peder Bergebakken Sundt Date: Sun, 1 Mar 2026 20:58:26 +0100 Subject: [PATCH] pulsar: use finalAttrs, simplify update script --- pkgs/by-name/pu/pulsar/package.nix | 53 +++++++++------ pkgs/by-name/pu/pulsar/update.mjs | 106 ----------------------------- 2 files changed, 33 insertions(+), 126 deletions(-) delete mode 100755 pkgs/by-name/pu/pulsar/update.mjs diff --git a/pkgs/by-name/pu/pulsar/package.nix b/pkgs/by-name/pu/pulsar/package.nix index 502315589fa8..e2fcacc10542 100644 --- a/pkgs/by-name/pu/pulsar/package.nix +++ b/pkgs/by-name/pu/pulsar/package.nix @@ -1,6 +1,10 @@ { lib, stdenv, + writeShellScript, + nix-update, + curl, + jq, git, git-lfs, fetchurl, @@ -43,17 +47,6 @@ }: let - pname = "pulsar"; - version = "1.131.1"; - - sourcesPath = - { - x86_64-linux.tarname = "Linux.${pname}-${version}.tar.gz"; - x86_64-linux.hash = "sha256-Is+KAnPuHUrj87KFTjB/v/LMDflq4LbX3VP8Cv7/CNQ="; - aarch64-linux.tarname = "ARM.Linux.${pname}-${version}-arm64.tar.gz"; - aarch64-linux.hash = "sha256-P2ZBV9Al6xw347yUs3BOWnwJGWegRh52oygLFgjoBcw="; - } - .${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); newLibpath = lib.makeLibraryPath [ alsa-lib @@ -91,16 +84,27 @@ let hunspellCopyCommands = lib.concatMapStringsSep "\n" ( lang: "cp -r ${lang}/* ${hunspellTargetDirs};" ) hunspellDirs; + in -stdenv.mkDerivation { - inherit pname version; + +stdenv.mkDerivation (finalAttrs: { + pname = "pulsar"; + version = "1.131.1"; src = - with sourcesPath; - fetchurl { - url = "https://github.com/pulsar-edit/pulsar/releases/download/v${version}/${tarname}"; - inherit hash; + finalAttrs.passthru.srcs.${stdenv.hostPlatform.system} + or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); + + passthru.srcs = { + x86_64-linux = fetchurl { + url = "https://github.com/pulsar-edit/pulsar/releases/download/v${finalAttrs.version}/Linux.pulsar-${finalAttrs.version}.tar.gz"; + hash = "sha256-Is+KAnPuHUrj87KFTjB/v/LMDflq4LbX3VP8Cv7/CNQ="; }; + aarch64-linux = fetchurl { + url = "https://github.com/pulsar-edit/pulsar/releases/download/v${finalAttrs.version}/ARM.Linux.pulsar-${finalAttrs.version}-arm64.tar.gz"; + hash = "sha256-P2ZBV9Al6xw347yUs3BOWnwJGWegRh52oygLFgjoBcw="; + }; + }; # strip leading `.` from $0. # for .pulsar.sh-wrapped to correctly set ATOM_BASE_NAME @@ -253,7 +257,16 @@ stdenv.mkDerivation { }) ]; - passthru.updateScript = ./update.mjs; + passthru.updateScript = writeShellScript "update-pulsar" '' + set -euo pipefail + PATH="${lib.getBin curl}:$PATH" + PATH="${lib.getBin jq}:$PATH" + PATH="${lib.getBin coreutils}:$PATH" + PATH="${lib.getBin nix-update}:$PATH" + version="$(curl https://api.github.com/repos/pulsar-edit/pulsar/releases/latest | jq ".tag_name" -r | tr -d 'v')" + nix-update pkgsCross.gnu64.pulsar --version "$version" + nix-update pkgsCross.aarch64-multiplatform.pulsar --version skip + ''; meta = { description = "Community-led Hyper-Hackable Text Editor"; @@ -262,7 +275,7 @@ stdenv.mkDerivation { Designed to be deeply customizable, but still approachable using the default configuration. ''; homepage = "https://github.com/pulsar-edit/pulsar"; - changelog = "https://github.com/pulsar-edit/pulsar/blob/v${version}/CHANGELOG.md"; + changelog = "https://github.com/pulsar-edit/pulsar/blob/v${finalAttrs.version}/CHANGELOG.md"; sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; license = lib.licenses.mit; platforms = lib.platforms.linux; @@ -274,4 +287,4 @@ stdenv.mkDerivation { # a bump is expected (pulsar v1.131.0 bumped electron 12.2.3 -> 30.0.9 in february 2026) knownVulnerabilities = [ "Electron version 30 is EOL" ]; }; -} +}) diff --git a/pkgs/by-name/pu/pulsar/update.mjs b/pkgs/by-name/pu/pulsar/update.mjs deleted file mode 100755 index 215092faab02..000000000000 --- a/pkgs/by-name/pu/pulsar/update.mjs +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env nix-shell -/* -#!nix-shell -i node -p nodejs -*/ - -import { promises as fs } from 'node:fs'; - -const constants = { - githubUrl: "https://api.github.com/repos/pulsar-edit/pulsar/releases", - sha256FileURL: (newVersion) => `https://github.com/pulsar-edit/pulsar/releases/download/v${newVersion}/SHA256SUMS.txt`, - x86_64FileName: (newVersion) => `Linux.pulsar-${newVersion}.tar.gz`, - aarch64FileName: (newVersion) => `ARM.Linux.pulsar-${newVersion}-arm64.tar.gz`, - targetFile: new URL("package.nix", import.meta.url).pathname, -}; - -async function utf16ToUtf8(blob) { - // Sometime, upstream saves the SHA256SUMS.txt file in UTF-16, which absolutely breaks node's string handling - // So we need to convert this blob to UTF-8 - - // We need to skip the first 2 bytes, which are the BOM - const arrayBuffer = await blob.slice(2).arrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - const utf8String = buffer.toString('utf16le'); - return utf8String; -} - -async function getLatestVersion() { - const requestResult = await fetch(constants.githubUrl); - if (!requestResult.ok) { - console.error("Failed to fetch releases"); - console.error(requestResult); - process.exit(1); - }; - let jsonResult = await requestResult.json(); - - jsonResult = jsonResult.filter((release) => !release.prerelease && !release.draft); - if (jsonResult.length == 0) { - console.error("No releases found"); - process.exit(1); - } - - return jsonResult[0].tag_name.replace(/^v/, ''); -} - -async function getSha256Sum(hashFileContent, targetFile) { - // The upstream file has a fomat like this: - // 0000000000000000000000000000000000000000000000000000000000000000 targetFile - - let sha256 = hashFileContent. - split('\n'). - map(line => line.replace("\r", "")). // Side-effect of the UTF-16 conversion, if the file was created from Windows - filter((line) => line.endsWith(targetFile))[0]. - split(' ')[0]; - - return "sha256-" + Buffer.from(sha256, 'hex').toString('base64'); -} - -async function getSha256Sums(newVersion) { - // Upstream provides a file with the hashes of the files, but it's not in the SRI format, and it refers to the compressed tarball - // So let's just use nix-prefetch-url to get the hashes of the decompressed tarball, and `nix hash to-sri` to convert them to SRI format - const hashFileUrl = constants.sha256FileURL(newVersion); - const hashFileContent = await fetch(hashFileUrl).then((response) => response.blob()); - const headerbuffer = await hashFileContent.slice(0, 2).arrayBuffer() - const header = Buffer.from(headerbuffer).toString('hex'); - - // We must detect if it's UTF-16 or UTF-8. If it's UTF-16, we must convert it to UTF-8, otherwise just use it as-is - const hashFileContentString = header == 'fffe' ? - await utf16ToUtf8(hashFileContent) : - await hashFileContent.text(); - - let x86_64; - let aarch64; - console.log("Getting new hashes"); - let promises = [ - getSha256Sum(hashFileContentString, constants.x86_64FileName(newVersion)).then((hash) => { x86_64 = hash; }), - getSha256Sum(hashFileContentString, constants.aarch64FileName(newVersion)).then((hash) => { aarch64 = hash; }), - ]; - await Promise.all(promises); - return { x86_64, aarch64 }; -} - -async function updateFile(newVersion, sha256Sums, currentFile) { - // There is some assumptions in how the file is formatted, but nothing egregious - - let newFile = currentFile.replace(/version = "(.*)";/, `version = "${newVersion}";`); - newFile = newFile.replace(/x86_64-linux\.hash = "(.*)";/, `x86_64-linux.hash = "${sha256Sums.x86_64}";`); - newFile = newFile.replace(/aarch64-linux\.hash = "(.*)";/, `aarch64-linux.hash = "${sha256Sums.aarch64}";`); - - await fs.writeFile(constants.targetFile, newFile); -}; - -let currentFile = await fs.readFile(constants.targetFile, 'utf8'); -let currentVersion = currentFile.match(/version = "(.*)";/)[1]; -const newVersion = await getLatestVersion(); -if (currentVersion === newVersion) { - console.error("Already up to date"); - process.exit(0); -} -console.log("New version: " + newVersion); -const sha256Sums = await getSha256Sums(newVersion); -console.log(sha256Sums) -if (!sha256Sums.x86_64 || !sha256Sums.aarch64) { - console.error("Failed to find sha256 sums for the 2 files"); - process.exit(1); -} -updateFile(newVersion, sha256Sums, currentFile);