Allora, posto un sistema "quick and dirty" sul quale non do nessuna garanzia e sul quale non mi assumo alcuna responsabilità.
Codice: Seleziona tutto
--- pkgtool 2007-07-30 23:10:08.000000000 +0200
+++ pkgtool.test 2007-07-30 23:01:45.000000000 +0200
@@ -228,26 +228,34 @@
chmod 1777 /tmp
continue
fi
+
+ create_list_of_files_to_remove ()
+{
+FILES=`ls $ADM_DIR/packages`
+ if [ -n "$FILES" ]; then
+ cd $ADM_DIR/packages
+ { grep '^PACKAGE DESCRIPTION:$' -Z -H -m1 -A1 $FILES; echo; } \
+ | sed -n 'h;n;/\x00/{h;n;};x;s/ */ /g;s/ $//;s/[\"`$]/\\&/g
+ s/\(.*\)\x00\([^:]*:\)\? *\(.*\)/ "\1" "\3" off "Select\/Unselect removing package \1" \\/;p' > $TMP/temporary_list \
+
+ fi
+}
+
if [ "$REPLY" = "Remove" ]; then
#dialog --title "SCANNING" --infobox "Please wait while Pkgtool scans \
#your system to determine which packages you have installed and prepares \
#a list for you." 0 0
# end section
(
+create_list_of_files_to_remove #call the function to create a list of installed packages
cat << EOF
dialog --title "SELECT PACKAGES TO REMOVE" --item-help --checklist \
"Please select the \
packages you wish to Remove. Use the \
spacebar to select packages to delete, and the UP/DOWN arrow keys to \
-scroll up and down through the entire list." 20 75 11 \\
+scroll up and down through the entire list." 20 75 11 \
+--file $TMP/temporary_list \\
EOF
- FILES=`ls $ADM_DIR/packages`
- if [ -n "$FILES" ]; then
- cd $ADM_DIR/packages
- { grep '^PACKAGE DESCRIPTION:$' -Z -H -m1 -A1 $FILES; echo; } \
- | sed -n 'h;n;/\x00/{h;n;};x;s/ */ /g;s/ $//;s/[\"`$]/\\&/g
- s/\(.*\)\x00\([^:]*:\)\? *\(.*\)/ "\1" "\3" off "Select\/Unselect removing package \1" \\/;p'
- fi
echo "2> $TMP/return"
) > $TMP/rmscript
if [ -L $LOG -o -r $LOG ]; then
@@ -268,7 +276,7 @@
been removed. A complete log of the files that were removed has been created \
in $TMP: PKGTOOL.REMOVED." 0 0
fi
- rm -f $TMP/rmscript $TMP/return $TMP/tmpmsg $TMP/SeT*
+ rm -f $TMP/rmscript $TMP/return $TMP/tmpmsg $TMP/SeT* $TMP/temporary_list
chmod 755 /
chmod 1777 /tmp
# No, return to the main menu:
Si tratta di una piccolissima patch, per applicarla basta copiare pkgtool nella stessa directory dove è stata messa la patch (io l'ho chiamata patch-pkgtool) e dare:
patch -p0 <nome-della-patch(es.patch-pkgtool)
Purtroppo nella procedura di copia e incolla l'applicazione della patch può non riuscire (almeno a me non funzionava più...), così ho messo in:
http://www.inghi.it/download/prova-pkgtool.tar.bz2 il pkgtool modificato e la patch da applicare.
Volendo si può usare direttamente il pkgtool modificato, che ho chiamato pkgtool.test (anzi, è la cosa più semplice da fare).
Le modifiche sono molto grezze: viene semplicemente scritta una funzione che usa pari pari il metodo di Patrick per preparare la lista dei pacchetti, solo che l'output viene scritto sul file temporary_list, la funzione viene poi chiamata prima di dialog ed a dialog viene passato il file temporary_list creato poco prima con l'opzione --file, quindi fra i file da rimuovere è stato incluso anche temporary_list.
Ho provato la versione modificata per rimuovere un pacchetto e funziona, ovvero si comporta come pkgtool normale anche se dietro le quinte funziona in maniera leggermente diversa (e teoricamente un po' meno veloce, ma si dovrebbe notare poco), quello che non so è come si comporti con l'errore famoso. Si potrebbe applicare allo script di test che avevo fatto l'altro giorno, ma stasera, scusatemi, ho poco tempo e anche domani e mercoledì mattina sarò alquanto impegnato.
Se ne avete voglia e coraggio (e, soprattutto, se avete le spalle coperte da un bel backup aggiornato di tutto), provate direttamente il pkgtool modificato, sui possibili danni del quale, ripeto, non mi assumo alcuna responsabilità, altrimenti aspettate che faccia la prova sicura fra due o tre giorni.
Magari, se ne avete voglia, leggete prima le modifiche fatte e proponete o fate direttamente tutte le migliorie del caso, soprattutto se rilevaste pericolosi errori (le modifiche che ho fatto io sono poche ed idiote, ma non si sa mai).
Attenzione, il pkgtool modificato non ha la pretesa di aver risolto l'errore, si limita passare un file anziché una lista di argomenti a dialog, così come proposto da submax82.
Se l'errore dovesse persistere, bisognerebbe procedere in altra maniera,ad esempio dividendo l'elenco in più schermate.
Non ho visionato le altre parti di pkgtool, ma può darsi che ci siano altre parti dove l'uso di dialog potrebbe in futuro dar luogo ai problemi già riscontrati; così a occhio direi che potrebbe essere a rischio la chiamata a remove_packages se uno volesse rimuovere un numero molto grande, diciamo almeno qualche migliaio, di pacchetti con pkgtool, perché anche qui i nomi dei pacchetti da rimuovere sono passati tutti insieme come argomento alla funzione, mentre una modalità sicura, anche se più lenta, sarebbe passarli uno a uno (come poi remove_packages fa a sua volta con removepkg) o a gruppetti (ma è assai improbabile che qualcuno voglia rimuovere un numero così grande di pacchetti con pkgtool).
Per quanto riguarda la comunicazione a Patrick, posso scrivergli anch'io, ma se volesse farlo qualcuno che Patrick conosce già forse sarebbe meglio. In ogni caso, tenete conto che fino a giovedì pomeriggio avrei poco tempo per farlo...
Un salutone a tutti! Buonanotte!
