Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[SCRIPT] gérer /etc/portage/
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
olivier elmekki
n00b
n00b


Joined: 29 Jan 2006
Posts: 55

PostPosted: Tue Jul 11, 2006 7:40 pm    Post subject: [SCRIPT] gérer /etc/portage/ Reply with quote

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 ;)

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 :)

Code:

!/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
Back to top
View user's profile Send private message
BuBuaBu
l33t
l33t


Joined: 09 Jul 2005
Posts: 914
Location: France

PostPosted: Wed Jul 12, 2006 11:02 am    Post subject: Reply with quote

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)
Back to top
View user's profile Send private message
olivier elmekki
n00b
n00b


Joined: 29 Jan 2006
Posts: 55

PostPosted: Wed Jul 12, 2006 2:11 pm    Post subject: Reply with quote

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
Back to top
View user's profile Send private message
BuBuaBu
l33t
l33t


Joined: 09 Jul 2005
Posts: 914
Location: France

PostPosted: Wed Jul 12, 2006 9:22 pm    Post subject: Reply with quote

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/* ...


:oops:

J'avais rien compri au script ...
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum