Usare Quilt con i pacchetti sorgenti Debian

Informazioni generali

Documentazione

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


CategoryPackaging