Contents
Usare Quilt con i pacchetti sorgenti Debian
- Questa pagina si rivolge a chi vuole apportare modifiche ad un pacchetto sorgente di Debian che sta già utilizzando quilt.
- L'intenzione non è di spiegare quilt ma di offrire alcuni suggerimenti specifici per Debian.
Informazioni generali
Documentazione
Se si desidera capire il funzionamento di quilt, installare il pacchetto e leggere il file /usr/share/doc/quilt/quilt.pdf.gz
Esiste un'ampia guida su quilt e la pacchettizzazione: la Debian New Maintainers' Guide
Un tutorial esaustivo ma conciso sul quilt, Come usare quilt per gestire patch nei pacchetti Debian, pubblicato da Raphaël Hertzog (coautore della New Maintainers' Guide citata sopra)
Un How-To del Debian Perl Group: Quilt per i Debian Maintainer.
Esiste anche un Quilt Tutorial (PDF), sebbene datato 2006.
Se si usa un flusso di lavoro di pacchettizzazione basato su git, considerare l'uso di gbp-pq(1) per la gestione di patch quilt.
Concetti base
quilt funziona usando alcune directory: crea una directory .pc/ e una patches/.
Queste directory possono essere create quando si usa
- $ quilt import un_qualche_package.diff.gz
Utilizzare quilt con i pacchetti sorgente Debian
Situazione: è stato scaricato un pacchetto di sorgenti Debian che usa quilt e si vuole correggere un bug per poi presentare una patch al maintainer.
Usare il file di configurazione .quiltrc
Mettere un file di configurazione .quiltrc nella propria directory home, contenente le righe seguenti.
QUILT_PATCHES=debian/patches QUILT_NO_DIFF_INDEX=1 QUILT_NO_DIFF_TIMESTAMPS=1 QUILT_REFRESH_ARGS="-p ab" QUILT_DIFF_ARGS="--color=auto" # se si desiderano i colori quando si usa `quilt diff`. QUILT_PATCH_OPTS="--reject-format=unified" QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
Variabili d'ambiente
In alternativa si possono impostare a mano le variabili d'ambiente.
Add these lines to your shell's init scripts (~/.bashrc), and restart your shell to apply the changes. Or, run them in your shell before using quilt. Aggiungere queste righe agli script di inizializzazione della shell (~/.bashrc) e riavviare la shell per rendere effettivi i cambiamenti. Oppure eseguirle nella shell prima di usare quilt.
export QUILT_PATCHES=debian/patches
export QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
Incapsulato
Per applicare le opzioni di quilt solo quando all'interno di un pacchetto sorgente Debian, si può impostare il proprio file ~/.quiltrc in modo simile a questo:
d=. ; while [ ! -d $d/debian -a `readlink -e $d` != / ]; do d=$d/..; done if [ -d $d/debian ] && [ -z $QUILT_PATCHES ]; then # if in Debian packaging tree with unset $QUILT_PATCHES QUILT_PATCHES="debian/patches" if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi fi
Operazioni quilt di base
Creare una nuova patch
"apt-get source" decide se applicare le patch in base al formato del pacchetto.
Per alcuni pacchetti sarà necessario applicare le patch come descritto qui. Per altri verranno applicate automaticamente.
Primo passo: applicare patch esistenti ai sorgenti
quilt push -a
per "inserire" tutte le patch esistenti nell'albero dei sorgenti (quando si crea un pacchetto questo è fatto dagli script di compilazione)
Creare una nuova patch
quilt new miaPatch.diff # questo è il nome della patch
Aggiungere un file
quilt add README # Dove 'README' è il nome del file da modificare.
Va fatto, prima di cambiarli, per tutti i file che saranno modificati, una patch di quilt può modificare più file.
Modificare i sorgenti
Apporre i cambiamenti ai file aggiunti alla patch: modificarli o sostituirli con un file già modificato salvato in una directory diversa.
Aggiornare una patch con le modifiche fatte ai file
quilt refresh #si può ripetere quante volte si vuole
Aggiungere una descrizione alle intestazioni
quilt header -e --dep3 #modifica l'intestazione in $EDITOR
Completare la modifica
quilt pop -a
Questo revoca l'applicazione di tutte le patch in modo che i sorgenti ritornino alla condizione in cui erano al momento in cui sono stati scaricati.
Modificare una patch esistente
quilt gestisce patch multiple ma se ne può modificare solo una, ovvero l'ultima inserita.
Per modificare una patch esistente si comincia con l'inserirla:
quilt push miaPatch.diff
Ora modificarla e, quando pronta, salvarla:
quilt refresh miaPatch.diff
Notare che il completamento automatico fa risparmiare in scrittura ed evita errori.
Ripristinare una patch che non è stata applicata con successo
Se l'applicazione della patch è fallita (solitamente quando si aggiorna ad un rilascio a monte nuovo) quando si esegue quilt push come nell'esempio sottostante:
$ quilt push Applying patch CVE-2018-1000544_part1.patch patching file lib/zip/entry.rb Hunk #1 FAILED at 147. 1 out of 1 hunk FAILED -- rejects in file lib/zip/entry.rb patching file test/data/absolutepath.zip patching file test/entry_test.rb Patch CVE-2018-1000544_part1.patch does not apply (enforce with -f)
$ quilt push -f Applying patch CVE-2018-1000544_part1.patch patching file lib/zip/entry.rb Hunk #1 FAILED at 147. 1 out of 1 hunk FAILED -- saving rejects to file lib/zip/entry.rb.rej patching file test/data/absolutepath.zip patching file test/entry_test.rb Applied patch CVE-2018-1000544_part1.patch (forced; needs refresh)
si dovrebbero ispezionare i file *.rej (lib/zip/entry.rb.rej in questo esempio) e adattare lib/zip/entry.rb in modo da includere la modifica voluta.
Se la modifica è stata incorporata dagli autori a monte, si può rimuoverla dalla propria patch. Ad esempio:
$ quilt refresh Diff failed on file 'test/data/absolutepath.zip', aborting # In questo caso la modifica a absolutepath.zip è già stata fatta dagli autori originali a monte. # Rimuovere perciò il file dalla patch: $ quilt remove test/data/absolutepath.zip File test/data/absolutepath.zip removed from patch CVE-2018-1000544_part1.patch $ quilt refresh
Aggiornare i commenti nelle intestazioni della patch in cima allo stack
quilt header -e
Ora che sono state salvate le modifiche, rimuovere tutte le patch e riportare i sorgenti nello stato originale
quilt pop -a
Inoltrare patch agli autori originali a monte
Patch non specifiche per Debian, come quelle per risoluzione di bug e miglioramento di funzionalità, devono essere inoltrate agli sviluppatori a monte: Come inoltrare patch a monte