+++ title = "mkhint" tagline = "Gestisce gli hint file di slackrepo: aggiorna versioni, ricalcola i checksum, segue i rilasci upstream." status = "active" repo_url = "https://git.danix.xyz/mkhintfile" tags = ["bash", "slackware", "slackrepo", "packaging"] [menus.main] name = "hintfiles helper" parent = "slackware" weight = 10 +++ **mkhint** è un singolo script Bash che elimina la noia di mantenere gli *hint file* di [slackrepo](https://idlemoor.github.io/slackrepo/). Un hint file sovrascrive i dettagli di build di un pacchetto SBo: quale versione compilare, da dove scaricare i sorgenti e i checksum con cui verificarli. Tenerli allineati a mano, su decine di pacchetti, è esattamente il tipo di lavoro ripetitivo che dovrebbe spettare a uno script. ## Cosa fa - **Aggiorna un hint** `-f package -v 2.0.1`: porta la versione ovunque nel file, riscarica i sorgenti da `DOWNLOAD` / `DOWNLOAD_x86_64` e ricalcola `MD5SUM` / `MD5SUM_x86_64`. Il file precedente viene salvato in `.bak`. - **Crea un hint** `-n package`: genera un nuovo hint dal `.info` corrispondente nel repository, rimuovendo i campi che slackrepo non vuole e impostando `ARCH` a `x86_64`. Senza `.info`, scrive uno scheletro vuoto. - **Elenco** `-l`: stampa ogni hint con il suo `HintVer` (versione nell'hint) accanto al `SBOVer` (versione nel `.info` del repository), evidenziando le righe in cui i due valori coincidono byte per byte, così individui gli hint ormai ridondanti rispetto all'upstream. Passando dei nomi (`-l foo bar`) salta la tabella e mostra ciascun hint indicato affiancato al suo `.info`. - **Revisione** `-R`: scorre solo gli hint evidenziati, mostrando ciascuno affiancato al suo `.info` (`git diff --no-index`, con ripiego su `diff -y`) e chiedendo se tenere, cancellare o saltare. Passando dei nomi (`-R foo bar`) rivede gli hint indicati a prescindere dalla corrispondenza di versione. - **Fix -current** `-F`: scorre tutto il repository e, per ogni pacchetto il cui `REQUIRES` nomina una dipendenza fantasma (inutile su slackware-current, elencata una volta in `~/.config/mkhint/phantom-deps`), garantisce che l'hint porti il relativo `DELREQUIRES`. È idempotente, quindi eseguilo dopo ogni rigenerazione settimanale del repository. `-n` applica la stessa lista quando crea un hint. - **Controllo** `-C [package...]`: interroga [nvchecker](https://github.com/lilydjwg/nvchecker) per l'ultima versione upstream di uno, alcuni o tutti gli hint; segnala cosa è obsoleto; aggiorna i pacchetti accettati con `nvtake`; e termina con un unico prompt `slackrepo update` per tutto ciò che è cambiato. - **Manutenzione** `-d package` / `-c`: cancella un hint e il suo backup, oppure rimuove tutti i `.bak` dalla directory degli hint in un colpo solo. ## Riferimento dei comandi ```text mkhint - Manage hint files for slackrepo scripts Usage: ./mkhint --version VERSION --hintfile FILE Update existing hint file ./mkhint --version VERSION --new FILE Create new hint file ./mkhint --new FILE Create new hint file (no version) ./mkhint --hintfile FILE Update hint, suggest latest version via nvchecker ./mkhint --check [FILE...] Check all (or named) hints for upstream updates ./mkhint --fix-current Sweep repo, add DELREQUIRES for -current phantom deps ./mkhint --list List hint files ./mkhint --review Review hints matching SBo version, keep/delete each ./mkhint --review FILE... Review named hints (any version), keep/delete each ./mkhint --clean Remove .bak files from HINT_DIR ./mkhint --no-dl --hintfile FILE Update hint, skip downloads, add NODOWNLOAD=yes ./mkhint --no-dl --new FILE Create hint with NODOWNLOAD=yes ./mkhint --help Show this help Options: --version, -v VERSION New version string (required for --hintfile) --hintfile, -f FILE Path to existing hint file (required with --version) --new, -n FILE Create new hint file (required with --version or standalone) --list, -l [FILE...] List all hint files; FILE... = side-by-side hint vs .info --review, -R [FILE...] Review hints; no args = matched only, FILE... = named hints (any version) --clean, -c Remove all .bak files from HINT_DIR --check, -C [FILE...] Check hints for upstream updates via nvchecker, update interactively --fix-current, -F Add/merge DELREQUIRES for -current phantom deps across the whole repo --delete, -d FILE Delete a hint file (and .bak if present) --no-dl, -N Skip downloads; add NODOWNLOAD=yes to hint file (use with -f or -n) --help, -h Show this help message ``` ## Come funziona mkhint è puro Bash con tre piccole dipendenze, ciascuna con un compito solo: - `wget` scarica gli archivi per calcolarne l'MD5, - `nvchecker` (e il suo compagno `nvtake`) segue le versioni upstream, - `jq` analizza l'output JSON di nvchecker. Tutto il resto è shell. I percorsi del repository e della directory degli hint sono due variabili in cima allo script. Il file di bash-completion li rispecchia, così `-f`, `-n`, `-d` e `-C` completano i nomi dei pacchetti dalla directory giusta, e `-v` suggerisce persino la versione corrente letta direttamente dall'hint file indicato. Le voci `DOWNLOAD` multiriga (un pacchetto con più URL sorgente) sono gestite con cura: il primo URL viene sempre riscaricato perché la versione è cambiata, mentre ogni URL di continuazione viene proposto in modo interattivo, così i sorgenti invariati conservano il checksum esistente invece di essere riscaricati inutilmente. Una stringa di versione SlackBuild non può contenere `-` (romperebbe il parsing di `PRGNAM`), quindi un rilascio upstream come `2026-06-02` viene pacchettizzato come `2026_06_02`. mkhint normalizza le versioni upstream (`-` diventa `_`) prima del confronto, così risultano la stessa versione e non viene proposto alcun aggiornamento o downgrade spurio; è la forma con underscore a essere scritta nell'hint. Sia lo sweep `-F` / `--fix-current` sia la gestione delle dipendenze fantasma in `-n` leggono `~/.config/mkhint/phantom-deps`, una dipendenza per riga (commenti con `#` ammessi). Copre le dipendenze che gli SlackBuild SBo richiedono su Slackware stable ma non su slackware-current, dove il sistema le fornisce già, per esempio `rust-opt` o `google-go-lang`. slackrepo rimuove una simile dipendenza con `DELREQUIRES` nell'hint; mkhint scrive e unisce quella riga al posto tuo. Una lista assente rende entrambe le funzioni inoperanti. ## Perché esiste Mantenere un overlay SBo personale significa un flusso costante di aggiornamenti di versione. Ogni volta la stessa danza: modificare la stringa di versione, scaricare il nuovo tarball, ricalcolare il checksum, sperare di non aver sbagliato una cifra. mkhint riduce quella danza a un comando, e il trio `--check` / `--list` / `--review` trasforma "quali dei miei hint sono ormai obsoleti o inutili?" da audit manuale a un'occhiata. È il tipo di strumento piccolo e affilato che Slackware incoraggia: niente demone, niente database, niente framework, solo uno script che fa bene un lavoro noioso. ## Avvio rapido ```bash sudo cp mkhint /usr/local/bin/mkhint sudo cp mkhint.bash-completion /etc/bash-completion.d/mkhint # aggiorna un hint esistente a una versione nota mkhint -f mypackage -v 2.0.1 # crea un nuovo hint dal .info del repository mkhint -n mypackage # guarda cosa si è mosso a monte mkhint --check ``` Modifica i percorsi `REPO_DIR` e `HINT_DIR` in cima allo script (e nel file di completion) per adattarli alla tua configurazione prima del primo utilizzo. {{< actions use="repo" url="https://git.danix.xyz/mkhintfile/" desc="Sfoglia il sorgente" caption="Spero ti sia utile. Se mantieni un tuo overlay slackrepo, mkhint potrebbe risparmiarti la stessa noia che risparmia a me. Patch e idee sono benvenute." >}}