# [TOOL] forcekeymask (new zorro)

## fedeliallalinea

forcekeymask e' la nuova versione di zorro. Abbiamo cambiato nome io e xchris per fare capire meglio il suo funzionamento. 

Praticamente e' fa la stessa cosa di zorro cioe' smaschera un pacchetto con relative dipendenze (anche quelli hard masked). In questa nuova versione e' stata anche aggiunta l'opzione per fare un purge sui file package.* . Questo vuol dire che se avete una voce in quei file pero' il pacchetto non e' installato vi dira' che possono essere tolte. La nuova versione la trovate qua

```
$ wget http://www.orson.it/~fedeliallalinea/files/forcekeymask
```

PS: usatelo a vostro rischio e pericolo

----------

## fabius

Ho provato il tool ed ora è effettivamente più comodo emergiare i pacchetti mascherati. Subito ho però pensato: allora adesso mi becco tutte le versioni mascherate/instabili di quel pacchetto.

Ad esempio io ho emergiato lm-sensors 2.8.8 che è marcato ~x86. Ciò è stato fatto per risolvere un problema con la versione stabile sulla mia scheda madre, non per fare il betatester. Ho inserito quindi in packages.keywords

```

=sys-apps/lm-sensors-2.8.8 ~x86

```

Mi pare che forcekeymask inserisca solo il pacchetto senza la versione. Avrebbe quindi senso modificare forcekeymask per inserire, su richiesta dell'utente, una sola versione del ebuild da smascherare (quella passata su linea di comando)?

----------

## fedeliallalinea

 *fabius wrote:*   

> Avrebbe quindi senso modificare forcekeymask per inserire, su richiesta dell'utente, una sola versione del ebuild da smascherare (quella passata su linea di comando)?

 

Si ok appena ho un po' di tempo metto anche questa opzione

----------

## fabius

Ok, grazie!

----------

## =DvD=

Mi accoro a fabius, sicuramente è un opzione utile.

Ora mi guardo il codice e guardo se riesco ad aiutarvi (dubito).

//edit: facevo bene a dubitare!

----------

## Tùrin_Mormegil

ho un solo dubbio... ho provato a fare 

```
cat /etc/make.profile/make.defaults | grep "ACCEPT_KEYWORDS" | awk -F\" '{ print $2 }'
```

 e come output ho ottenuto 

```
 bash-2.05b# cat /etc/make.profile/make.defaults | grep "ACCEPT_KEYWORDS" | awk -F\" '{ print $2 }'

 ${ARCH}

bash-2.05b# 

 
```

ma forcekeymask si va a vedere a cosa corrisponde la variabile ${ARCH} in /etc/make.profile/make.defaults?

----------

## fedeliallalinea

 *Tùrin_Mormegil wrote:*   

> ma forcekeymask si va a vedere a cosa corrisponde la variabile ${ARCH} in /etc/make.profile/make.defaults?

 

Si perche'?

----------

## Tùrin_Mormegil

niente, era solo una curiosità da totale niubbo di bash scripting  :Smile: 

----------

## Onip

```
# forcekeymask -fm amule

Problem with your profile. No ARCH variable present!

```

fino a ieri andava (ho smascherato kink e mplayer).... cosa mi può essere successo?

----------

## Dhaki

 *Onip wrote:*   

> 
> 
> ```
> # forcekeymask -fm amule
> 
> ...

 

Se fai un "ls -l /etc/make.profile" cosa ti dice?

----------

## Onip

x adesso ho messo 

```
ARCH=x86
```

 nello script, xò sarebbe interessante sapere qual è il problema e se è grave. Byez

----------

## Onip

il problema è semplice

```
/etc/make.profile/make.defaults
```

è un bellissimo file vuoto......

è un problema grosso? 

purtroppo immagino di sì......

----------

## Onip

purtroppo forcekeymask non funziona, o meglio, mi da l'output come se funzionasse, ma non mi aggiunge nessuna riga nè a package.keyword nè a package.unmask

----------

## blacksword

 *Onip wrote:*   

> 
> 
> ```
> # forcekeymask -fm amule
> 
> ...

 

E' successo anche a un mio amico. Dopo un emerge-webrsync gli era sparito  /usr/portage/profiles/default-linux/x86/2004.0. Perciò  /etc/make.profile era un link simbolico che nn puntava a nulla. Ha risolto facendo un emerge --sync il file è riapparso e tutto è tornato nella norma. Cmq stai tranquillo che su gentoo prima o poi si risolve tutto  :Smile: 

----------

## fctk

@Onip

prova con:

```
# rm -f /etc/make.profile 

# ln -sf /usr/portage/profiles/default-linux/x86/2005.0 /etc/make.profile
```

----------

## Onip

ho fatto il sync e ho rifatto il link simbolico, ma niente da fare.

ho anche dato un 

```
#emerge portage
```

ma non è servito.....

----------

## fedeliallalinea

@Onip: non ho capito se capita solo a te o anche agli altri

----------

## Onip

io non lo so se capita anche agli altri, comunque non è un problema di forcekeymask, ha ragione lui. il file make.defaults è vuoto. ho appena scaricato decompresso e syncato l'ultimo snapshot di portage del mirror di padova, ma è ancora vuoto

----------

## fedeliallalinea

No e' che il file /etc/make.profile/make.defaults non esiste piu' devo cambiare le linee che vanno a prendere il tipo di ARCH automaticamente

----------

## Onip

quindi è tutto a posto?

meno male......

p.s. scusa se ti faccio "lavorare" sotto le feste...   :Embarassed:   :Laughing:   :Wink: 

----------

## consdel

Inanzitutto ringrazio i creatori dell'ex-Zorro perchè è veramente geniale e comodissimo!  :Very Happy: 

Vorrei richiedervi una nuova "feature" che non dovrebbe essere complicata da implementare: sarebbe bello se delemitasse le righe aggiunte a package.keywords e package.unmask con dei commenti che indichino per quale pacchetto sono necessarie.

Cerco di spiegarmi meglio con un esempio. Se lo usassi per emergere Inkscape e mi aggiungesse a package.keywords, che ne so, gtkmm e boehm-gc, potrebbe scrivere le righe in questo modo:

```
# Aggiunte da forcekeymask per media-gfx/inkscape

dev-cpp/gtkmm ~x86

dev-libs/boehm-gc ~x86

#

```

o qualcosa del genere.

Secondo me sarebbe molto utile per fare chiarezza! Che ne dite?

----------

## xchris

mi sembra un ottima idea!

Ora vediamo chi la implementa  :Smile: 

----------

## julius malchovitch

Eccellente, utility davvero eccellente. La qualità della vita che passo con portage è migliorata decisamente.

Grazie

----------

## Onip

A me continua a no funzionare...

Se lascio lo script cosi com'è mi da l'errore di cui sopra....

Allora ho impostato io a mano ARCH=x86, ma non funziona.....

```
Hal9000 root # forcekeymask -fm x11-misc/engage

 * Please Wait...

 * Don't know how to handle.. sorry!

```

Byez

p.s. cmq io non ho ancora capito perchè a voi va "nature" e a me non trova l'Architettura

<EDIT>

```

Hal9000 root # ls -l /etc/make.pr*

lrwxrwxrwx  1 root root    48 23 dic 13:21 /etc/make.profile -> ../usr/portage/profiles/default-linux/x86/2004.3

Hal9000 root # cat /etc/make.profile/make.defaults 

# Copyright 1999-2004 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2

# $Header: /var/cvsroot/gentoo-x86/profiles/default-linux/x86/2004.3/make.defaults,v 1.11 2005/02/18 03:46:39 ribosome Exp $

GRP_STAGE23_USE="ipv6 pam tcpd readline nls ssl gpm perl python berkdb ncurses"

USE="oss apm arts avi berkdb bitmap-fonts crypt cups emboss encode fortran f77 font-server foomaticdb gdbm gif gpm gtk gtk2 imlib jpeg kde gnome libg++ libwww mad mikmod motif mpeg ncurses nls oggvorbis opengl pam pdflib png python qt quicktime readline sdl spell ssl svga tcpd truetype truetype-fonts type1-fonts X xml2 xmms xv zlib"

```

magari serve

----------

## f0llia

Stesso problema di Onip ..  :Sad: 

Un po di info:

```

 # ls -l /etc/make.profile

lrwxrwxrwx  1 root root 48 Feb  8 12:01 /etc/make.profile -> ../usr/portage/profiles/default-linux/x86/2004.3

```

