# [SCRIPT] gérer /etc/portage/

## olivier elmekki

Bonjour,

    Ce script à pour but de permettre de gérer les fichiers présent dans /etc/portage/ avec une commande unique. On peut ajouter une entrée, en retirer/modifier une ou plusieurs, ou montrer le fichier (ou juste une partie du fichier). En le lançant par exemple avec les options '-r use compiz', on supprime tous les atoms intégrant 'compiz' dans leur nom. Le détail de l'utilisation est fourni dans la fonction usage().

    Je sais que ce genre d'outils prettent à polémique, parce que leur bénéfice semble peu important face à la perte de compréhension des rouages qu'ils impliquent, mais comme gentoo est une question de choix, n'hurlons pas au scandale, s'il vous plaît  :Wink: 

    J'en suis venu à faire ce script principalement par crainte de mettre un '>' à la place d'un '>>' à chaque fois que je faisais un echo 'atom use' >> package.use (par exemple). Il ne remplace pas un tâche forcément très fastidieuse, mais je pourrais rajouter des fonctionnalités si jamais quelqu'un s'en sert et m'en demande.

    J'apprécierai aussi beaucoup des critiques conceptuelles et stylistiques, car bash n'est pas mon langage favori, et je me sens un peu pateau avec  :Smile: 

