yaziPlugins: add updateScript

Checks if the packaged yazi version supports the plugin's required
version before updating derivation.

Co-authored-by: LazilyStableProton <LazilyStable@proton.me>
This commit is contained in:
Austin Horstman
2025-04-09 20:15:34 -05:00
co-authored by LazilyStableProton
parent ce9b2ffcea
commit 2de042325d
2 changed files with 157 additions and 0 deletions
+16
View File
@@ -2,9 +2,11 @@
lib,
callPackage,
stdenvNoCC,
writeShellScript,
}:
let
root = ./.;
updateScript = ./update.sh;
mkYaziPlugin =
args@{
@@ -14,6 +16,10 @@ let
installPhase ? null,
...
}:
let
# Extract the plugin name from pname (removing .yazi suffix if present)
pluginName = lib.removeSuffix ".yazi" pname;
in
stdenvNoCC.mkDerivation (
args
// {
@@ -45,6 +51,16 @@ let
description = meta.description or "";
platforms = meta.platforms or lib.platforms.all;
};
passthru = (args.passthru or { }) // {
updateScript = {
command = writeShellScript "update-${pluginName}" ''
export PLUGIN_NAME="${pluginName}"
export PLUGIN_PNAME="${pname}"
exec ${updateScript}
'';
supportedFeatures = [ "commit" ];
};
};
}
);
+141
View File
@@ -0,0 +1,141 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p bash curl coreutils jq git
set -e
# Basic setup and validation
NIXPKGS_DIR="$PWD"
if [ "${PLUGIN_NAME:-}" = "" ] || [ "${PLUGIN_PNAME:-}" = "" ]; then
echo "Error: PLUGIN_NAME and PLUGIN_PNAME environment variables must be set"
exit 1
fi
PLUGIN_DIR="$NIXPKGS_DIR/pkgs/by-name/ya/yazi/plugins/$PLUGIN_NAME"
if [ ! -f "$PLUGIN_DIR/default.nix" ]; then
echo "Error: Could not find default.nix for plugin $PLUGIN_NAME at $PLUGIN_DIR"
exit 1
fi
GITHUB_HEADER=(-H "Accept: application/vnd.github.v3+json")
if [ "${GITHUB_TOKEN:-}" != "" ]; then
GITHUB_HEADER+=(-H "Authorization: token $GITHUB_TOKEN")
fi
# Get repository info and Yazi version
OWNER=$(nix eval --raw -f "$NIXPKGS_DIR" yaziPlugins."$PLUGIN_NAME".src.owner)
REPO=$(nix eval --raw -f "$NIXPKGS_DIR" yaziPlugins."$PLUGIN_NAME".src.repo)
YAZI_VERSION=$(nix eval --raw -f "$NIXPKGS_DIR" yazi-unwrapped.version)
# Check plugin compatibility with current Yazi version
PLUGIN_PATH="$([[ $OWNER == "yazi-rs" ]] && echo "$PLUGIN_PNAME/" || echo "")"
MAIN_LUA_URL="https://raw.githubusercontent.com/$OWNER/$REPO/main/${PLUGIN_PATH}main.lua"
PLUGIN_CONTENT=$(curl --silent "${GITHUB_HEADER[@]}" "$MAIN_LUA_URL")
REQUIRED_VERSION=$(echo "$PLUGIN_CONTENT" | head -n 1 | grep -o "since [0-9.]*" | sed 's/since \([0-9.]*\)/\1/')
# If no version requirement is found, default to "0"
if [ "$REQUIRED_VERSION" = "" ]; then
echo "No version requirement found for $PLUGIN_NAME, assuming compatible with any Yazi version"
REQUIRED_VERSION="0"
else
# Check if the plugin is compatible with current Yazi version
if ! printf "%s\n%s\n" "$REQUIRED_VERSION" "$YAZI_VERSION" | sort -C -V; then
echo "$PLUGIN_NAME plugin requires Yazi $REQUIRED_VERSION, but we have $YAZI_VERSION"
exit 0
fi
fi
# Get latest commit info
if [ "$OWNER" == "yazi-rs" ]; then
# For official plugins, get commit info for the specific plugin file
API_URL="https://api.github.com/repos/$OWNER/$REPO/commits?path=$PLUGIN_PNAME/main.lua&per_page=1"
else
# For third-party plugins, get latest commit on main branch
API_URL="https://api.github.com/repos/$OWNER/$REPO/commits/main"
fi
if [ "$OWNER" == "yazi-rs" ]; then
COMMIT_DATA=$(curl --silent "${GITHUB_HEADER[@]}" "$API_URL")
LATEST_COMMIT=$(echo "$COMMIT_DATA" | jq -r '.[0].sha')
COMMIT_DATE=$(echo "$COMMIT_DATA" | jq -r '.[0].commit.committer.date' | cut -d'T' -f1)
else
COMMIT_DATA=$(curl --silent "${GITHUB_HEADER[@]}" "$API_URL")
LATEST_COMMIT=$(echo "$COMMIT_DATA" | jq -r '.sha')
COMMIT_DATE=$(echo "$COMMIT_DATA" | jq -r '.commit.committer.date' | cut -d'T' -f1)
fi
if [ "$LATEST_COMMIT" = "" ] || [ "$LATEST_COMMIT" == "null" ]; then
echo "Error: Could not get latest commit hash for $PLUGIN_NAME"
exit 1
fi
echo "Updating $PLUGIN_NAME to commit $LATEST_COMMIT ($COMMIT_DATE)"
# Update version and revision
NEW_VERSION="${REQUIRED_VERSION}-unstable-${COMMIT_DATE}"
# Update the revision in default.nix
sed -i "s/rev = \"[^\"]*\"/rev = \"$LATEST_COMMIT\"/" "$PLUGIN_DIR/default.nix"
# Update the version in default.nix
if grep -q 'version = "' "$PLUGIN_DIR/default.nix"; then
sed -i "s/version = \"[^\"]*\"/version = \"$NEW_VERSION\"/" "$PLUGIN_DIR/default.nix"
else
# Add version attribute after pname if it doesn't exist
sed -i "/pname = \"[^\"]*\"/a \ \ version = \"$NEW_VERSION\";" "$PLUGIN_DIR/default.nix"
fi
# Update the hash
# Calculate hash directly for all plugins
PREFETCH_URL="https://github.com/$OWNER/$REPO/archive/$LATEST_COMMIT.tar.gz"
# Get the hash directly in SRI format
NEW_HASH=$(nix-prefetch-url --unpack --type sha256 "$PREFETCH_URL" 2>/dev/null)
# If the hash is not in SRI format, convert it
if [[ ! "$NEW_HASH" =~ ^sha256- ]]; then
# Try to convert the hash to SRI format
NEW_HASH=$(nix hash to-sri --type sha256 "$NEW_HASH" 2>/dev/null)
# If that fails, try another approach
if [[ ! "$NEW_HASH" =~ ^sha256- ]]; then
echo "Warning: Failed to get SRI hash directly, trying alternative method..."
RAW_HASH=$(nix-prefetch-url --type sha256 "$PREFETCH_URL" 2>/dev/null)
NEW_HASH=$(nix hash to-sri --type sha256 "$RAW_HASH" 2>/dev/null)
fi
fi
# Verify we got a valid SRI hash (starts with sha256-)
if [[ ! "$NEW_HASH" =~ ^sha256- ]]; then
echo "Error: Failed to generate valid SRI hash. Output was:"
echo "$NEW_HASH"
exit 1
fi
echo "Generated SRI hash: $NEW_HASH"
# Update hash in default.nix
if grep -q 'hash = "' "$PLUGIN_DIR/default.nix"; then
sed -i "s|hash = \"[^\"]*\"|hash = \"$NEW_HASH\"|" "$PLUGIN_DIR/default.nix"
else
# For files that use fetchFromGitHub, update the hash there
if grep -q 'fetchFromGitHub' "$PLUGIN_DIR/default.nix"; then
sed -i "s|sha256 = \"[^\"]*\"|sha256 = \"$NEW_HASH\"|" "$PLUGIN_DIR/default.nix"
else
echo "Error: Could not find hash attribute in $PLUGIN_DIR/default.nix"
exit 1
fi
fi
# Verify the hash was updated
if grep -q "hash = \"$NEW_HASH\"" "$PLUGIN_DIR/default.nix" || grep -q "sha256 = \"$NEW_HASH\"" "$PLUGIN_DIR/default.nix"; then
echo "Successfully updated hash to: $NEW_HASH"
else
echo "Error: Failed to update hash in $PLUGIN_DIR/default.nix"
exit 1
fi
# Update the revision in default.nix
sed -i "s/rev = \"[^\"]*\"/rev = \"$LATEST_COMMIT\"/" "$PLUGIN_DIR/default.nix"
echo "Successfully updated $PLUGIN_NAME to version $NEW_VERSION (commit $LATEST_COMMIT)"