```

# cat /usr/portage/profiles/default-linux/x86/2004.3/make.defaults 

# Copyright 1999-2004 Gentoo Foundations/default-linux/x86/2004.3/make.defaults

# Distributed under the terms of the GNU General Public License v2

# $Header: /var/cvsroot/gentoo-x86/profiles/default-linux/x86/2004.3/make.defaults,v 1.11 2005/02/18 03:46:39 ribosome Exp $

GRP_STAGE23_USE="ipv6 pam tcpd readline nls ssl gpm perl python berkdb ncurses"

USE="oss apm arts avi berkdb bitmap-fonts crypt cups emboss encode fortran f77 font-server foomaticdb gdbm gif gpm gtk gtk2 imlib jpeg kde gnome libg++ libwww mad mikmod motif mpeg ncurses nls oggvorbis opengl pam pdflib png python qt quicktime readline sdl spell ssl svga tcpd truetype truetype-fonts type1-fonts X xml2 xmms xv zlib"

```

----------

## fedeliallalinea

Dovrei rivederlo questo programmama ora non ho tempo. Appena finisco gli esami mi ci metto

----------

## f0llia

 *fedeliallalinea wrote:*   

> Dovrei rivederlo questo programmama ora non ho tempo. Appena finisco gli esami mi ci metto

 

Non ti preoccupare, niente fretta.  :Smile: 

----------

## Onip

Nessun problema, era solo una segnalazione.....  :Wink: 

p.s. Io gli esami gli ho finiti oggi pappappero......

----------

## Dhaki

Secondo me bisognorebbe andare verso un package.* manager con piu funzioni. Certo, forcekeymask fa il suo lavoro, ma senza nulla togliere al lavoro che é stato fatto per farlo e senza voler offendere nessuno, secondo me una cosa fatta in python, che possa servire a smascherare (~ e M), mascherare, iniettare, cambiare le use per certi pacchetti, vedere i contenuti dei file, poterli pulire (cosa che fa gia forcekeymask), eccetera, potrebbe essere interessante. È vero, alla fin fine basterebbe fare un "nano /etc/portage/package.*" e si potrebbero fare le stesse cose... ma dato che l'importante é la scelta secondo me c'é chi potrebbe, per comodità o altro, voler poter usare un tool. Io sinceramente non potrei aiutare molto temo... bash scripting me la cavo (un pochino...), sto cominciando con il C, quindi non ho ancora le capacità. Dite che é una cosa inutile del tutto o che ci si può fare un pensierino?

----------

## mrfree

In attesa che venga rilasciata una nuova versione con i vari miglioramenti e considerando che non posso più resistere all'emersione di gnome 2.10, ho realizzato questo VBH (Very Bad Hack) al forcekeymask  :Very Happy: 

```
--- forcekeymask        2004-12-05 22:24:40.000000000 +0100

+++ forcekeymask.mrfree 2005-03-12 19:02:08.672850288 +0100

@@ -1,6 +1,7 @@

 #!/bin/bash

 # ARCH -> x86 ppc sparc alpha hppa mips ia64 amd64

-ARCH=`cat /etc/make.profile/make.defaults | grep "ACCEPT_KEYWORDS" | awk -F\" '{ print $2 }'`

+#ARCH=`cat /etc/make.profile/make.defaults | grep "ACCEPT_KEYWORDS" | awk -F\" '{ print $2 }'`

+ARCH="x86"

 #####################

 HILITE="\033[1m"

 NORMAL="\033[0m"

@@ -111,6 +112,7 @@

          HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

          MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

          CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

+         CLEAN_EXACT_NAME=`echo $RESULT | cut -d" " -f2`

          if [ "$HARD_MASKED" = "$RESULT_FILTERED" ]

          then

              echo "$CLEAN_NAME" >> /etc/portage/package.unmask

@@ -118,7 +120,7 @@

          fi

          if [ "$KEYWORD_MASKED" = "$RESULT_FILTERED" ]

          then

-             echo "$CLEAN_NAME ~$ARCH" >> /etc/portage/package.keywords

+             echo "=$CLEAN_EXACT_NAME ~$ARCH" >> /etc/portage/package.keywords

              ACTION_STRING=$ACTION_STRING$YELLOW"[KEYWORD]"$NORMAL

          fi

          if [ "$MISSING_MASKED" = "$RESULT_FILTERED" ]
```

-) Specifica nel file /etc/portage/package.keywords la versione esatta del pacchetto da smascherare

```
[...]

=app-arch/file-roller-2.10.0 ~x86

=media-video/totem-1.0 ~x86

=media-plugins/gst-plugins-flac-0.8.8 ~x86

=media-libs/flac-1.1.1 ~x86

[...]
```

-) Forza x86 come architettura hardware

Spero sia utile a qualche altro utente impaziente come me  :Smile: 

Edit: per applicare la patch è sufficiente salvare il codice in un file (ad es.: mrforce.patch) ed eseguire 

```
cat mrforce.patch | patch forcekeymask
```

----------

## Dhaki

Error 404.

C'é qualcuno che potrebbe uploadare forcekeymask? Grazie

----------

## xchris

http://fedeliallalinea.tilug.ch/projects/forcekeymask

ora vedo di fare upload anche sul mio sitino

ciao

----------

## Dhaki

 *xchris wrote:*   

> http://fedeliallalinea.tilug.ch/projects/forcekeymask
> 
> ora vedo di fare upload anche sul mio sitino
> 
> ciao

 

Ok grazie!

----------

## teknux

scusate ma lo script risulta irrepereibile presso i link postati nel thread. non è che potreste ri-renderlo disponibile?

grazie,

tek

----------

## neon

sul sito di xchris si trova questo, non so che versione sia ma almeno c'e': http://www.xchris.net/download.php?file=files/forcekeymask.gz

----------

## Pancu

Ragazzi  ho un problema con forcekeymask.

Devo installare gnome-2.12.

Faccio un 

```
forcekeymask -fm gnome-base/gnome-2.12

Please Wait ...

Your ebuild is emergeable!

```

Ma quando vado a controllare nei file package.keywords, package.unmask e package mask non mi è stato scritto niente  :Sad:   :Sad: 

----------

## lavish

Spostato da Forum italiano (Italian) a Documentazione italiana  :Wink: 

----------

## Pancu

 *Pancu wrote:*   

> Ragazzi  ho un problema con forcekeymask.
> 
> Devo installare gnome-2.12.
> 
> Faccio un 
> ...

 

Ragazzi nessuno può aiutarmi??

Vorrei installare gnome entro domani  :Sad:   :Sad: 

----------

## lavish

 *Pancu wrote:*   

> Ragazzi nessuno può aiutarmi??
> 
> Vorrei installare gnome entro domani  

 

Ma per favore! Non è passata nemmeno un'ora dal tuo precedente post! Questo non è un help desk!

Se qualcuno ha tempo/sa/vuole aiutarti lo farà comunque, senza solleciti orari! Ad ogni modo la netiquette prevede un'attesa di minimo 24h prima di fare un "up"

----------

## Onip

prova con

```
forcekeymask -fm =gnome-base/gnome-2.12
```

----------

## codadilupo

Ok, nessuno me ne voglia, ma ho tentato di rimaneggiare il forcekeymask. Avevo bisogno di gestire anche i missing keywords perché m'ero rotto le balle di gestirli a mano per i 2600 pacchetti 'missing' dei ppc64  :Wink: 

Ovviamente non l'ho fatto da solo, mica ero capace  :Wink: 

Questo ottimo software, trasformato in un paciugo dal sottoscritto é opera di:

xchris: il primo alchimista

fedeliallalinea: quello che mette ordine

mouser: il codice piu' veloce di tutta l'IM

codadilupo: la colla

 :Wink: 

ecco a voi: zorro64

```
#!/bin/bash

# ARCH -> x86 ppc sparc alpha hppa mips ia64 amd64 ppc64

ARCH="ppc64"

OVERLAY=`cat /etc/make.conf | grep "PORTDIR_OVERLAY" | awk -F\" '{ print $2 }'`

#####################

HILITE="\033[1m"

NORMAL="\033[0m"

RED='\E[31;01m'

GREEN='\E[32;01m'

YELLOW='\E[33;01m'

#####################

function usage {

    echo -e "\nUsage: forcekeymask [OPTION] [FILE]\n"

    echo -e ""

    echo -e "\nOption:"

    echo -e "  -fm, --force-merge"

    echo -e "  -p, --purge\n"

    echo -e "\nExample:"

    echo -e "   # forcekeymask -fm =xfce-base/xfce4-4.1.90"

    echo -e "   # forcekeymask -p"

    echo -e ""

    exit 1

}

