fix: tricks.fish double-source and paru/yay wrapper duplication #136

Merged
rootiest merged 3 commits from fix/tricks-double-source-and-paru-wrapper-dedup into main 2026-09-08 05:31:53 +00:00
2 changed files with 45 additions and 65 deletions
Showing only changes of commit 23bf649c5f - Show all commits
+19 -65
View File
@@ -28,84 +28,38 @@ function __fish_config_sync_logging --description 'Sync C5 logging state: sentin
set config_home "$HOME/.config"
end
set -l sentinel "$config_home/fish/.logging_disabled"
set -l paru_wrapper "$HOME/.local/bin/paru"
set -l yay_wrapper "$HOME/.local/bin/yay"
set -l wrapper_version 1
if __fish_config_op_enabled (status current-function)
# Logging enabled: remove sentinel and regenerate wrappers if binaries exist
# Logging enabled: remove sentinel
rm -f $sentinel
# Restart tmux pipe-pane for the current pane if inside tmux
_tmux_pipe_log
if test -x /usr/bin/paru
mkdir -p (dirname $paru_wrapper)
printf '%s\n' \
'#!/usr/bin/env bash' \
"# paru-wrapper-version: $wrapper_version" \
'# Auto-generated by conf.d/paru-wrapper.fish — do not edit by hand.' \
'# Tees paru output to a timestamped log file and prunes old ones.' \
'set -o pipefail' \
'' \
'log_dir="${SCROLLBACK_HISTORY_DIR:-$HOME/.terminal_history}"' \
'mkdir -p "$log_dir"' \
'log_file="$log_dir/paru_$(date +%Y-%m-%d_%H-%M-%S).log"' \
'' \
'/usr/bin/paru "$@" 2>&1 | tee "$log_file"' \
'' \
'max_files="${SCROLLBACK_HISTORY_MAX_FILES:-100}"' \
'mapfile -t logs < <(ls -1t "$log_dir"/paru_*.log 2>/dev/null)' \
'excess=$(( ${#logs[@]} - max_files ))' \
'for (( i = ${#logs[@]} - 1; i >= ${#logs[@]} - excess && i >= 0; i-- )); do' \
' rm -f "${logs[$i]}"' \
'done' \
>$paru_wrapper
chmod +x $paru_wrapper
end
if test -x /usr/bin/yay
mkdir -p (dirname $yay_wrapper)
printf '%s\n' \
'#!/usr/bin/env bash' \
"# yay-wrapper-version: $wrapper_version" \
'# Auto-generated by conf.d/yay-wrapper.fish — do not edit by hand.' \
'# Tees yay output to a timestamped log file and prunes old ones.' \
'set -o pipefail' \
'' \
'log_dir="${SCROLLBACK_HISTORY_DIR:-$HOME/.terminal_history}"' \
'mkdir -p "$log_dir"' \
'log_file="$log_dir/yay_$(date +%Y-%m-%d_%H-%M-%S).log"' \
'' \
'/usr/bin/yay "$@" 2>&1 | tee "$log_file"' \
'' \
'max_files="${SCROLLBACK_HISTORY_MAX_FILES:-100}"' \
'mapfile -t logs < <(ls -1t "$log_dir"/yay_*.log 2>/dev/null)' \
'excess=$(( ${#logs[@]} - max_files ))' \
'for (( i = ${#logs[@]} - 1; i >= ${#logs[@]} - excess && i >= 0; i-- )); do' \
' rm -f "${logs[$i]}"' \
'done' \
>$yay_wrapper
chmod +x $yay_wrapper
end
else
# Logging disabled: create sentinel and remove any generated wrappers
# Logging disabled: create sentinel
mkdir -p (dirname $sentinel)
touch $sentinel
if test -f $paru_wrapper
and grep -q "# paru-wrapper-version:" $paru_wrapper 2>/dev/null
rm -f $paru_wrapper
end
if test -f $yay_wrapper
and grep -q "# yay-wrapper-version:" $yay_wrapper 2>/dev/null
rm -f $yay_wrapper
end
# Stop tmux pipe-pane for the current pane if inside tmux
if set -q TMUX
tmux pipe-pane 2>/dev/null
end
end
# Delegate paru/yay wrapper (re)generation and removal to the canonical
# generators. They resolve the real binary via __fish_real_command
# (never /usr/bin-assumed) and independently gate on their own C2/C5
# keys, so sourcing them here covers both the enabled-regenerate and
# disabled-remove cases without duplicating that logic. Previously this
# function carried its own inferior copy (tee instead of a PTY, no
# progress-bar rendering, hard-coded /usr/bin/paru|yay), which fought
# the canonical generator for the wrapper file on every version-marker
# mismatch. See startup-latency-JOB-BRIEF-FINDINGS.md §2.
#
# Routed through _fish_source_scoped: both files `return` early on
# several guard checks, and a sourced `return` exits the *calling*
# function, which would otherwise abort this function and skip
# whichever of paru/yay hadn't run yet.
_fish_source_scoped "$__fish_config_dir/conf.d/paru-wrapper.fish"
_fish_source_scoped "$__fish_config_dir/conf.d/yay-wrapper.fish"
end
+26
View File
@@ -0,0 +1,26 @@
# Copyright (C) 2026 Rootiest
# SPDX-License-Identifier: AGPL-3.0-or-later
# SYNOPSIS
# _fish_source_scoped <file>
#
# DESCRIPTION
# Sources <file> inside its own function-call boundary. `source` runs
# in the caller's own scope, so a bare `return` in a sourced file --
# used by several conf.d guards as an early exit -- would otherwise
# unwind whatever function called `source` directly, not just the
# sourced file. Calling through this helper contains it to here.
#
# ARGUMENTS
# file Path to the fish script to source
#
# EXIT STATUS
# 0 File does not exist (nothing to do)
# Exit status of the sourced file otherwise
#
# EXAMPLE
# _fish_source_scoped $__fish_config_dir/conf.d/paru-wrapper.fish
function _fish_source_scoped --argument-names file
test -f $file; or return 0
source $file
end