summaryrefslogtreecommitdiffstats
path: root/content/it/slackware/mkhint/index.md
blob: 9b1dd46e0bb593e9dff64d704c1a941c00e6fce9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
+++
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." >}}