function purge {

    source /sbin/functions.sh

    FILE=$1

    [ ! -s "${FILE}" ] && echo "Your ${FILE} needs no change!" && return 0

    END=`wc -l ${FILE} | awk '{print $1}'`

    [ -s ${FILE}.new ] && rm ${FILE}.new

    for i in `seq 1 ${END}`;

    do

      LINE=`cat ${FILE} | head -n ${i} | tail -n 1`

      #echo ${LINE}

      COMMENT=`echo ${LINE} | head -c 1`

      # Riporta le newline e i commenti

      if [ -z "${LINE}" ] || [ "${COMMENT}" = "#" ] 

      then

     echo ${LINE} >> ${FILE}.new

      else

     # elimina versione e simboli del pacchetto

     CLEAN=`echo "${LINE}" | awk '{print $1}' | sed -e 's/-[0-9]/*/g' | cut -d* -f1 | sed -e 's/[<|>|=]/*/g' | tr -d "*"`

     # se esiste rimettilo nella lista se no rimuovi

     if [ -s /var/db/pkg/${CLEAN}* ]

     then 

         echo ${LINE} >> ${FILE}.new

     else

         einfo "${LINE} ${RED}removed${NORMAL} from new list"

     fi

      fi       

    done

    

    DIFFERENCES=`diff ${FILE} ${FILE}.new`

    

    if [ -s "${DIFFERENCES}" ]

    then

   rm ${FILE}.new

   echo "Your ${FILE} needs no change!"

    else

   echo ""

   echo ${DIFFERENCES} 

   echo ""

   echo "1) Update ${FILE}"

   echo "2) Discard changes"

   echo "3) Don't update,save changes in ${FILE}.new"

   echo -n "Select: "

   read ANSWER

   echo ""

   

   case $ANSWER in

       "1")

      mv  ${FILE}.new ${FILE} 

      echo "${FILE} Updated!" ;;

       "2")

      rm ${FILE}.new  

      echo "Changes dirscarded!" ;;

       "3")

      echo "Changes saved in ${FILE}.new" ;;

       *)

      echo "Option not valid!" ;;

   esac

   echo ""

    fi

}

function force_merge {

    source /sbin/functions.sh

    DONE=1

    PACKAGES=$1

    [ -s $ARCH ] && echo "Problem with your profile. No ARCH variable present!" && exit

    echo && einfo "Please Wait...\n"

    [ ! `/usr/bin/whoami` = 'root' ] && echo && einfo "Program require root access!" && echo && exit

    PRELIMINARY_CHECK=`emerge -p ${PACKAGES} 2>&1 | grep "no ebuilds to satisfy"`

    PRELIMINARY_CHECK1=`emerge -p ${PACKAGES} 2>&1 | grep "(try adding an '=')"`

    PRELIMINARY_CHECK2=`echo "$1" | head -c 1 --`

    [ "$PRELIMINARY_CHECK" ] && echo && einfo "No ebuild found!" && echo && exit

    [ "$PRELIMINARY_CHECK1" ] && echo && einfo "Specific key requires an operator (xfce-base/xfce4-4.1.90) (try adding an '=')" && echo && exit

    [ "$PRELIMINARY_CHECK2" = "-" ] && echo && einfo "No ebuild found!" && echo && exit

    [ ! -e  "/etc/portage" ] && einfo "Creating /etc/portage directory\n" && { mkdir /etc/portage || { einfo "ERROR...Quiting" && exit ;} }

    while [ $DONE ]

    do

      RESULT=`emerge -p ${PACKAGES} 2>&1 | grep "(masked" |  head -n 1`  

      if [ "$RESULT" ]

      then

     ACTION_STRING=

     RESULT_FILTERED=`echo $RESULT | cut -d":" -f2`

     KEYWORD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "~"`

     HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

     MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

     if [ "$MISSING_MASKED" = "$RESULT_FILTERED" ]

     then

         echo && einfo "Package masked by missing keyword.. adding right keyword.. " && echo

       mkdir -p $OVERLAY/$CLEAN_NAME/ && echo && einfo "creating PORTDIR_OVERLAY Tree.." && echo

             cp -r /usr/portage/$CLEAN_NAME/ $OVERLAY/$CLEAN_NAME/../

      cd $OVERLAY/$CLEAN_NAME/ echo && einfo "overlaying ebuild.." && echo

   for EBUILD in `find $OVERLAY/$CLEAN_NAME -iname *.ebuild`; do

      cat $EBUILD | nl -b a > /tmp/temp.ebuild

      RIGA=`cat /tmp/temp.ebuild | grep KEYWORDS | awk '{print $1}'`

      PREV=`expr $RIGA - 1`

      NEXT=`expr $RIGA + 1`

      cat /tmp/temp.ebuild | head -n $PREV | cut -b8- > $EBUILD

      cat /tmp/temp.ebuild | grep KEYWORDS | cut -b8- | sed -e 's/\"\ *$/\ ~ppc64\"/g' >> $EBUILD

      cat /tmp/temp.ebuild | tail -n $NEXT | cut -b8- >> $EBUILD && echo && einfo "updating ebuild.." && echo

      rm -f /tmp/temp.ebuild

   done

   for EBUILD in `find $OVERLAY/$CLEAN_NAME -iname *.ebuild`; do

      echo && einfo "creating digest up to date.." && echo && ebuild ${PACKAGES}*.ebuild digest

   done

 RESULT=`emerge -p ${PACKAGES} 2>&1 | grep "(masked" |  head -n 1`

     fi

      fi

      if [ "$RESULT" ]

      then

     ACTION_STRING=

     RESULT_FILTERED=`echo $RESULT | cut -d":" -f2`

     KEYWORD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "~"`

     HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

     MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

     if [ "$HARD_MASKED" = "$RESULT_FILTERED" ]

     then

         echo "$CLEAN_NAME" >> /etc/portage/package.unmask

         ACTION_STRING=$RED"[HARD]"$NORMAL

     fi

       if [ "$KEYWORD_MASKED" = "$RESULT_FILTERED" ]

     then

         echo "$CLEAN_NAME ~$ARCH" >> /etc/portage/package.keywords

         ACTION_STRING=$ACTION_STRING$YELLOW"[KEYWORD]"$NORMAL

     fi

     if [ ! "$ACTION_STRING" ]

     then

         echo && einfo "Don't know how to handle.. sorry!" && echo

         exit

     else

         echo -e $GREEN"*$NORMAL $CLEAN_NAME "$ACTION_STRING

     fi

      else

     echo && einfo "Your ebuild is emergeable!" && echo

     DONE=

      fi

    done

}

case $1 in

    -fm|--force-merge)

   [ $# -eq 1 ] && echo -e "\nSpecify one or more packages\n" && exit

   PACKAGES=`echo $* | cut -d " " -f2-`

   force_merge ${PACKAGES}

   ;;

    -p|--purge)

   purge "/etc/portage/package.keywords"

   purge "/etc/portage/package.unmask"

   ;;

    -h|--help)

     usage 

     ;;

    *)

   echo "No valid option specified. Discarding changes..."

   #usage 

   ;;

esac
```

ovviamente laddove il codice risulta un pugno in un occhio é tutta colpa mia (e puo' essere rifutato in luogo di qualcosa di serio  :Wink: )

CodaLast edited by codadilupo on Mon Feb 06, 2006 3:33 pm; edited 1 time in total

----------

## xchris

a dire il vero il primo alchimista e' stato xchris  :Laughing: 

poi fedeli l'ha sistemato un po'...

ciao e complimenti per l'idea  :Wink: 

ciao

----------

## codadilupo

 *xchris wrote:*   

> a dire il vero il primo alchimista e' stato xchris 
> 
> poi fedeli l'ha sistemato un po'...
> 
> ciao e complimenti per l'idea 
> ...

 

azz! Convinto del contrario, da come era cominciato il topic  :Wink: 

Coda

----------

## xchris

questo non era il post originale...

prima si chiamava zorro  :Smile: 

ciao

----------

## codadilupo

 *xchris wrote:*   

> questo non era il post originale...
> 
> prima si chiamava zorro 
> 
> ciao

 

ehehe, capito  :Wink: 

Ad ogni modo, lo sto già modificando. Per qualche strana ragione sono presente due bachi:

1) i due find funzionano se il programma gira su x86. Se lo faccio girare su ppc64 (il motivo per cui nasce il tentativo) mi riportano:

"path must preceed expression"... che non ha senso, visto che il path precede effettivamente l'espressione. Ma qui ho risolto non usando il find  :Wink: 

2) pare che se gl'ebuild sono piu' di uno, alcuni vengano ricostruiti troncati, con conseguende fallimento del digest. Ci sto ancora lavorando  :Wink: 

Coda

----------

## xchris

in bocca al lupo codadilupo  :Laughing: 

buon lavoro...

gia' che ci sei metti anche le features che erano state richieste tempo fa.. (scorri il thread)

 :Wink: 

ciao

----------

## codadilupo

per aggiungere il pacchetto richiedente penso basti sostituire:

```
     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`
```