```

!/bin/bash

# récupération des arguments

arg_mode="$1"

arg_fichier="$2"

declare -a expression

i=0

while [ "$3" != "" ]; do

   expression[i]="$3"

   i=$[i+1]

   shift

done

base='/etc/portage/package.'

usage() {

    echo "\

    usage: $0 <mode> <fichier> <expression>

    mode: -a: ajouter un élément au fichier

          -r: retirer un élément au fichier

          -s: chercher un élément dans le fichier

    fichier: au choix: keywords, use, mask ou unmask

    expression: l'expression doit être consitituée au minimum de l'atom concerné.

Si le fichier est keywords, un type de masque peut être spécifié, faute de quoi ~x86 est choisi par défaut.

Si le fichier est use, les use a enlever ou ajouter doivent être spécifier à la suite de l'atome.

        

    exemples:

        $0 -r keywords dev-lang/python

        $0 -a mask app-editors/emacs

        $0 -a use dev-lang/ruby threads doc -tcltk

        $0 -r use app-editor/vim vim-with-x

        $0 -s use

        $0 -s use x11-terms/rxvt-unicode

"

}   

    

# traitement des arguments

arg_parse() {

    case $arg_mode in

        "-a" ) mode="ajouter" ;;

        "-r" ) mode="retirer" ;;

        "-s" ) mode="voir" ;;

        * ) usage; exit;;

    esac

    if [ "$arg_fichier" == "keywords" ] || [ "$arg_fichier" == "use" ] || [ "$arg_fichier" == "mask" ] || [ "$arg_fichier" == "unmask" ]; then

        fichier="$arg_fichier"

    else

        usage

        exit

    fi

}

ajouter() {

    echo $1 >> $base$fichier

    echo "ajout effectué"

    exit

}

retirer() {

    f_tmp="/dev/shm/$fichier"

    cp $base$fichier $f_tmp

    cp $base$fichier $base$fichier"~"

    atom_preserv="$(echo $atom |sed 's/\//\\\//')" # il faut échapper le '/' dans le nom des atoms

    if [ "$fichier" == "use" ] && [ "${tab_uses[0]}" != "" ]; then

        i=0

        while [ "${tab_uses[$i]}" != "" ]; do

            awk '/'$atom_preserv'/ {sub(/ '${tab_uses[$i]}'/, "")}; {print}' $base$fichier > $f_tmp

            mv $f_tmp $base$fichier

            # on supprime toute la ligne s'il n'y a plus de use spécifié dedans

            un_use="$(awk '/'$atom_preserv'/ {print $2}' $base$fichier)"

            if [ "$un_use" == "" ]; then tab_uses[0]=""; retirer; fi

            i=$[$i+1]

        done

    else

        awk '$0 !~ "'$atom_preserv'"' $base$fichier > $f_tmp 2>&1

        mv $f_tmp $base$fichier

    fi

    echo -e "atom(s) modifié(s):\n" "$(cat $base$fichier"~" | grep $atom | cut -d ' ' -f 1)"

    exit

}

exist?() {

    # on quitte en cas de demande incohérente

    resultat="$(cat $base$fichier | grep $atom)"

    if [ "$fichier" != "use" ] && [ "$mode" == "ajouter" ] && [ "$resultat" != "" ]; then

        echo "cet atom est déjà présent dans $base$fichier"

        exit

    fi

    if [ "$mode" == "retirer" ] && [ "$resultat" == "" ]; then

        echo "cet atom n'est pas présent dans $base$fichier"

        exit

    fi

}

voir(){

    if [ "$atom" != "" ]; then

        recherche="$(cat $base$fichier | grep $atom)"

        recherche="$(awk '/'$atom'/ ' $base$fichier | grep $atom)"

        reg_atom="$(echo $atom | sed 's/^/\//')"

        reg_atom="$(echo $reg_atom | sed 's/$/\//')"

    else

        recherche="$(cat $base$fichier)"

    fi

    if [ "$recherche" == "" ]; then

        echo "cet atom n'est pas présent dans $base$fichier"

    else

        awk ''$reg_atom' {

            texte="\033[33m" $1

            i=2

            while ( i <= NF ) {

                if ( $i ~ /^-/ ) { texte=texte" \033[34m" }

                else { texte=texte" \033[31m" }

                texte=texte$i

                i++

            }

            print texte

        }' $base$fichier 2>&1

    fi

}

# main

arg_parse

atom=${expression[0]}

case $fichier in

    "keywords" )

        if [ "${expression[1]}" != "" ]; then keyword=${expression[1]}; else keyword="~x86"; fi # par défaut, le keyword est ~x86

        case $mode in

            "ajouter" ) exist?; ajouter "$atom $keyword";;

            "retirer" ) exist?; retirer;;

            "voir" ) voir;;

        esac;;

    "mask" | "unmask" )

        case $mode in

            "ajouter" ) exist?; ajouter $atom;;

            "retirer" ) exist?; retirer;;

            "voir" ) voir;;

        esac ;;

    "use" )

        declare -a tab_uses

        i=1

        while [ "${expression[$i]}" != "" ]; do tab_uses[$i-1]="${expression[$i]}"; i=$[$i+1];  done

        case $mode in

            "ajouter" )

                exist?

                if [ "$resultat" == "" ]; then

                    ajouter "$atom ${tab_uses[*]}"

                else

                    echo -e "atom(s) modifié(s):"

                    j=0

                    nbr_lignes=$(echo -e "$resultat" | wc -l)

                    for (( j=1; j <= nbr_lignes; j++ )); do

                        i=0

                        cp $base$fichier $base$fichier"~"

                        atom_tmp="$(echo -e "$resultat" | head -n $j | tail -n 1)"

                        while [ "${tab_uses[$i]}" != "" ]; do

                            resultat_preserv="$(echo -e "$atom_tmp" |sed 's/\//\\\//')"

                            sed -i 's/'"$resultat_preserv"'/'"$resultat_preserv"' '${tab_uses[$i]}'/' $base$fichier

                            i=$[$i+1]

                        done

                        echo -e "$atom_tmp" | cut -d ' ' -f 1

                    done

                fi

                ;;j

            "retirer" ) exist?; retirer;;

            "voir" ) voir ;;

        esac;;

esac

```

----------

## BuBuaBu

Le gros problème c'est que tout se barre au sync ...

Une solution serai de faire un overlay, et de copier le fichier modif dedans (avec tout ce qu'il faut)

----------

## olivier elmekki

 *Quote:*   

> Le gros problème c'est que tout se barre au sync ... 

 

  Je ne comprends pas ce que tu veux dire... Chez moi, emerge --sync ne touche pas à /etc/portage/* ...

  Il s'agit bien ici de ce qui ce trouve dans /etc/portage, et non pas de ce qu'il y a dans /usr/portage

----------

## BuBuaBu

 *olivier elmekki wrote:*   

>  *Quote:*   Le gros problème c'est que tout se barre au sync ...  
> 
>   Je ne comprends pas ce que tu veux dire... Chez moi, emerge --sync ne touche pas à /etc/portage/* ...
> 
> 

 

 :Embarassed: 

J'avais rien compri au script ...

----------

