# [SCRIPT] Démasquer les paquets via emerge

## bouleetbil

Depuis quelques temps j'en avais marre de modifier mes fichiers package.keywords et package.unmask, j'ai donc modifier emerge pour qu'il modifie ces fichiers à ma place et qu'il démasque les ebuilds nécessaires lorsque je veux démasquer un paquet qui a beaucoup de dépendances ou lors des mises à jour. (Je suis en x86 avec des paquets ~x86 et à chaque fois je dois modifier ces fichiers)

 Attention l'indentation est importante!!!

Faite une sauvegarde avant de ce fichier   :Laughing: 

Editer le fichier /usr/bin/emerge  :

Le code d'origine

```

                     for p in alleb:

                        mreasons = portage.getmaskingstatus(p,

                           settings=pkgsettings, portdb=portdb)

                        print "- "+p+" (masked by: "+string.join(mreasons, ", ")+")"

                        comment = portage.getmaskingreason(p,

                           settings=pkgsettings, portdb=portdb)

                        if comment and comment != oldcomment:

                           print comment

                           oldcomment = comment

                     print

                     print "For more information, see MASKED PACKAGES section in the emerge man page or "

                     print "refer to the Gentoo Handbook."

                  else:

                     print "\n!!! "+red("There are no packages available to satisfy: ")+green(xinfo)

                     print "!!! Either add a suitable binary package or compile from an ebuild."

               else:

```

Mes modifications :

```

                     last_packet=""

                     for p in alleb:

                        mreasons = portage.getmaskingstatus(p,

                           settings=pkgsettings, portdb=portdb)

                        print "- "+p+" (masked by: "+string.join(mreasons, ", ")+")"

                        #hack

                        last_packet=p

                        comment = portage.getmaskingreason(p,

                           settings=pkgsettings, portdb=portdb)

                        if comment and comment != oldcomment:

                           print comment

                           oldcomment = comment

                     print

                     print "For more information, see MASKED PACKAGES section in the emerge man page or "

                     print "refer to the Gentoo Handbook."

                     print "Demasquer le paquet "+last_packet+" ? "

                     Reponse=raw_input('(Oui/Non)')

                     if string.upper(Reponse) == "OUI":

                        #modification package.keywords

                        print "Mise a jour package.keywords"

                        fichero = open("/etc/portage/package.keywords", 'a')

                        packet = "="+last_packet+" ~x86\n"

                        fichero.write("#Ajout par hack emerge\n")

                        fichero.write(packet)

                        fichero.flush()

                        fichero.close()

                        #Modification package.unmask

                        print "Mise a jour package.unmask"

                        fichero = open("/etc/portage/package.unmask", 'a')

                        packet = "="+last_packet+"\n"

                        fichero.write("#Ajout par hack emerge\n")

                        fichero.write(packet)

                        fichero.flush()

                        fichero.close()

                        emerge_main()

                        #relance emerge pour dépendance du fichier démasqué

                  else:

                     print "\n!!! "+red("There are no packages available to satisfy: ")+green(xinfo)

                     print "!!! Either add a suitable binary package or compile from an ebuild."

               else:

```

Il suffit de modifier "~x86" à la ligne

```
 packet = "="+last_packet+" ~x86\n"
```

par votre plateforme

----------

## man in the hill

Salut,

Vraiment sympa ton hack   :Wink:  mais est-ce que ce fichier n'est pas écraser à chaque emerge de portage ?

Pour une fois j'arrive à capter python   :Very Happy:  , moi c'est clair que c'est la 2ème section (ajout ds unmask) qui m'intéresse en ~amd64 et il faudrait pour les amd64 une section pour le missing keyword ...

Sinon, super idée ! As-tu proposé aux dev ?

Merci,

@ +

----------

## bouleetbil

bonsoir, 

si à chaque emerge de portage il faut refaire la modification. J'ai pas proposé aux dev car il faudrait un peu plus l'améliorer comme recupérer le ACCEPT_KEYWORDS au lieu de le renseigner dans le script.  Je vais voire cela apres je leur posterais au pire je ferrais la modif a chaque mise à jour de portage  :Laughing: 

----------

## bivittatus

Salut!

Avant de tester ce script (superbe!!! :Laughing: ), j'aimerais un ou deux petits renseignements, sachant que la réponse doit se trouver dans ton code, mais je n'y connais pas grand chose!!!  :Embarassed: 

- Si tu as plusieurs paquets à démasquer (par exemple pour une install de gnome en ~x86, tu dois avoir une vingtane de paquets à te taper!!!  :Confused:  ), à partir du moment où tu lui réponds "oui", il les démasque tous?

- Est-ce que la ligne insérée dans le fichier cible est du type:

```
=nom_du_paquet-version ~x86"
```

ou bien:

```
nom_du_paquet ~x86
```

?

Merci  :Wink: 

----------

## bouleetbil

Bonjour,

Il faut répondre "oui" pour chaque paquet.

Et dans les fichiers cibles c'est inséré de la forme

```

=nom_du_paquet-version ~x86"

```

----------

## bivittatus

Merci pour ta réponse rapide!!!  :Wink: 

Ce n'est peut-être pas faisable, mais comme je n'y connais rien... :Laughing: 

Il n'y a pas la possibilité d'écrire sous la forme:

```
nom_du_paquet ~x86
```

?

C'est une simple question de flemme de ma part...une fois que le nom du paquet est dans le package.keywords, il y est une bonne fois pour toutes!!! Mais...je suppose que l'extraction du nom seul est quelque chose de difficilement réalisable?  :Embarassed: 

M'enfin, en tout cas, le principe est génial, et je pense que je vais l'adopter!!! :Wink: 

----------

## titoucha