con

```
     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

     CLEAN_EXACT_NAME=`echo $RESULT | cut -d" " -f2`
```

e

```
         echo "$CLEAN_NAME ~$ARCH" >> /etc/portage/package.keywords
```

con

```
         echo "$CLEAN_NAME ~$ARCH" >> /etc/portage/package.keywords "# required by $CLEAN_EXACT_NAME"
```

Per il primo problema, smascherare la versione esatta oppure l'intero pacchetto, é piu' complicato, perché uno potrebbe scrivere:

```
forcekeymask -fm autorun
```

come

```
forcekeymask -fm sys-fs/autorun
```

come

```
forcekeymask -fm =autorun-3.15
```

come

```
forcekeymask -fm =sys-fs/autorun-3.15
```

ed é un casino  :Wink: 

Cioe', se si decide di mettere solo e soltanto la versione precisa, ok. Ma alternativamente, dobbiamo prima verificare cosa viene richiesto, ovvero prendere $PACKAGES, tagliare via l'uguale, tagliare la categoria (se esiste!) e verificare se corrisponde alla variabile CLEAN_EXACT_NAME moncata della categoria. Nel caso corrisponda scriviamo il pacchetto conpreso di versione, altrimenti senza... é oltre le mie possibilità al momento  :Wink: 

Coda

----------

## codadilupo

nuova versione: 0.4

- aggiunto il commento 'required` per ogni pacchetto

- migliorato l'output dei messaggi (un pochino piu' chiaro, spero)

- aggiunti un paio di controlli (se non hai PORTDIR_OVERLAY come faccio a lavorare  :Wink:  ?)

- rimosso il find in luogo di ls (vai a capire perché i ppc64 non lo capiscono... bah!)

- corretto un baco che eseguiva ripetutamente gli stessi digest (ma quanto so' pirla  :Wink: )

- le variabili di sistema ora vengono tutte recuperate automagicamente

- corretto il baco che troncava alcuni ebuild durante l'aggiunta della missing keywords

- codice ottimizzato

TODO: rendere disponibile la scelta tra singola versione o tutte le versioni masked... chi si offre   :Rolling Eyes:  ?

esempio:

```
#!/bin/bash

 

# Grazie a:

# xchris, che l'ha scritto

# fedeliallalinea, che l'ha curato

# mouser, che ha scritto il cuore della modifica

# andrea, che aveva bisogno della modifica

# lorenzo, che ha riassunto la modifica

emerge --info | grep '="' > /etc/portinfo

source /etc/portinfo

HILITE="\033[1m"

NORMAL="\033[0m"

RED='\E[31;01m'

GREEN='\E[32;01m'

YELLOW='\E[33;01m'

function usage {

    echo -e "\nUsage: forcekeymask [OPTION] [FILE]\n"

    echo -e ""

    echo -e "\nOption:"

    echo -e "  -fm, --force-merge"

    echo -e "  -p, --purge\n"

    echo -e "\nExample:"

    echo -e "   # forcekeymask -fm =xfce-base/xfce4-4.1.90"

    echo -e "   # forcekeymask -p"

    echo -e ""

    exit 1

}

function purge {

    source /sbin/functions.sh

    FILE=$1

    [ ! -s "${FILE}" ] && echo "Your ${FILE} needs no change!" && return 0

    END=`wc -l ${FILE} | awk '{print $1}'`

    [ -s ${FILE}.new ] && rm ${FILE}.new

    for i in `seq 1 ${END}`;

    do

      LINE=`cat ${FILE} | head -n ${i} | tail -n 1`

      #echo ${LINE}

      COMMENT=`echo ${LINE} | head -c 1`

      # Riporta le newline e i commenti

      if [ -z "${LINE}" ] || [ "${COMMENT}" = "#" ]

      then

     echo ${LINE} >> ${FILE}.new

      else

     # elimina versione e simboli del pacchetto

     CLEAN=`echo "${LINE}" | awk '{print $1}' | sed -e 's/-[0-9]/*/g' | cut -d* -f1 | sed -e 's/[<|>|=]/*/g' | tr -d "*"`

     # se esiste rimettilo nella lista se no rimuovi

     if [ -s /var/db/pkg/${CLEAN}* ]

     then

         echo ${LINE} >> ${FILE}.new

     else

         einfo "${LINE} ${RED}removed${NORMAL} from new list"

     fi

      fi     

    done

   

    DIFFERENCES=`diff ${FILE} ${FILE}.new`

   

    if [ -s "${DIFFERENCES}" ]

    then

   rm ${FILE}.new

   echo "Your ${FILE} needs no change!"

    else

   echo ""

   echo ${DIFFERENCES}

   echo ""

   echo "1) Update ${FILE}"

   echo "2) Discard changes"

   echo "3) Don't update,save changes in ${FILE}.new"

   echo -n "Select: "

   read ANSWER

   echo ""

   

   case $ANSWER in

       "1")

      mv  ${FILE}.new ${FILE}

      echo "${FILE} Updated!" ;;

       "2")

      rm ${FILE}.new

      echo "Changes dirscarded!" ;;

       "3")

      echo "Changes saved in ${FILE}.new" ;;

       *)

      echo "Option not valid!" ;;

   esac

   echo ""

    fi

}

function force_merge {

    source /sbin/functions.sh

    DONE=1

    PACKAGES=$1

    [ -s $ACCEPT_KEYWORDS ] && echo "Problem with your profile. No ARCH variable present!" && exit

    echo && einfo "Please Wait...\n"

    [ ! `/usr/bin/whoami` = 'root' ] && echo && einfo "Program require root access!" && echo && exit

    PRELIMINARY_CHECK=`emerge -p ${PACKAGES} 2>&1 | grep "no ebuilds to satisfy"`

    PRELIMINARY_CHECK1=`emerge -p ${PACKAGES} 2>&1 | grep "(try adding an '=')"`

    PRELIMINARY_CHECK2=`echo "$1" | head -c 1 --`

    [ "$PRELIMINARY_CHECK" ] && echo && einfo "No ebuild found!" && echo && exit

    [ "$PRELIMINARY_CHECK1" ] && echo && einfo "Specific key requires an operator (xfce-base/xfce4-4.1.90) (try adding an '=')" && echo && exit

    [ "$PRELIMINARY_CHECK2" = "-" ] && echo && einfo "No ebuild found!" && echo && exit

    [ ! -e  "/etc/portage" ] && einfo "Creating /etc/portage directory\n" && { mkdir /etc/portage || { einfo "ERROR...Quiting" && exit ;} }

    while [ $DONE ]

    do

     RESULT=`emerge -p ${PACKAGES} 2>&1 | grep "(masked" |  head -n 1`

     if [ "$RESULT" ]

      then

     ACTION_STRING=

     RESULT_FILTERED=`echo $RESULT | cut -d":" -f2`

     KEYWORD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "~"`

     HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

     MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

      if [ "$MISSING_MASKED" = "$RESULT_FILTERED" ]

       then

           echo && einfo "Package masked by missing keyword.. adding right keyword.. " && echo &&

      [ ! -e "$PORTDIR_OVERLAY" ] && einfo "creating PORTDIR_OVERLAY Tree.." && { mkdir -p $PORTDIR_OVERLAY || { einfo echo "ERROR...(no portage overlay defined ?) Quitting" && exit ;} }

      [ ! -e "$PORTDIR_OVERLAY/$CLEAN_NAME" ] && { mkdir -p $PORTDIR_OVERLAY/$CLEAN_NAME ||{ einfo echo "ERROR...(no write permissions ?) Quitting";} }

      [ -e "$PORTDIR" ] && einfo "overlaying ebuild.." && { cp -r /usr/portage/$CLEAN_NAME/ $PORTDIR_OVERLAY/$CLEAN_NAME/../ && echo || { einfo echo "ERROR...(no portage tree ?) Quitting" && echo && exit ;} }

        for EBUILD in `ls -R1 $PORTDIR_OVERLAY/$CLEAN_NAME | grep ebuild`; do

            cd $PORTDIR_OVERLAY/$CLEAN_NAME/

       cat $EBUILD | sed 's/\(KEYWORDS=\".*\)\(\"\)/\1 ~'$ACCEPT_KEYWORDS'\2/' > $EBUILD

            echo && einfo "creating digest up to date..for ${EBUILD}" && echo && /usr/sbin/ebuild ${EBUILD} digest

        done

 RESULT=`emerge -p ${PACKAGES} 2>&1 | grep "(masked" |  head -n 1`

      fi

     fi

     if [ "$RESULT" ]

     then

     ACTION_STRING=

     RESULT_FILTERED=`echo $RESULT | cut -d":" -f2`

     KEYWORD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "~"`

     HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

     MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

     REQUIRED_BY=`echo $RESULT | cut -d" " -f2`

     if [ "$HARD_MASKED" = "$RESULT_FILTERED" ]

     then

         echo "$CLEAN_NAME" >> /etc/portage/package.unmask

         ACTION_STRING=$RED"[HARD]"$NORMAL

     fi

       if [ "$KEYWORD_MASKED" = "$RESULT_FILTERED" ]

     then

         echo "$CLEAN_NAME ~$ACCEPT_KEYWORDS" >> /etc/portage/package.keywords "# required by $REQUIRED_BY"

         ACTION_STRING=$ACTION_STRING$YELLOW"[KEYWORD]"$NORMAL

     fi

     if [ ! "$ACTION_STRING" ]

     then

         echo && einfo "Don't know how to handle.. sorry!" && echo

         exit

     else

         echo -e $GREEN"*$NORMAL $CLEAN_NAME "$ACTION_STRING

     fi

      else

     echo && einfo "Your ebuild is emergeable!" && echo

     DONE=

      fi

    done

}

case $1 in

    -fm|--force-merge)

   [ $# -eq 1 ] && echo -e "\nSpecify one or more packages\n" && exit

   PACKAGES=`echo $* | cut -d " " -f2-`

   force_merge ${PACKAGES}

   ;;

    -p|--purge)

   purge "/etc/portage/package.keywords"

   purge "/etc/portage/package.unmask"

   ;;

    -h|--help)

     usage

     ;;

    *)

   echo "No valid option specified. Discarding changes..."

   #usage

   ;;

esac
```

CodaLast edited by codadilupo on Wed Mar 08, 2006 6:18 pm; edited 5 times in total

----------

## fedeliallalinea

Ti amo coda metto subito in /bin  :Very Happy: 

----------

## codadilupo

 *fedeliallalinea wrote:*   

> Ti amo coda metto subito in /bin 

 

eh, esagerato  :Wink: 

Prima provalo, che é notoriamente bacato   :Rolling Eyes: 

Coda

----------

## codadilupo

nuova versione. Dovrebbe essere semidecente, ora  :Wink: 

L'ho aggiornata nell'ultimo post.

Coda

----------

## .:chrome:.

credo di avere trovato un difettino:

```
forcekeymask -fm =x11-base/xorg-x11-7.0-r1

--- Invalid atom in /etc/portage/package.unmask: x11-base/xorg-x11 # required by x11-base/xorg-x11-7.0-r1

 * Please Wait...

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]

* x11-base/xorg-x11 [HARD]
```

e così via... fino al fatidico ^C

----------

## codadilupo

si', a quanto pare dentro il file package.unmask (quello per gl'HM) non é possibile mettere nemmeno un commento dopo la riga.

