#!/bin/bash # pm_dnf.sh - DNF package manager implementation for Fedora/RHEL systems # Package name mappings for dnf declare -A DNF_PACKAGE_NAMES=( ["vala"]="vala" ["meson"]="meson" ["ninja"]="ninja-build" ["git"]="git" ["pkgconfig"]="pkgconf-pkg-config" ["gcc"]="gcc" ["glib"]="glib2-devel" ["libsodium"]="libsodium-devel" ["gtk"]="gtk3-devel" ) # Check if a package is installed via dnf/rpm pm_is_installed() { local pkg="$1" rpm -q "$pkg" &>/dev/null } # Get the dnf package name for a generic dependency pm_get_package_name() { local dep="$1" if [[ -n "${DNF_PACKAGE_NAMES[$dep]}" ]]; then echo "${DNF_PACKAGE_NAMES[$dep]}" else echo "$dep" fi } # Update dnf cache pm_update() { local sudo=$(get_sudo) if [[ -n "$sudo" ]]; then $sudo dnf makecache -q 2>/dev/null || $sudo dnf clean metadata else dnf makecache -q 2>/dev/null || dnf clean metadata fi } # Install packages via dnf pm_install() { local -a pkgs=("$@") local sudo=$(get_sudo) local dnf_opts="-y --quiet" if [[ "$ASSUME_YES" == "true" ]]; then dnf_opts="-y --quiet --skip-broken" fi log_step "Installing packages via dnf: ${pkgs[*]}" if [[ -n "$sudo" ]]; then $sudo dnf install $dnf_opts "${pkgs[@]}" else dnf install $dnf_opts "${pkgs[@]}" fi } # Get list of missing dependencies (dnf-specific override) get_missing_deps() { local -a missing=() local deps=("vala" "meson" "ninja" "git" "pkgconfig" "gcc" "glib" "libsodium") for dep in "${deps[@]}"; do local pkg_name=$(pm_get_package_name "$dep") if ! pm_is_installed "$pkg_name"; then missing+=("$pkg_name") fi done echo "${missing[@]}" }