J'aurais une suggestion, se serait bien que ton script n'écrive pas obligatoirement dans le fichier unmask mais seulement quand il y en a besoin ou mieux sur demande explicite, car il va vite devenir très gros inutilement et en plus je trouve dangereux de démasqué automatiquement, passer en testing oui, mais démasqué non.

----------

## bouleetbil

@bivittatus : En faite si on ecrit 

```
nom_du_paquet ~x86
```

 on a vite fait de passer en full testing tant dit qu'indiquer la version permet de démasquer le strict minimum.

Et oui avec un booleen on pourrait garder en mémoire le fait que l'on a répondu "oui" mais on peux démasquer beaucoup de paquets. Mais c'est faisable je vais voir pour l'ajouter.

@titoucha pour le moment je sais pas si le paquet est hardmask donc c'est vrai que j'écris pour rien dans  package.unmask  je savais que j'aurrais la remarque  :Embarassed:   (je vais voir si je peux savoir si le paquet est hardmak)

----------

## bivittatus

 *bouleetbil wrote:*   

> @bivittatus : En faite si on ecrit 
> 
> ```
> nom_du_paquet ~x86
> ```
> ...

 

Je sais oui;..mais c'est la méthode que j'utilise...  :Embarassed: 

En tout cas, c'est franchement super sympa de ta part... :Wink: 

----------

## titoucha

Ce qui me dérange le plus avec lhardmasked, c'est que ces derniers temps j'ai eu plusieurs paquets qui ont été downgradés, car la dernière version avait un bogue et les développeurs l'avaient masquée le temps de trouver celui-ci.

Avec ta méthode, vu que le paquet est aussi démasqué il n'aurait pas été mis à jour et le bogue serait resté.

Je pense que le fait de démasquer n'est pas une bonne idée et qu'il faudrait simplement écrire dans le fichier keyword.

----------

## bouleetbil

Cela n'aurrait rien changé à ton problème car en faite cela demasque les dépendances peux importe qu'elles soient testing ou hardmask mais si une version stable est disponible la version stable est prise en compte de plus la version est précisée, donc le downgrade fonctionne. Maintenant le problème est d'écrire dans portage.unmask alors que c'est pas utile.

----------

## titoucha

Heu tu es sur, car si ton paquet est en testing non masqué et que toi tu écris dans keyword et unmask, quand le paquet vient en testing et masqué rien ne change pour emerge vu que tu la démasqué précédemment et donc emerge ne va rien faire.

Le fait de mettre la version ne change rien, vu que le paquet ne disparait pas de l'arbre, mais est seulement masqué.

Enfin bon c'est comme ça que je comprends la chose.   :Smile: 

----------

## bouleetbil

oui en effet dans ce cas y a un problème. J'avais pas compris.

----------

## titoucha

Je suis rassuré, j'ai quand même compris un petit peu emerge   :Laughing: 

----------

## bouleetbil

Voici la derniere version qui ne demasque que les versions testing :

```

if "--usepkgonly" not in self.myopts:

                     print "\n!!! "+red("All ebuilds that could satisfy ")+green(xinfo)+red(" have been masked.")

                     print "!!! One of the following masked packages is required to complete your request:"

                     oldcomment = ""

                     #hack

                     last_packet=""

                     for p in alleb:

                        mreasons = portage.getmaskingstatus(p,

                           settings=pkgsettings, portdb=portdb)

                        print "- "+p+" (masked by: "+string.join(mreasons, ", ")+")"

                        #hack

                        result=str(mreasons)

                        if result.find("~")!= -1:

                           last_packet=p

                        comment = portage.getmaskingreason(p,

                           settings=pkgsettings, portdb=portdb)

                        if comment and comment != oldcomment:

                           print comment

                           oldcomment = comment

                     print

                     print "For more information, see MASKED PACKAGES section in the emerge man page or "

                     print "refer to the Gentoo Handbook."

                     #hack

                     if last_packet !="":

                        #on peux demasquer un packet

                        bo_demasque="0"

                        print "Demasquer le paquet "+last_packet+" ? "

                        Reponse=raw_input('(Oui/Non)')

                        if string.upper(Reponse) == "OUI":

                           bo_demasque="1"

                        if bo_demasque=="1":                        

                           print "Mise a jour package.keywords"

                           fichero = open("/etc/portage/package.keywords", 'a')

                           packet = "="+last_packet+" ~x86\n"

                           fichero.write("#Ajout par hack emerge\n")

                           fichero.write(packet)

                           fichero.flush()

                           fichero.close()

                           emerge_main()

                     else:

                        print "Un packet hardmask n'est pas demasque automatiquement"

```

@ bivittatus: J'ai pas ajouté le démasquage auto car en fait je trouve que c'est bien de savoir ce qui est démasqué. De plus c'est pas forcément lié au paquet qui vient d'etre demasqué.

Si vous voyez des modifs à faire ou des erreurs je suis preneur

----------

## titoucha

J'ai modifié une petite partie du programme parce que je suis une grosse flemme, j'aime pas taper oui en entier   :Very Happy: 

Ancien code

```
if string.upper(Reponse) == "OUI":

      bo_demasque="1" 
```

Nouveau code

```
Reponse=string.upper(Reponse)

if (Reponse == "OUI") or (Reponse == "O"):

     bo_demasque="1"
```

----------

## bivittatus

 *bouleetbil wrote:*   

> 
> 
> @ bivittatus: J'ai pas ajouté le démasquage auto car en fait je trouve que c'est bien de savoir ce qui est démasqué. De plus c'est pas forcément lié au paquet qui vient d'etre demasqué.
> 
> Si vous voyez des modifs à faire ou des erreurs je suis preneur

 

Pas de problème...c'est déjà super...merci!!!  :Wink: 

----------