ho rimodificato il file nel post prova con questa nuova versione.

Coda

----------

## Luca89

Ho notato all'inizio queste righe qua:

```
emerge --info | grep '="' > /etc/portinfo

source /etc/portinfo

```

Se è un file che rigeneri ogni volta non è meglio metterlo in /tmp ? Non credo sia necessario tenere spazzatura in /etc. Inoltre per quanto riguarda il keyword maske non è necessario aggiungere "~x86" in package.keywords, se portage non trova nulla assume direttamente "~arch". Quindi basta metetre il nome del pacchetto e basta.

```
echo "$CLEAN_NAME ~$ACCEPT_KEYWORDS" >> /etc/portage/package.keywords "# required by $REQUIRED_BY"

         ACTION_STRING=$ACTION_STRING$YELLOW"[KEYWORD]"$NORMAL

```

Il requiredby non va inserito nel file? quindi dovrebbe essere:

```
echo "$CLEAN_NAME # required by $REQUIRED_BY" >> /etc/portage/package.keywords

         ACTION_STRING=$ACTION_STRING$YELLOW"[KEYWORD]"$NORMAL

```

Ho tolto anche l'accept_keywords perchè come ho detto sopra non serve se stai smascherando con ~arch.

----------

## codadilupo

 *Luca89 wrote:*   

> Ho notato all'inizio queste righe qua:
> 
> ```
> emerge --info | grep '="' > /etc/portinfo
> 
> ...

 

l'ho messo in /etc/ perché é un file di configrazione, e lo rigenero ogni volta perché potresti aver modificato alcune variabili in make.conf tra un uso e l'altro. Resta che puoi metterlo dove ti pare  :Wink: 

Per quel che riguarda ~x86 é un retaggio della versione scritta da xchris e fedeliallalinea... dovresti chiedere a loro  :Wink: 

 *Quote:*   

> Il requiredby non va inserito nel file?

 

t'assicuro che anche scritto cosi' il required by finisce come commento dentro il file. Anche qui, liberissimo di modificarlo  :Wink: 

Coda

----------

## .:chrome:.

io lo metterei in /usr/local/etc

----------

## cloc3

Ho avuto un piccolo problemino:

```

s939 ~ # forcekeymask -fm x11-libs/libXfont

/usr/local/bin/forcekeymask: line 99: [: amd64: binary operator expected

 * Please Wait...

* x11-proto/fontsproto [HARD]

* x11-libs/libfontenc [HARD]

* x11-proto/fontcacheproto [HARD]

* x11-libs/xtrans [HARD]

 * Your ebuild is emergeable!

```

Alla fine, comunque, il programma ha funzioanto correttamente.

Ma come mai quel messaggio di errore all'inizio?

----------

## Luca89

La riga 99 è questa:

```
[ -s $ACCEPT_KEYWORDS ] && echo "Problem with your profile. No ARCH variable present!" && exit

```

Modificala in:

```
[ -s "$ACCEPT_KEYWORDS" ] && echo "Problem with your profile. No ARCH variable present!" && exit

```

----------

## cloc3

 *Luca89 wrote:*   

> La riga 99 è questa:
> 
> ```
> [ -s $ACCEPT_KEYWORDS ] && echo "Problem with your profile. No ARCH variable present!" && exit
> 
> ...

 

Thx. cosa può fare una virgoletta!

----------

## cloc3

Coda. Mi meraviglio di te.

Il tuo programmino ha una simpatia spiccata per i caratteri proprietari:

```

s939 ~ # forcekeymask -fm =x11-base/xorg-x11-7.0-r1

 * Please Wait...

* x11-libs/libXft [HARD]

* x11-proto/fixesproto [HARD]

* x11-drivers/xf86-input-summa [HARD]

* x11-drivers/xf86-video-vga [HARD]

* x11-drivers/xf86-input-elo2300 [HARD]

* x11-drivers/xf86-video-vmware [HARD]

* x11-drivers/xf86-input-elographics [HARD]

* x11-drivers/xf86-input-jamstudio [HARD]

* x11-drivers/xf86-video-s3virge [HARD]

* x11-drivers/xf86-input-magictouch [HARD]

* x11-drivers/xf86-input-palmax [HARD]

* x11-drivers/xf86-input-dynapro [HARD]

* x11-libs/libXcomposite [HARD]

* x11-libs/libXfixes [HARD]

* x11-drivers/xf86-video-glint [HARD]

* x11-drivers/xf86-input-ur98 [HARD]

* x11-drivers/xf86-video-neomagic [HARD]

* x11-drivers/xf86-video-cirrus [HARD]

* x11-drivers/xf86-input-evdev [HARD]

* media-fonts/font-bitstream-type1 [HARD]

* x11-drivers/xf86-video-sisusb [HARD]

* x11-drivers/xf86-video-vesa [HARD]

* x11-drivers/xf86-video-tga [HARD]

* x11-drivers/xf86-input-citron [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

* media-fonts/font-adobe [HARD]

[taglio ... (pietoso)]

```

Cosa vuoi dire in tua discolpa?

 :Razz:   :Razz:   :Razz:   :Razz:   :Laughing:   :Laughing:   :Laughing:   :Laughing: 

Probabilmente c'è un problema con la sintassi troppo complessa di quei pacchetti.

Infatti, il paccehtto che dovrebbe scrivere sarebbe:

```

s939 ~ # emerge -pv xorg-x11

These are the packages that would be merged, in order:

Calculating dependencies |

!!! All ebuilds that could satisfy ">=media-fonts/font-adobe-100dpi-1" have been masked.

```

Dove, purtroppo, il -100dpi costituisce parte integrante del nome, anzichè della versione del pacchetto.

Infatti, corretto a mano quell'unico pacchetto, tutto è andato a posto:

```

...

* Your ebuild is emergeable!

...

```

----------

## codadilupo

confermo, il problema é dovuto al fatto che il nome del pacchetto non é portage compliant: in pratica parte di quello che é in realtà il nome viene tagliato via dalle regole (piu' che corrette) di cut scritte già nella prima versione di forcekeymask  :Wink: 

Coda

----------

## cloc3

Ho scoperto un altro casino.

In una configurazione molto spinta, ad un certo punto non riuscivo più a fare `emerge -uDpv world` per problemi di pacchetti mascherati.

Il messaggio finale dava la colpa alle dipendenze di kde-base/quanta (3.5.1).

Però un `forcekeymask -fm =kde-base/quanta-3.5.1` usciva senza risultati.

Alla fine, ho risolto modificando ancora lo script con un volgare:

```

sed -i -e 's/emerge -p/emerge -uDp/g' /usr/local/bin/forcekeymask

```

Naturalmente non è una soluzione consigliabile in assoluto.

Servirebbe un'opzione apposita per distinguere lo smaschermento normale da quello profondo.

----------

## codadilupo

 *cloc3 wrote:*   

> Ho scoperto un altro casino.
> 
> In una configurazione molto spinta, ad un certo punto non riuscivo più a fare `emerge -uDpv world` per problemi di pacchetti mascherati.
> 
> Il messaggio finale dava la colpa alle dipendenze di kde-base/quanta (3.5.1).
> ...

 

Beh, tieni presente che zorro esegue un emerge -p volutamente. Se il sistema é pulito, tu devi poter emergere senza chiedere -uD  :Wink: .

La soluzione, nel tuo caso, avrebbe potuto essere, credo:

```
# emerge -uDpvt --newuse world && revdep-rebuild

# zorro -p

# emerge -uDpvt --newuse world
```

dove l'ultimo emerge avrebbe dovuto riportarti uno 0

Coda

----------

## codadilupo

nuova versione, sostanzialmente una risistemazione, e l'accoglienza di qualche suggerimento:

```
#!/bin/bash

 

# Grazie a:

# xchris, che l'ha scritto                           >>>   xchris, who did it

# fedeliallalinea, che l'ha curato                     >>>   fedeliallalinea, who take care of it

# mouser, che ha scritto il cuore della modifica      >>>   mouser, who did the hack

# lorenzo, che ha riassunto la modifica               >>>   lorenzo, who stripped out the hack

# andrea, che aveva bisogno della modifica         >>>   andrea, who needed the hack

HILITE="\033[1m"

NORMAL="\033[0m"

RED='\E[31;01m'

GREEN='\E[32;01m'

YELLOW='\E[33;01m'

function usage {

    echo -e "\nUsage: forcekeymask [OPTION] [FILE]\n"

    echo -e ""

    echo -e "\nOption:"

    echo -e "  -fm, --force-merge"

    echo -e "  -p, --purge\n"

    echo -e "\nExample:"

    echo -e "   # forcekeymask -fm =xfce-base/xfce4-4.1.90"

    echo -e "   # forcekeymask -p"

    echo -e ""

    exit 1

}

emerge --info | grep '="' > /tmp/portinfo

source /tmp/portinfo

function purge {

    source /sbin/functions.sh

    FILE=$1

    [ ! -s "${FILE}" ] && echo "Your ${FILE} needs no change!" && return 0

    END=`wc -l ${FILE} | awk '{print $1}'`

    [ -s ${FILE}.new ] && rm ${FILE}.new

    for i in `seq 1 ${END}`;

    do

      LINE=`cat ${FILE} | head -n ${i} | tail -n 1`

      COMMENT=`echo ${LINE} | head -c 1`

      if [ -z "${LINE}" ] || [ "${COMMENT}" = "#" ]

      then

     echo ${LINE} >> ${FILE}.new

      else

     CLEAN=`echo "${LINE}" | awk '{print $1}' | sed -e 's/-[0-9]/*/g' | cut -d* -f1 | sed -e 's/[<|>|=]/*/g' | tr -d "*"`

     if [ -s /var/db/pkg/${CLEAN}* ]

     then

         echo ${LINE} >> ${FILE}.new

     else

         einfo "${LINE} ${RED}removed${NORMAL} from new list"

     fi

      fi     

    done

   

    DIFFERENCES=`diff ${FILE} ${FILE}.new`

   

    if [ -s "${DIFFERENCES}" ]

    then

   rm ${FILE}.new

   echo "Your ${FILE} needs no change!"

    else

   echo ""

   echo ${DIFFERENCES}

   echo ""

   echo "1) Update ${FILE}"

   echo "2) Discard changes"

   echo "3) Don't update,save changes in ${FILE}.new"

   echo -n "Select: "

   read ANSWER

   echo ""

   

   case $ANSWER in

       "1")

      mv  ${FILE}.new ${FILE}

      echo "${FILE} Updated!" ;;

       "2")

      rm ${FILE}.new

      echo "Changes dirscarded!" ;;

       "3")

      echo "Changes saved in ${FILE}.new" ;;

       *)

      echo "Option not valid!" ;;

   esac

   echo ""

    fi

}

function force_merge {

    source /sbin/functions.sh

    DONE=1

    PACKAGES=$1

    [ -s $ACCEPT_KEYWORDS ] && echo "Problem with your profile. No ARCH variable present!" && exit

    echo && einfo "Please Wait...\n"

    [ ! `/usr/bin/whoami` = 'root' ] && echo && einfo "Program require root access!" && echo && exit

    PRELIMINARY_CHECK=`emerge -p ${PACKAGES} 2>&1 | grep "no ebuilds to satisfy"`

    PRELIMINARY_CHECK1=`emerge -p ${PACKAGES} 2>&1 | grep "(try adding an '=')"`

    PRELIMINARY_CHECK2=`echo "$1" | head -c 1 --`

    [ "$PRELIMINARY_CHECK" ] && echo && einfo "No ebuild found!" && echo && exit

    [ "$PRELIMINARY_CHECK1" ] && echo && einfo "Specific key requires an operator (xfce-base/xfce4-4.1.90) (try adding an '=')" && echo && exit

    [ "$PRELIMINARY_CHECK2" = "-" ] && echo && einfo "No ebuild found!" && echo && exit

    [ ! -e  "/etc/portage" ] && einfo "Creating /etc/portage directory\n" && { mkdir /etc/portage || { einfo "ERROR...Quiting" && exit ;} }

    while [ $DONE ]

    do

     RESULT=`emerge -p ${PACKAGES} 2>&1 | grep "(masked" |  head -n 1`

     if [ "$RESULT" ]

      then

     ACTION_STRING=

     RESULT_FILTERED=`echo $RESULT | cut -d":" -f2`

     KEYWORD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "~"`

     HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

     MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

      if [ "$MISSING_MASKED" = "$RESULT_FILTERED" ]

       then

           echo && einfo "Package masked by missing keyword.. adding right keyword.. " && echo &&

      [ ! -e "$PORTDIR_OVERLAY" ] && einfo "creating PORTDIR_OVERLAY Tree.." && 

            { mkdir -p $PORTDIR_OVERLAY || { einfo echo "ERROR...(no portage overlay defined ?) Quitting" && exit ;} }

      [ ! -e "$PORTDIR_OVERLAY/$CLEAN_NAME" ] && 

            { mkdir -p $PORTDIR_OVERLAY/$CLEAN_NAME ||{ einfo echo "ERROR...(no write permissions ?) Quitting";} }

      [ -e "$PORTDIR" ] && einfo "overlaying ebuild.." && 

            { cp -r /usr/portage/$CLEAN_NAME/ $PORTDIR_OVERLAY/$CLEAN_NAME/../ && 

         echo || { einfo echo "ERROR...(no portage tree ?) Quitting" && echo && exit ;} }

        for EBUILD in `ls -R1 $PORTDIR_OVERLAY/$CLEAN_NAME | grep ebuild`; do

            cd $PORTDIR_OVERLAY/$CLEAN_NAME/

       cat $EBUILD | sed 's/\(KEYWORDS=\".*\)\(\"\)/\1 ~'$ACCEPT_KEYWORDS'\2/' > $EBUILD

            echo && einfo "creating digest up to date..for ${EBUILD}" && echo && /usr/sbin/ebuild ${EBUILD} digest

        done

 RESULT=`emerge -p ${PACKAGES} 2>&1 | grep "(masked" |  head -n 1`

      fi

     fi

     if [ "$RESULT" ]

     then

     ACTION_STRING=

     RESULT_FILTERED=`echo $RESULT | cut -d":" -f2`

     KEYWORD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "~"`

     HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

     MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

     REQUIRED_BY=`echo $1`

     if [ "$HARD_MASKED" = "$RESULT_FILTERED" ]

     then

         echo "$CLEAN_NAME" >> /etc/portage/package.unmask 

         ACTION_STRING=$RED"[HARD]"$NORMAL

     fi

       if [ "$KEYWORD_MASKED" = "$RESULT_FILTERED" ]

     then

         echo "$CLEAN_NAME ~$ACCEPT_KEYWORDS # required by $1" >> /etc/portage/package.keywords

         ACTION_STRING=$ACTION_STRING$YELLOW"[KEYWORD]"$NORMAL

     fi

     if [ ! "$ACTION_STRING" ]

     then

         echo && einfo "Don't know how to handle.. sorry!" && echo

         exit

     else

         echo -e $GREEN"*$NORMAL $CLEAN_NAME "$ACTION_STRING

     fi

      else

     echo && einfo "Your ebuild is emergeable!" && echo

     DONE=

      fi

    done

}

case $1 in

    -fm|--force-merge)

   [ $# -eq 1 ] && echo -e "\nSpecify one or more packages\n" && exit

   PACKAGES=`echo $* | cut -d " " -f2-`

   force_merge ${PACKAGES}

   ;;

    -p|--purge)

   purge "/etc/portage/package.keywords"

   purge "/etc/portage/package.unmask"

   ;;

    -h|--help)

     usage

     ;;

    *)

   echo "No valid option specified. Discarding changes..."

   ;;

esac
```

Coda

----------

## Cristian75

hem scusate ma come si usa questo tools ? help me 

ho provato a creare un file di testo è a renderlo eseguibila ma non funge 

sicuramente non so fare io mi potete spiegare come devo fare 

grazie

----------

## Onip

per lanciare un eseguibile che non sia nel $PATH devi specificare anche la dir in cui si trova.

ad es. se è nella stessa dir dove sei anche tu puoi fare così

```
# ./nome_script
```

Byez

----------

## f0llia

ciao a tutti,

lo script fin ora ha funzionato ottimamente ma :

```

forcekeymask -fm =x11-misc/engage-9999

 * Please Wait...

 * Don't know how to handle.. sorry!

```

Come posso fare ?

----------

## codadilupo

```
echo "=x11-misc/engage-9999" >>/etc/portage/package.keywords
```

zorro non capisce i pacchetti con nomi non standard

Coda

----------

## Luca89

Ho modificato un po' la versione di codadilupo, ecco quello che mi Ã¨ venuto fuori:

```
#!/bin/bash

 

# Grazie a:

# xchris, che l'ha scritto

# fedeliallalinea, che l'ha curato

# mouser, che ha scritto il cuore della modifica

# andrea, che aveva bisogno della modifica

# lorenzo, che ha riassunto la modifica

# luca, che ha modificato per supportare le directory /etc/portage/package.*/

emerge --info | grep '="' > /tmp/portinfo

source /tmp/portinfo

HILITE="\033[1m"

NORMAL="\033[0m"

RED='\E[31;01m'

GREEN='\E[32;01m'

YELLOW='\E[33;01m'

function usage {

    echo -e "\nUsage: forcekeymask [OPTION] [PKG]\n"

    echo -e ""

    echo -e "\nOption:"

    echo -e "  -fm, --force-merge"

    echo -e "  -p, --purge\n"

    echo -e "\nExample:"

    echo -e "   # forcekeymask -fm =xfce-base/xfce4-4.1.90"

    echo -e "   # forcekeymask -p"

    echo -e ""

    exit 1

}

function purge {

    source /sbin/functions.sh

    FILE=$1

    [ ! -s "${FILE}" ] && echo "Your ${FILE} needs no change!" && return 0

    END=`wc -l ${FILE} | awk '{print $1}'`

    [ -s ${FILE}.new ] && rm ${FILE}.new

    for i in `seq 1 ${END}`;

    do

      LINE=`cat ${FILE} | head -n ${i} | tail -n 1`

      #echo ${LINE}

      COMMENT=`echo ${LINE} | head -c 1`

      # Riporta le newline e i commenti

      if [ -z "${LINE}" ] || [ "${COMMENT}" = "#" ]

      then

     echo ${LINE} >> ${FILE}.new

      else

     # elimina versione e simboli del pacchetto

     CLEAN=`echo "${LINE}" | awk '{print $1}' | sed -e 's/-[0-9]/*/g' | cut -d* -f1 | sed -e 's/[<|>|=]/*/g' | tr -d "*"`

     # se esiste rimettilo nella lista se no rimuovi

     if [ -e "/var/db/pkg/${CLEAN}*" ]

     then

         echo ${LINE} >> ${FILE}.new

     else

         einfo "${LINE} ${RED}removed${NORMAL} from new list"

     fi

      fi     

    done

   

    DIFFERENCES=`diff ${FILE} ${FILE}.new`

   

    if [ -s "${DIFFERENCES}" ]

    then

   rm ${FILE}.new

   echo "Your ${FILE} needs no change!"

    else

   echo ""

   echo ${DIFFERENCES}

   echo ""

   echo "1) Update ${FILE}"

   echo "2) Discard changes"

   echo "3) Don't update,save changes in ${FILE}.new"

   echo -n "Select: "

   read ANSWER

   echo ""

   

   case $ANSWER in

       "1")

      mv  ${FILE}.new ${FILE}

      echo "${FILE} Updated!" ;;

       "2")

      rm ${FILE}.new

      echo "Changes dirscarded!" ;;

       "3")

      echo "Changes saved in ${FILE}.new" ;;

       *)

      echo "Option not valid!" ;;

   esac

   echo ""

    fi

}

function check_if_dir {

# Controlla se il file indicato Ã¨ una directory e se non viene specificato il

# file all'interno della directory restituisce errore

# Parametri: $1 => suffisso del file package.*

# Restituisce ${1}_file => file dove inserire i pacchetti

   if [ -d /etc/portage/package.$1 ]; then

      while [ -z $res ]; do

         echo "Your /etc/portage/package.$1 is a directory."

         echo -n "Specify the file name where you want to insert packages: "

         read res

         echo

      done

      

      export eval ${1}_file="/etc/portage/package.$1/$res"

   else

      export eval ${1}_file="/etc/portage/package.$1"

   fi

}

function force_merge {

    source /sbin/functions.sh

    DONE=1

    PACKAGES=$1

    [ -s $ACCEPT_KEYWORDS ] && echo "Problem with your profile. No ARCH variable present!" && exit 1

    echo && einfo "Please Wait...\n"

    [ ! `/usr/bin/whoami` = 'root' ] && echo && einfo "Program require root access!" && echo && exit 1

    PRELIMINARY_CHECK=`emerge -p ${PACKAGES} 2>&1 | grep "no ebuilds to satisfy"`

    PRELIMINARY_CHECK1=`emerge -p ${PACKAGES} 2>&1 | grep "(try adding an '=')"`

    PRELIMINARY_CHECK2=`echo "$1" | head -c 1 --`

    [ "$PRELIMINARY_CHECK" ] && echo && einfo "No ebuild found!" && echo && exit 1

    [ "$PRELIMINARY_CHECK1" ] && echo && einfo "Specific key requires an operator (xfce-base/xfce4-4.1.90) (try adding an '=')" && echo && exit 1

    [ "$PRELIMINARY_CHECK2" = "-" ] && echo && einfo "No ebuild found!" && echo && exit 1

    [ ! -e  "/etc/portage" ] && einfo "Creating /etc/portage directory\n" && { mkdir /etc/portage || { einfo "ERROR...Quiting" && exit 1;} }

    while [ $DONE ]

    do

     RESULT=`emerge -p ${PACKAGES} 2>&1 | grep "(masked" |  head -n 1`

     if [ "$RESULT" ]

      then

     ACTION_STRING=

     RESULT_FILTERED=`echo $RESULT | cut -d":" -f2`

     KEYWORD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "~"`

     HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

     MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

      if [ "$MISSING_MASKED" = "$RESULT_FILTERED" ]

       then

           echo && einfo "Package masked by missing keyword.. adding right keyword.. " && echo &&

      [ ! -e "$PORTDIR_OVERLAY" ] && einfo "creating PORTDIR_OVERLAY Tree.." && { mkdir -p $PORTDIR_OVERLAY || { einfo echo "ERROR...(no portage overlay defined ?) Quitting" && exit ;} }

      [ ! -e "$PORTDIR_OVERLAY/$CLEAN_NAME" ] && { mkdir -p $PORTDIR_OVERLAY/$CLEAN_NAME ||{ einfo echo "ERROR...(no write permissions ?) Quitting";} }

      [ -e "$PORTDIR" ] && einfo "overlaying ebuild.." && { cp -r /usr/portage/$CLEAN_NAME/ $PORTDIR_OVERLAY/$CLEAN_NAME/../ && echo || { einfo echo "ERROR...(no portage tree ?) Quitting" && echo && exit ;} }

        for EBUILD in `ls -R1 $PORTDIR_OVERLAY/$CLEAN_NAME | grep ebuild`; do

            cd $PORTDIR_OVERLAY/$CLEAN_NAME/

       sed -i -e 's/\(KEYWORDS=\".*\)\(\"\)/\1 ~'$ACCEPT_KEYWORDS'\2/' $EBUILD

            echo && einfo "creating digest up to date..for ${EBUILD}" && echo && /usr/sbin/ebuild ${EBUILD} digest

        done

 RESULT=`emerge -p ${PACKAGES} 2>&1 | grep "(masked" |  head -n 1`

      fi

     fi

     if [ "$RESULT" ]

     then

     ACTION_STRING=

     RESULT_FILTERED=`echo $RESULT | cut -d":" -f2`

     KEYWORD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "~"`

     HARD_MASKED=`echo $RESULT | cut -d":" -f2 | grep "package.mask"`

     MISSING_MASKED=`echo $RESULT | cut -d":" -f2 | grep "missing"`

     CLEAN_NAME=`echo $RESULT | cut -d" " -f2 | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1`

     REQUIRED_BY=`echo $RESULT | cut -d" " -f2`

     if [ "$HARD_MASKED" = "$RESULT_FILTERED" ]

     then

         [ -z $unmask_file ] && check_if_dir unmask

         echo "$CLEAN_NAME" >> $unmask_file

         ACTION_STRING=$RED"[HARD]"$NORMAL

     fi

       if [ "$KEYWORD_MASKED" = "$RESULT_FILTERED" ]

     then

         [ -z $keywords_file ] && check_if_dir keywords

         echo "$CLEAN_NAME" >> $keywords_file

         ACTION_STRING=$ACTION_STRING$YELLOW"[KEYWORD]"$NORMAL

     fi

     if [ ! "$ACTION_STRING" ]

     then

         echo && einfo "Don't know how to handle.. sorry!" && echo

         exit

     else

         echo -e $GREEN"*$NORMAL $CLEAN_NAME "$ACTION_STRING

     fi

      else

     echo && einfo "Your ebuild is emergeable!" && echo

     DONE=

      fi

    done

}

case $1 in

    -fm|--force-merge)

   [ $# -eq 1 ] && echo -e "\nSpecify one or more packages\n" && exit 1

   PACKAGES=`echo $* | cut -d " " -f2-`

   force_merge ${PACKAGES}

   ;;

    -p|--purge)

   purge "/etc/portage/package.keywords"

   purge "/etc/portage/package.unmask"

   ;;

    -h|--help)

     usage

     ;;

    *)

   echo "No valid option specified. Discarding changes..."

   #usage

   ;;

esac

```

Modifiche effettuate:

Non inserisce in package.keywords ~arch, perchÃ¨ non Ã¨ necessario.

PuÃ² gestire /etc/portage/package.{keywords,unmask}/ come directory, infatti il nuovo portage permette di far diventare ad esempio package.keywords una directory e inserire i pacchetti in file separati all'interno della directory.

----------

## codadilupo

figo!

Coda

----------

## Scen

 *Luca89 wrote:*   

> 
> 
> PuÃ² gestire /etc/portage/package.{keywords,unmask}/ come directory, infatti il nuovo portage permette di far diventare ad esempio package.keywords una directory e inserire i pacchetti in file separati all'interno della directory.
> 
> 

 

Azz!  :Shocked:  Questa non la sapevo!

Corro a documentarmi  :Smile: 

----------

## Luca89

 *Scen wrote:*   

> Azz!  Questa non la sapevo!
> 
> Corro a documentarmi 

 

Ha fatto furore questa nuova feature di portage  :Very Happy: 

----------

## Luca89

Salve,

Ho lavorato un altro po su forcekeymask e ho cambiato un po di cose, in particolare:

codice piÃ¹ pulito e ottimizzato (migliorata anche l'indentazione)

supporto anche a pacchetti del tipo: media-fonts/font-adobe-utopia-100dpi-1.0.1-r3 (ovvero con una stringa del tipo '-[0-9]*' nel nome).

pieno supporto alle directory /etc/portage/package.* anche nella funzione purge

maggiore utilizzo di /sbin/functions.sh (ebegin,einfo,ewarn,eerror)

aggiunto header licenza GPL-2

se presente, utilizza ekeyword (app-portage/gentoolkit-dev) per aggiungere la keyword negli ebuild

Visto che consta di parecchie righe l'ho messo su un servizio nopaste, lo trovate qui

----------

## fedeliallalinea

 *Luca89 wrote:*   

> Visto che consta di parecchie righe lo messo su un servizio nopaste, lo trovate qui

 

Not Found

The requested document was not found on this server.

----------

## Onip

@fedeliallalinea

Eccolo

----------

## fedeliallalinea

 *Onip wrote:*   

> @fedeliallalinea
> 
> Eccolo

 

gh

Pagina index mancante

La cartella /_altervista_ht/forcekeymask/ non contiene una pagina index.

Devi creare una pagina che si chiami index.html, index.htm oppure index.php (tutto minuscolo).

----------

## Onip

ehm... ho pensato che con wget fosse più comodo per tutti   :Wink: 

```
onip @ Hal9000 ~ $ wget http://onip.altervista.org/_altervista_ht/forcekeymask

--15:31:18--  http://onip.altervista.org/_altervista_ht/forcekeymask

           => `forcekeymask'

Risoluzione di onip.altervista.org in corso... 207.44.158.25

Connessione a onip.altervista.org|207.44.158.25:80... connesso.

HTTP richiesta inviata, aspetto la risposta... 200 OK

Lunghezza: 6,825 (6.7K) [text/plain]

100%[==============================================================>] 6,825         39.61K/s

15:31:19 (39.39 KB/s) - "forcekeymask" salvato [6825/6825]

```

----------

## Luca89

@fedeliallalinea

i link di altervista solitamente si devono aprire facendo copia e incolla

@Onip

Grazie per l'hosting  :Smile: 

----------

## Onip

grazie a te per il lavoro sullo script   :Laughing: 

----------

## Scen

Piccolo bug:

voglio smascherare kde-base/kdeartwork-meta-3.5.5, quindi:

```

# forcekeymask -k prova =kde-base/kdeartwork-meta-3.5.5

 * Please Wait...

 * kde-base/kdeartwork-meta [KEYWORD]

 * kde-base/kdeartwork-kwin-styles [KEYWORD]

 * kde-base/kdeartwork-styles [KEYWORD]

 * kde-base/kdeartwork-kworldclock [KEYWORD]

 * kde-base/kworldwatch [KEYWORD]

 * kde-base/kdeartwork-wallpapers [KEYWORD]

 * Your ebuild is emergeable!

```

Ma....

```

# emerge -pv kdeartwork-meta

These are the packages that would be merged, in order:

Calculating dependencies |

emerge: there are no ebuilds to satisfy "~kde-base/kdeartwork-emoticons-3.5.5".

(dependency required by "kde-base/kdeartwork-meta-3.5.5" [ebuild])

```

forcekeymask non aggiunge i seguenti pacchetti:

```

kde-base/kdeartwork-emoticons

kde-base/kdeartwork-iconthemes

kde-base/kdeartwork-icewm-themes

```

N.B. sto usando forcekeymask-1.1 installato tramite il Gechi Overlay  :Cool: 

----------

## ^Stefano^

questo script non è più disponibile? non volevo aggiungere un intero overlay per uno script ma sia sul sito di onip sia su nopaste non c'è traccia   :Question:   :Exclamation: 

eventualmente autounmask funziona bene? volevo installare gnome-2.18   :Very Happy: 

per adesso ho usato quello postato da Luca89 a pagina 3 perchè appunto l'altra versione non la riesco a scaricare.

----------

## dav_it

puoi farti il tuo overlay in locale (ad esempio in /usr/local/portage) e prendere l'ebuild da qui

http://overlays.gentoo.org/proj/sunrise/changeset/1670

comunque IMHO autounmask funziona davvero bene.

----------

