# [EBUILD] pmg - gérer les paquets instables  [MAJ-30-05-2006]

## distances

ChangeLog (dernière mise-à-jour le [30-05-2006])

révision 63 (ici présente):

 corrigé une mauvaise mise-à-jour de la fonction split_pkg...   :Embarassed: 

 quelques corrections, à plusieurs niveaux -- pas eu le temps de tester à fond...

 premier jet des fonctions de la version suivante:

 recherche exhaustive des dépendances masquées/instables et inclusion automatique ou manuelle

 affichage des USEs d'une ou de plusieurs versions d'un paquet (option -su de -U; "brutal", pour le moment...)

 mise-à-jour des message d'aide

Note: Les prochaines versions seront publiées sur la partie "Anglaise" du forum (https://forums.gentoo.org/viewtopic.php?p=3331388#3331388) -- je placerai toutefois toujours un lien et le ChangeLog ici

La dernière version et le ebuild se trouvent aussi sur mon serveur.

Récapitulatif:

```

pmg <CONFIG> [OPTIONS] <ACTION> <pkg> [FLAGS]

pmg-{use,cflags,keywords,mask,unmask,provided} <ACTION> <pkg> [FLAGS]

les CONFIG sont:

-U, package.use

-K, keywords

-UM, unmask

-M, mask

-C, clfags

-P, provided

les ACTIONS sont:

-d (delete) pour effacer l'entrée

-s (show) pour l'afficher

-ss (simply show) afficher le contenu du package.* en cours

-u (update) pour mettre à jour (mpg-use -u vim -acl)

-r (replace) pour remplacer

-a (add) pour ajouter

les OPTIONS sont:

-y effectue l'opération sans confirmation

-q n'affiche que les informations essentielles et les messages d'erreur

-qq n'affiche rien (n'effectue aucune action interactive si -y n'est pas activé)

-h affiche l'aide

-V affiche les informations de version et sort

-- fin des options 

```

------------------------

Hello!

A force d'en avoir assez de faire des echo dans les fichiers /etc/portage/package.{use,keywords,etc}, j'ai fini par écrire un script qui me permet d'y faire des modifs en une seule commande: afficher une entrée existente, la modifier, la supprimer ou la réécrire.

Je le poste ici, si ça intéresse quelqu'un, j'attends des retours avec plaisir  :Wink: 

L'utilisation est assez simple, et l'installation, un simple coup de main:

le programme principal s'appelle pmg

on en tire des liens correspondant à la config, de la sorte: "ln -s pmg pmg-use pour package.use" ... Simple, non ?

Il faut placer le fichier "messages" dans /usr/share/pmg/ ; celui-ci permet d'afficher les messages selon la localisation (français et anglais, pour le moment)

Voila!

Voici maintenant les codes:

le script  principal pmg 

```

#!/bin/bash

# distances.dbdl -- MMVI

# $Id: pmg 63 2006-05-30 16:49:36Z root $

# $Rev: 63 $

# $Author: root $

# $URL: file:///var/svn_root/admin/pmg-tools/branches/pmg-tools-br-0-29-1/pmg $

#

# pmg -- tool to manage packages in /etc/portage/config.files

# Usage: pmg <CONFIG> <ACTION> <pkg> [FLAGS]

#        pmg[-CONFIG] <action> <pkg> [FLAGS]

#

shopt -s extglob

#

# init config#

[ -f /etc/pmg/pmgrc ] && . /etc/pmg/pmgrc

[ -f $HOME/.pmgrc ] && . $HOME/.pmgrc

COLORS=${COLORS:=1}

LIBRARIES_PATH=${LIBRARIES_PATH:=/usr/share/pmg}

. $LIBRARIES_PATH/messages 2>/dev/null || { echo -ne "Error: LIBRARIES_PATH not found! Can't go on!\n"; exit 1; }

. /etc/make.globals

. /etc/make.conf

 

#set -x 

#

# vars #

VERSION='0.9 # $Rev 63 $'

AUTHOR="distances -- s.distances.dbdl - at - free fr"

LICENCE=GPL

DATE=20063005

DEFAULT_ARCH=${DEFAULT_ARCH:=~x86}

DEBUG=${DEBUG:=0}

ADD_ENTRIE=0

ADD_COMMENTS=0

DELETE_CONFIG=0

SHOW_CONFIG_FILE=0

SHOW_ONLY=0

REPLACE_CONFIG=0

UPDATE_CONFIG=0

QUIET=0

REALLYQUIET=0

PKG_REPOS="null"

MIN_ARGS=1

DONT_ASK=0

# how will we speak, today?...

LG=${LANG%@*}; LG=${LG%_*}; LG=$(echo $LG | tr '[a-z]' '[A-Z]'); LG=${LG:=EN}

if [ ! "$LG" = "EN" ] && [ ! "$LG" = "FR" ]; then

   LG="EN"; fi

# this array and the VARs fallowing are used to parse valid options for programs that invoque us, as these

#+are sym. links and don't all have the same exact functions, they don't have the same exact options neither...

# the array contains all the options and their descritions (a VAR, that'll be sent to 'mess')

# the VARs below this array contain only indexes from the array that represent valid options for the invoking program

DESCRIPTIONS=(\

-d "OPT_DELETE_ENTRY" \

-s "OPT_SHOW_CONFIG" \

-r "OPT_REPLACE_CONFIG" \

-u "OPT_UPDATE_CONFIG" \

-a "OPT_ADD_ENTRY" \

-h "OPT_HELP" \

-q "OPT_BE_QUIET" \

-qq "OPT_REALLYQUIET" \

-y "OPT_DONT_ASK" \

-ss "OPT_SHOW_CONFIG_FILE" \

-c "OPT_COMMENTS" \

-V "OPT_VERSION" \

-K "OPT_KEYWORDS" \

-U "OPT_USE" \

-UM "OPT_UNMASK" \

-M "OPT_MASK" \

-C "OPT_CFLAGS" \

-P "OPT_PROVIDED" \

-su "OPT_SHOW_EUSES" \

)

VALID_FOR_all="1 3 5 9 11 13 15 17 19 21 23" # -d -s -r -a -h -q -qq -ss -c -V

VALID_FOR_keywords="$VALID_FOR_all" 

VALID_FOR_use="$VALID_FOR_all 7 37"

VALID_FOR_unmask="$VALID_FOR_all"

VALID_FOR_mask="$VALID_FOR_all"

VALID_FOR_cflags="$VALID_FOR_all"

VALID_FOR_provided="${VALID_FOR_all}" 

VALID_FOR_pmg="$VALID_FOR_all 7 23 25 27 29 31 33 35 37" # everything :)

#

# functions ##

# usage: version [-v|-a]

version() {

    case $1 in

   -a)

       echo "${0##*/} -- licence $LICENCE -- version $VERSION - $DATE -- $AUTHOR"

       ;;

   *)

       echo "$VERSION"

       ;;

    esac

}

usage() {

    local myuse=VALID_FOR_${ME}

    mess -e "${CY}Usage: ${0##*/} ${BL}<CONFIG> [OPTIONS] <ACTION> ${GR}PKG ${YL}[PKG_CONFIG]${NO}\n"

    local -a new_DESC

    for opt_usage in ${!myuse}

      do

      mess -e "\t"${BL}${DESCRIPTIONS[$((${opt_usage}-1))]}${NO}"\t"${CY} ${DESCRIPTIONS[$opt_usage]} ${NO}

    done

    mess -e ""

    exit 1

}

# check if options are valid for this program

# do this by parsing with the array we talked about before (DESCRIPTORS)

# usage: check_options OPT

check_options() {

    local LOPT=$1; shift

    local LLINE=$@

    local myuse=VALID_FOR_${ME}

      #-a|-s|-h|-q|-d|-r)

    case $LOPT in

      *)

      for opt in ${!myuse}

      do

      if [ x${LOPT} = x${DESCRIPTIONS[$((opt-1))]} ]; then 

         return 0

         fi

      done

      return 1

      ;;

   esac

      return 0

}

# check for possible package(s) in portage repositories

# usage: c_i_p_e PKG CATEGORY

check_if_pkg_exists() {

   local LPKG=$1

   local LREPOS=$2

   local LPKG_VERSION=${3:-null}

   local LPKG_MODIF=${4:-null}

   local LPKG_REPOS="null"

   if [ "$LREPOS" = "null" -o "$LREPOS" = "" ]; then

      for ovl in ${PORTDIR} ${PORTDIR_OVERLAY}

      do

         pushd $ovl >/dev/null

         for rep in *

         do

            if [ -d ${rep}/${LPKG} ]; then

               LPKG_REPOS=${rep}

               break

            fi

         done

         popd >/dev/null

      done

      if [ ! "$LPKG_REPOS" = "null" ]; then

         PKG_REPOS=$LPKG_REPOS

         #get_ebuild $LPKG_REPOS $LPKG

         return 0

      fi

   else

      for rep in $PORTDIR $PORTDIR_OVERLAY

      do

         if [ -d ${rep%/}/${LREPOS%/}/${LPKG} ]; then

            return 0

         fi

      done

   fi

   return 1

}

# split pkg name in version, repository, etc.

# usage: split_pkg PKG (PKG not necessarilly in the form repos/pkg; can be only pkg -- for external use, however, it should be repos/pkg...)

# usage split_pkg [M][REPOS/]PKG[-VERSION] [DEST_VAR]

split_pkg() {

    local LDEST_VAR=PKG

        [ "$1" = "-d" ] && { LDEST_VAR=$2; shift 2; }

    local LUSER_PKG=${1%.ebuild}

    local LPKG=${LUSER_PKG##*/}

    local LREPOS=${LUSER_PKG%%/*}

    case $LREPOS in

        ">="*|"<="*)

        LDEST_GLE="\${LREPOS:0:2}"

                ldgle="${LDEST_VAR}_GLE"

        LDEST_NAME=${LPKG%%-[0-9]*}

        LDEST_VERSION=${LPKG/${LDEST_NAME}}

        LDEST_REPOS=${LREPOS:2}

        ;;  

        '='*)

        LDEST_GLE='='

        LDEST_NAME=${LPKG%%-[0-9]*}

        LDEST_VERSION=${LPKG/${LDEST_NAME}}

        LDEST_REPOS=${LREPOS:1}

        ;;  

        '<'*|'>'*)

        LDEST_GLE="\${LREPOS:0:1}"=

        LDEST_NAME=${LPKG%%-[0-9]*}

        LDEST_VERSION=${LPKG/${LDEST_NAME}}

        LDEST_REPOS=${LREPOS:1}

        ;;  

      *)

      LDEST_GLE=null

      LDEST_NAME=${USER_PKG##*/}

      LDEST_LNAME=$LDEST_NAME

      LDEST_NAME=${LDEST_NAME%%-[0-9]*}

      LDEST_VERSION=${LDEST_LNAME/${LDEST_NAME}}

      LDEST_REPOS=${USER_PKG%%/*}

      [ x"$LDEST_REPOS" = x"${USER_PKG}" ] && LDEST_REPOS=null

      ;;

   esac

   [ "$LDEST_GLE" == "null" ] && LDEST_GLE=""

   [ "$LDEST_VERSION" == "null" ] && LDEST_VERSION=""

   [ "$LDEST_REPOS" == "$USER_PKG" ] && LDEST_REPOS="null"

   # fill DEST_VAR

   eval $"$LDEST_VAR"_GLE=${LDEST_GLE}

   eval $"$LDEST_VAR"_REPOS=${LDEST_REPOS}

   eval $"$LDEST_VAR"_NAME=${LDEST_NAME}

   eval $"$LDEST_VAR"_VERSION=${LDEST_VERSION}

}

# calls split_pkg and chech_if_pkg_exits then build PKG var, according to which config is managed

# for exemple, package.use doesn't support [><]=repos/pkg-VERSION as a valid atom 

# usage: g_r_p_n PKG

get_real_pkg_name() {

    local USER_PKG=$1

    #split PKG in PKG_VERSION, PKG_REPOS, etc.

    split_pkg $USER_PKG

    if ((SHOW_ONLY)); then

      [ ! x"${PKG_REPOS}" = x"null" ] && PKG=${PKG_GLE}${PKG_REPOS}/${PKG_NAME}${PKG_VERSION} || PKG=${PKG_NAME}${PKG_VERSION}

    elif check_if_pkg_exists $PKG_NAME $PKG_REPOS; then

      case $ME in

         use|cflags)

         # package.use don't want of a versionned package...

         # nor my hacked packaged.cflags

         PKG=${PKG_REPOS}/${PKG_NAME}

         ;;

         mask|unmask)

         PKG=${PKG_GLE}${PKG_REPOS}/${PKG_NAME}${PKG_VERSION}

         # don't need FLAGS for these ones

         USER_CFG=""

         PKG_CFG=""

         MIN_ARGS=1

         ;;

         keywords)

         PKG=${PKG_GLE}${PKG_REPOS}/${PKG_NAME}${PKG_VERSION}

         USER_CFG=${USER_CFG:=${DEFAULT_ARCH}}

         ;;

         provided)

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

            # mess ERR_VERSION_REQUIRED FOR $LPORTAGE_CONFIG

            # exit 1

            return 1

         fi

         PKG=${PKG_REPOS}/${PKG_NAME}${PKG_VERSION}

         MIN_ARGS=1

         ;;

         *)

         PKG=${PKG_GLE}${PKG_REPOS}/${PKG_NAME}${PKG_VERSION}

         ;;

      esac

   # all found repositories are separated by spaces, then if we find one, that means there's more than one possible package...

        if [ ! "${PKG_REPOS/ /}" = "${PKG_REPOS}" ]; then

         #mess -e $RD TOO_MANY_REPOS FOR_PKG \"${NO}${GR}${USER_PKG}${NO}\":

         #for atom in $PKG_REPOS

         #do

         #   mess -e "\t${GR}${atom}/${PKG_NAME}${NO}"

         #done

         #exit 1

         return 2

      fi

    else

      #mess -e ERR_PKG_NOT_FOUND FOR_PKG ${GR}${USER_PKG}${NO}

      #exit 1

      return 3

    fi

    return 0

}

# get multiple RE lines

grep_mlines() {

    local LRE="$1"; shift

    local LFILE="$@"

    LOUT="$(sed -n -e '/^'$LRE'/ {

    /.*\"$/ !b label

    b out

    :label

    N

    /\n.*\"$/ !b label

    :out

    p

}' $LFILE)"

   if [ x"${LOUT}" = "" ]; then

      return 1

   else

       echo "$LOUT"

      return 0

   fi

return 1

}

# get package dependencies

# usage: PKG_EBUILD [DEST_VAR]

get_dependencies() {

   local LPKG_EBUILD=${1:-${PKG_EBUILD}}

   [ x"${LPKG_EBUILD}" = x"" ] && return 1

   local LDEST_VAR=${2:-${PKG_DEPEND}}

   local LMDEPENDS=""

   if LMDEPENDS="$(grep_mlines DEPENDS ${LPKG_EBUILD})"; then

      LMDEPENDS=${LMDEPENDS/#DEPENDS=\"}

      LMDEPENDS=${LMDEPENDS/%\"}

   fi

   echo $LMDEPENDS

}

check_dependencies() {

   return 0

}

# get best ebuild for PKG

# usage: get_ebuild [-d DEST_VAR] [PKG_REPOS [PKG_NAME [PKG_VERSION [PKG_LGE]]]]

get_ebuild() {

   local LDEST_VAR=PKG

   [ "$1" = "-d" ] && { LDEST_VAR=$2; shift 2; }

   local LPKG_REPOS=${1:-${PKG_REPOS}}

   local LPKG_NAME=${2:-${PKG_NAME}}

   local LPKG_VERSION=${3:-${PKG_VERSION}}

   local LPKG_LGE=${4:-${PKG_LGE}}

   local LEBUILD=$(equery w ${LPKG_GLE}${PKG_REPOS}${PKG_NAME}${PKG_VERSION})

   # equery doesn't return error code... Why, but why

   [ x"${LEBUILD%%.ebuild}" = x"${LEBUILD}" ] && LEBUILD=""

   eval $"$DEST_VAR"_EBUILD=\$LEBUILD

}

# create backup of given or current config file

# usage: backup_config [PORTAGE_CONFIG]

backup_config() {

    LCFG_FILE=${1:-${LPORTAGE_CONFIG}}

    \cp -f ${LCFG_FILE} $LCFG_FILE.bak && return 0 || cant_write

}

# get values for pkg withing actual or given config file

# usage: get_pkg_config PKG [CONFIG_FILE]

get_pkg_config() {

    local LPKG=${1:-${PKG}}; shift

   local LPKG_REPOS=${PKG_REPOS}

    local LLPORTAGE_CONFIG=${@:-${LPORTAGE_CONFIG}}

   local LPATTERN

   #split_pkg LPKG LDEST_PKG

   # temporary solution while split_pkg's not achieved

   if [ ! "$PKG_REPOS" = "" -a ! "$PKG_REPOS" = "null" ]; then

      LPATTERN=${LPKG_REPOS}/${LPKG/${LPKG_REPOS}\/}

      if [ ! "$PKG_GLE" = "" -a ! "$PKG_GLE" = "null" ]; then

         LPATTERN="${PKG_GLE}${LPATTERN/${PKG_GLE}}"

      fi

   else

      if [ ! "$PKG_GLE" = "" -a ! "$PKG_GLE" = "null" ]; then

         LPATTERN="^${PKG_GLE}.*/${LPKG}"

      else

         LPATTERN="^.*/${LPKG}"

      fi

   fi

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

      LPATTERN=${LPATTERN/${PKG_VERSION}}${PKG_VERSION}

   fi

   ((DEBUG)) && echo $LPATTERN

    # if something's found for PKG, then PKG_CFG contains something

    if PKG_CFG=$(grep -w "${LPATTERN}" $LLPORTAGE_CONFIG); then

      ((DEBUG)) && echo -ne "first found:\n$PKG_CFG\n"

      LPKG=${PKG_CFG%% *}; PKG=$LPKG

      PKG_CFG=${PKG_CFG/$LPKG}; PKG_CFG=${PKG_CFG/# }; return 0

   # didn't find something? try to expand a little bit...

   elif PKG_CFG=$(grep -w "${LPATTERN}.*[0-9] " $LLPORTAGE_CONFIG); then

      ((DEBUG)) && echo -ne "second found:\n$PKG_CFG\n"

      LPKG=${PKG_CFG%% *}; PKG=$LPKG

      PKG_CFG=${PKG_CFG/$LPKG}; PKG_CFG=${PKG_CFG/# }; return 0

   # really found nothing ? (package.provided case)

    elif PKG_CFG=$(grep -w "${LPATTERN}" $LLPORTAGE_CONFIG); then

      ((DEBUG)) && echo -ne "first found:\n$PKG_CFG\n"

      LPKG=${PKG_CFG%% *}; PKG=$LPKG

      PKG_CFG=${PKG_CFG/$LPKG}; PKG_CFG=${PKG_CFG/# }; return 0

   elif PKG_CFG=$(grep "${LPKG}.*\$" $LLPORTAGE_CONFIG); then

      ((DEBUG)) && echo -ne "third found:\n$PKG_CFG\n"

      LPKG=${PKG_CFG%% *}; PKG=$LPKG

      PKG_CFG=${PKG_CFG/$LPKG}; PKG_CFG=${PKG_CFG/# }; return 0

   fi

   ((DEBUG)) && echo "lpkg.config: $(grep "${LPKG}" $LLPORTAGE_CONFIG)"

   return 1 

}

#

# usage: show_ebuild_uses [ -d DEST_VAR ] PKG_ALL

show_ebuild_uses() {

   local LDEST_VAR=PKG

   [ "$1" = "-d" ] && { DEST_VAR=$2; shift 2; }

   local LPKG_ALL=$1

   local LPKG_EUSES

   LPKG_EUSES="$(equery -N uses -a $LPKG_ALL)"

   eval $"$LDEST_VAR"_EUSES=\$LPKG_EUSES

}

# show actual or given config with plenty of colors :)

# usage: show_config [-i|-e] [PKG [PKG_CFG]]

show_config() {

    [ "$1" = "-e" -o "$1" = "-i" ] && { local MOPT=$1; shift; }

    local LPKG=${1:-${PKG}}; shift

    local LPKG_CFG=${@:-${PKG_CFG}}

   use_msg=$(echo " $LPKG_CFG" | sed -e "s:\([+\ ][a-z]*[-]*[0-9a-z]*\):"$BL"\1"$NO":g;s:\(\ -[a-z]*[-]*[0-9a-z]*\):"$RD"\1"$NO":g;s:~amd64\|~hppa\|~ia64\|~mips\|~ppc\|~ppc64\|~sparc\|~x86\|\-\*\|~\*:${RD}&${NO}:g;s:\ \+: :g;s:^\ ::;s:\ $::")

    mess $MOPT "${GR}${LPKG}${NO}${use_msg}"

}

# here we are, the big stuff!

update_config() {

   # is there really a change ?

    if [ ! x${USER_CFG// } = x${PKG_CFG// } ]; then

   local NEW_PKG_CFG=" $PKG_CFG "

        # look inside the users given flags

   for u in $USER_CFG

     do

     local tmp_NP=$NEW_PKG_CFG 

     local REPLACED=0

          # to manage signs +- and space in front of flag

     usign="${u:0:1}"

     case $usign in

              +)

        u=${u:1}

        usign=""

        ;;

         -)

        u=${u:1}

        usign="-"

        ;;

         *)

        usign=""

        ;;

     esac

     # do we have a "no sign" in USEs matching our FLAG?

     if [ ! "${tmp_NP}" = "${NEW_PKG_CFG// ${u} }" ]; then

         # if then, is our $sign$flag is the same ?

         if [ "${tmp_NP}" = "${NEW_PKG_CFG// ${u} / ${usign}${u} }" ]; then

        # yes, it is... No change, then

        REPLACED=1

         else

        # ok, let me put my sign into you :/

        NEW_PKG_CFG=${NEW_PKG_CFG// ${u} / ${usign}${u} }; REPLACED=1; fi

     fi

     # or do we have a sign ?

       if ((!$REPLACED)) && [ ! "${tmp_NP}" = "${NEW_PKG_CFG// [-+]${u} }" ]; then

         if [ "${tmp_NP}" = "${NEW_PKG_CFG// [-+]${u} / ${usign}${u} }" ]; then

        REPLACED=1

         else

        # let's exchange signs, together...

        NEW_PKG_CFG=${NEW_PKG_CFG// [-+]${u} / ${usign}${u} }; REPLACED=1; fi

     fi

     if ((! $REPLACED)) && [ x"${NEW_PKG_CFG// }" = x"${tmp_NP// }" ]; then

         NEW_PKG_CFG="${NEW_PKG_CFG/% } ${usign}${u/# }"; fi

   done

   # has something changed?

   if [ ! x"${NEW_PKG_CFG// }" = x"${PKG_USE// }" ]; then

            # question users about their real motivations...

       if ((! $DONT_ASK)); then

      mess -i ABOUT_TO_UPDATE FOR_PKG ${GR}${PKG} IN ${YL}${LPORTAGE_CONFIG}${NO}"\n" FROM

      show_config -i 

      mess -i TO

      show_config -i $PKG $NEW_PKG_CFG

      if ! ask_user; then mess -e ERR_ABORTED_BY_USER; exit 1; fi

       fi

            # make a safety backup

       backup_config

            # sed here is much more efficient

       sed -i "s:${PKG_CFG}:${NEW_PKG_CFG/# }:" $LPORTAGE_CONFIG >/dev/null || cant_write

       mess CONFIG_CHANGED FOR_PKG ${GR}$PKG${NO}

      fi

   else 

      mess NOTHING_TO_CHANGE FOR_PKG ${GR}${PKG} IN ${YL}${LPORTAGE_CONFIG}${NO}

    fi

}

# the easy-with-sed-in-place replace string function

replace_config() {

    if [ ! x${USER_CFG// } = x${PKG_CFG// } ]; then

      if ((! $DONT_ASK)); then

         mess -e ABOUT_TO_REPLACE ${GR}${PKG}${NO}

         show_config

         mess -e FROM

         mess -e ${YL}${LPORTAGE_CONFIG}

         mess -e TO

         show_config $PKG $USER_CFG

         if ! ask_user; then 

            mess ERR_ABORTED_BY_USER && exit 1

         fi

      fi

      backup_config

      sed -i "s:^"$PKG".*$:${PKG} ${USER_CFG}:" $LPORTAGE_CONFIG || cant_write

      mess CONFIG_CHANGED FOR_PKG ${GR}$PKG"\n"

   else

      mess NOTHING_TO_CHANGE FOR_PKG ${GR}${PKG} IN ${YL}${LPORTAGE_CONFIG}${NO}

      exit 0

   fi

}

# and the real-still-with-sed-easy delete function

delete_config() {

    if ((! $DONT_ASK)); then

   mess -e ABOUT_TO_DELETE ${GR}${PKG} FROM ${YL}${LPORTAGE_CONFIG}${NO}

   if ! ask_user; then mess ERR_ABORTED_BY_USER; exit 1; fi

    fi

    backup_config

    sed -i 's:^'$PKG'.*$::;/^$/ d' $LPORTAGE_CONFIG >/dev/null || cant_write

    show_config

    mess HAS_BEEN_DELETED FROM ${YL}${LPORTAGE_CONFIG}${NO}

}

# this one is so easy it does even not use sed :)

# usage add_entrie [PKG[PKG_CFG]]

add_entrie() {

    local LPKG=${1:-${PKG}}; shift

    local LUSER_CFG=${@:-${USER_CFG}}

    echo -ne "${LPKG} ${LUSER_CFG}\n" >> $LPORTAGE_CONFIG || cant_write

    mess ${GR}${LPKG} HAS_BEEN_ADDED IN ${YL}${LPORTAGE_CONFIG}${NO}

}

# oops... some kinda write access problem!... Are you root?...

cant_write() { 

    mess -e ERR_CANT_WRITE_TO_CONFIG ${YL}${LPORTAGE_CONFIG}${NO}

    exit 1

}

# ask only one but strict thing: are you still ok ?

ask_user() {

    ((REALLYQUIET)) && return 1

    local LMSG=$(mess -i REALLY_WANNA_DO_THAT)

    echo -ne ${LMSG}

    resp='N'; read resp

    [ "$resp" = "Y" -o "$resp" = "y" ] && return 0

    return 1

}

   

#

# main ############################

#

# init ##

# first of all,

# tell me my name, I'll tell you what I'll manage...

ME=${0##*/}; ME=${ME##*-}

((DEBUG)) && echo "me: $ME"

if [ x"${0##*/}" = x"${ME}" ]; then

   ((DEBUG)) && echo "looking for my name..."

   unset ME

   # parse command line options

   case $1 in

      -U|--use|use)

      ME=use

      shift

      ;;

      -K|--keywords|--keyword|--keywor|--keywo|--keyw|--key|key)

      ME=keywords

      shift

      ;;

      -C|[--]cflags|[--]cflag|[--]cfla|[--]cfl)

      ME=cflags

      shift

      ;;

      -UM|--unmask|--unmas|--unma|--unm)

      ME=unmask

      shift

      ;;

      -M|--mask|--mas)

      ME=mask

      shift

      ;;

      -P|--provided|--provide|--provid|--provi|--prov|--pro)

      ME=provided

      shift

      ;;

      -h|--help)

      ME=pmg

      usage

      shift

      ;;

      -V)

      version

      shift

      exit 0

      ;;

      --version|--versio|--versi|--vers|--ver)

      version -a

      shift

      exit 0

      ;;

   esac

fi

# I feel like I'm nobody...

[ -z $ME ] && { mess -e ERR_MISSING_CONFIG; ME=pmg; usage; }

PORTAGE_CONFIG=${PORTAGE_CONFIG:=/etc/portage}

case $ME in

   provided)

   LPORTAGE_CONFIG=${PORTAGE_CONFIG}/profile/package.${ME}

   ;;

   *)

   LPORTAGE_CONFIG=${PORTAGE_CONFIG}/package.${ME}

   ;;

esac

# check if ACTION is valid

i=0; END_OPTIONS=0

while [ $i -lt $# ] || ((! $END_OPTIONS))

do

   # the check option will let us know if given arguments are corrects

   case $1 in [a-z]*|'<='[a-z]*|'>='[a-z]*|'='[a-z]*)break;;esac

   if check_options $1; then

      case $1 in

         -y) DONT_ASK=1; shift;;

         -h) usage;;

         -su) SHOW_EUSES=1; shift; MIN_ARGS=1;;

         -ss) cat $LPORTAGE_CONFIG; exit 0;;

         -s) SHOW_ONLY=1; shift;;

         -r) REPLACE_CONFIG=1;MIN_ARGS=2;shift;;

         -u) UPDATE_CONFIG=1;MIN_ARGS=2;shift;;

         -d) DELETE_CONFIG=1;shift;;

         -q) QUIET=1;shift;;

         -qq) REALLYQUIET=1;shift;;

         -c) ADD_COMMENTS=1; shift; MIN_ARGS=1;;

         -a) ADD_ENTRIE=1; MIN_ARGS=2

         case $ME in

            unmask|mask|keywords|provided) MIN_ARGS=1

         esac

         shift

         ;;

         -V)

         version

         shift

         exit 0

         ;;

         --version|--versio|--versi|--vers|--ver)

         version -a

         shift

         exit 0

         ;;

         --) END_OPTIONS=1; shift;;

         *) END_OPTIONS=1; break;;

         #'.'[a-z]|'>='[a-z]*|'<='[a-z]*|'='[a-z]*) END_OPTIONS=1; break;;

         #*) 

         #    mess -e ERR_MISSING_ACTION; usage;;

      esac

   else

      usage

   fi

done

# MIN_ARGS is 1 by default; however, some options, like the '-r' one, need at least two arguments to work

# this is done by the case-select, just up-there

[ -z "$1" ] && { mess -e ERR_MISSING_PKG; usage; }

[ $# -lt $MIN_ARGS ] && { mess -e ERR_MISSING_FLAGS; usage; }

USER_PKG=$1

shift

USER_CFG=$@

#get_real_pkg_name $USER_PKG

get_real_pkg_name $USER_PKG

resp=$?

if ! ((ADD_COMMENTS)); then

   case $resp in

      1)

      mess ERR_VERSION_REQUIRED FOR $LPORTAGE_CONFIG

      exit 1

      ;;

      2) 

      mess -e $RD TOO_MANY_REPOS FOR_PKG \"${NO}${GR}${USER_PKG}${NO}\":

      for atom in $PKG_REPOS

      do

         mess -e "\t${GR}${atom}/${PKG_NAME}${NO}"

      done

      exit 1

      ;;

      3)

      mess -e ERR_PKG_NOT_FOUND FOR_PKG ${GR}${USER_PKG}${NO}

      exit 1

      ;;

      *)

      ((DEBUG)) && echo "autre sortie ($?)"

      ;;

   esac

fi

# in the check down-there, SHOW_ONLY is absent as it is the default

# that means one can use pmg-use vim,

# it'll show the config for vim

# ADD_ENTRIE is both in pkg_cfg found and not found, to check config's not already present

if get_pkg_config $PKG && ! ((ADD_COMMENTS)) && ! ((SHOW_EUSES)); then

   # we check that only one config exists for that package...

   if [ $(echo "$PKG_CFG" | wc -l) -gt 1 ] || [ $(echo "$PKG" | wc -l) -gt 1 ]; then

      USER_PKG=${USER_PKG//.\*}

      mess -e ERR_TOO_MANY_PKG FOR_REQUEST ${YL}${USER_PKG}${NO}:"\n${PKG} ${PKG_CFG//${USER_PKG}/${RD}${USER_PKG}${NO}}";  exit 1; fi

   if ((ADD_ENTRIE)); then

      mess -e ERR_PKG_EXISTS ${GR}$PKG IN ${YL}${LPORTAGE_CONFIG}${NO} ; exit 1

   elif ((UPDATE_CONFIG)); then

      update_config $PKG "$PKG_CFG" || exit 1

   elif ((REPLACE_CONFIG)); then

      replace_config $PKG "$PKG_CFG" || exit 1

   elif ((DELETE_CONFIG)); then

      delete_config $PKG "$PKG_CFG" || exit 1

   else

      # default -- show_config

      mess CONFIG_FOUND FOR_REQUEST ${GR}${PKG} IN ${YL}${LPORTAGE_CONFIG}${NO}:

      show_config -i ${PKG} "$PKG_CFG" && exit 0

   fi

elif ((ADD_COMMENTS)); then

   add_entrie "# COMMENT " "$USER_PKG $USER_CFG" || exit 1

elif ((SHOW_EUSES)); then

   mess MSG_PLEASE_WAIT

   if ! show_ebuild_uses ${PKG_GLE}${PKG_REPOS}/${PKG_NAME}${PKG_VERSION}; then

      mess ERR_EQUERY

   else

      echo "$PKG_EUSES"

   fi

elif ((ADD_ENTRIE)); then

   if ! check_dependencies; then

      mess DEPENDENCIES_FOUND

   fi

   add_entrie $PKG "$USER_CFG" || exit 1

else

   mess ERR_CONFIG_NOT_FOUND IN ${YL}${LPORTAGE_CONFIG} FOR_PKG ${GR}$PKG${NO}

   exit 1

fi

exit 0

bye! bye!

```

la bibliothèque "messages" (à placer dans /usr/share/mpg)

```

#!/bin/bash

# distances.dbdl -- MMVI

# $Author: root $

# $Id: messages 61 2006-05-30 16:50:10Z root $

# $Rev: 61 $

# $URL: file:///var/svn_root/admin/pmg-tools/branches/pmg-tools-br-0-29-1/messages $

# localized messages and some colors

if ((COLORS)); then

NO=$'\x1b[0;0m'

BR=$'\x1b[0;01m'

RD=$'\x1b[31;01m'

GR=$'\x1b[32;01m'

YL=$'\x1b[33;01m'

BL=$'\x1b[34;01m'

FC=$'\x1b[35;01m'

CY=$'\x1b[36;01m'

fi

LG_VARS=(\

"BY" \

"IN" \

"FOR" \

"FOR_PKG" \

)

EN_VARS=(\

"by" \

"in" \

"for" \

"for package" \

)

FR_VARS=(\

"par" \

"dans" \

"pour" \

"pour le paquet" \

)

index_of() {

   imax=${#LG_VARS[@]}

   [ -z $1 ] && return 1

   XVAR=${1}

   for ((i=0; i<imax;i++))

   do

      if [ "$XVAR" = "${LG_VARS[$i]}" ]; then

         echo $i

         return 0

      fi

   done

   return 1

}

lg_mess() {

local ERROR=0 INFO=0

local msg show_msg

case "$1" in

   error|-e) ERROR=1; shift;;

   infos|-i) INFO=1; shift;;

esac

if ((INFO)) || ((! QUIET)) || ((ERROR)); then

   if ((! REALLYQUIET)); then

      for m in $@

      do

         #if [ ! x"${!msg}" = x"" ]; then

         if idx=$(index_of $m); then

            msg="${LG}_VARS[$idx]"

            if [ ! "${msg}" = "" ]; then

               if ((COLORS)); then

                  case $m in

                     OPT_*) msg="${CY}${!msg}${NO}";;

                     ERR_*|WARNING) msg="${RD}${!msg}${NO}";;

                     ABOUT_*) msg="${RD}${!msg}${NO}";;

                     *) msg="${CY}${!msg}${NO}";;

                  esac

               else

                  msg="${!msg}"

               fi

               [ x"$show_msg" = x"" ] && show_msg="${msg}" || show_msg="${show_msg} ${msg}"

            else

               [ x"$show_msg" = x"" ] && show_msg="${1}" || show_msg="${show_msg} ${1}"

            fi

         fi

         shift

      done

   fi

fi

if ((! REALLYQUIET)); then

   if ((ERROR)); then

      echo -ne "${show_msg}\n" >&2

   elif ((INFO)) || ((!QUIET)); then

      echo -ne "${show_msg}\n"

   fi

fi

}

# EN -- English

EN_BY="by"

EN_IN="in"

EN_FOR="for"

EN_FOR_PKG="for package"

EN_FOR_REQUEST="for request"

EN_TO="to"

EN_WARNING="Warning!"

EN_ERR_CONFIG_NOT_FOUND="Config not found"

EN_ERR_BAD_EXEC="Please do not use ${0##*/} directly; use one of ${0##*/}-{use,package,mask,...} instead."

EN_ERR_CANT_WRITE_TO_CONFIG="Can't write in config file"

EN_ERR_PKG_NOT_FOUND="No valid package were found in portage tree"

EN_ERR_TOO_MANY_REPOS="Many reposotories were found"

EN_ERR_PKG_EXISTS="Package already exists"

EN_ERR_TOO_MANY_PKG="Many entries found"

EN_ERR_ABORTED_BY_USER="Aborted by user"

EN_ERR_MISSING_CONFIG="Target config missing"

EN_ERR_MISSING_ACTION="Action parameter missing"

EN_ERR_MISSING_PKG="Missing package name"

EN_ERR_MISSING_FLAGS="Missing flags parameters"

EN_ERR_VERSION_REQUIRED="Version required"

EN_CONFIG_FOUND="Found config"

EN_CONFIG_CHANGED="Congiguration changed with success" 

EN_FROM="from"

EN_NOTHING_TO_CHANGE="Nothing to change"

EN_HAS_BEEN_DELETED="has been deleted"

EN_HAS_BEEN_ADDED="has been added"

EN_OPT_DELETE_ENTRY="Delete entrie from config file"

EN_OPT_SHOW_CONFIG="Show actual config for PKG"

EN_OPT_REPLACE_CONFIG="Replace actual config with PKG_CFG"

EN_OPT_UPDATE_CONFIG="Update config after PKG_CFG"

EN_OPT_ADD_ENTRY="Add new entrie to config"

EN_OPT_HELP="Show this help"

EN_OPT_DONT_ASK="Perform actions without prompting"

EN_OPT_REALLYQUIET="Print nothing -- Warning: if -a (don't ask) is not set, won't perform any action!"

EN_OPT_BE_QUIET="Execute actions silently, only show errors"

EN_OPT_SHOW_CONFIG_FILE="Show config file and exit"

EN_OPT_VERSION="Show version informations"

EN_OPT_USE="manage package.use"

EN_OPT_UNMASK="manage package.unmask"

EN_OPT_MASK="manage package.mask"

EN_OPT_CFLAGS="manage package.cflags"

EN_OPT_KEYWORDS="manage package.keywords"

EN_OPT_PROVIDED="manage package.provided"

EN_ABOUT_TO_DELETE="Config will be deleted"

EN_ABOUT_TO_REPLACE="Config will be replaced"

EN_ABOUT_TO_UPDATE="Config will be updated"

EN_MSG_PLEASE_WAIT="Please, wait while processing..."

EN_REALLY_WANNA_DO_THAT="Are you sure you wan't to perform this action ? [N/y]"

# FR -- Français

FR_BY="par"

FR_IN="dans"

FR_FOR="pour"

FR_FROM="de"

FR_TO="vers"

FR_WARNING="Attention!"

FR_FOR_PKG="pour le paquet"

FR_FOR_REQUEST="pour la recherche"

FR_ERR_CONFIG_NOT_FOUND="Aucune configuration trouvée"

FR_ERR_PKG_NOT_FOUND="Aucun paquet trouvé dans l'arbre portage"

FR_ERR_TOO_MANY_REPOS="Plusieurs paquets on été trouvés"

FR_ERR_CANT_WRITE_TO_CONFIG="Ne peut pas écrire dans le fichier de configuration"

FR_ERR_ABORTED_BY_USER="Opération interrompue par l'utilisateur!"

FR_ERR_PKG_EXISTS="Le paquet existe déjà"

FR_ERR_TOO_MANY_PKG="Plusieurs entrées existent"

FR_ERR_MISSING_CONFIG="Configuration cible manquante"

FR_ERR_MISSING_ACTION="Paramètres d'action manquants pour la commande"

FR_ERR_MISSING_PKG="Nom du paquet manquant"

FR_ERR_MISSING_FLAGS="Paramètres de configuration manquants"

FR_ERR_VERSION_REQUIRED="Une version est requise"

FR_CONFIG_FOUND="Configuration trouvée"

FR_CONFIG_CHANGED="La configuration a été changée avec succès"

FR_NOTHING_TO_CHANGE="Rien à modifier"

FR_HAS_BEEN_DELETED="a été effacé"

FR_HAS_BEEN_ADDED="a été ajouté"

FR_OPT_DELETE_ENTRY="Effacer l'entrée du fichier de configuration"

FR_OPT_SHOW_CONFIG="Affiche la configuration actuelle du paquet"

FR_OPT_REPLACE_CONFIG="Remplace la configuration actuelle par PKG_CFG"

FR_OPT_UPDATE_CONFIG="Modifie la configuration actuelle selon PKG_CFG"

FR_OPT_ADD_ENTRY="Ajoute une nouvelle entrée dans la configuration"

FR_OPT_HELP="Affiche cet écran"

FR_OPT_VERSION="Affiche les informations de version"

FR_OPT_DONT_ASK="Effectue les actions sans confirmation"

FR_OPT_BE_QUIET="Exécute les actions silencieusement, n'affiche que les erreurs"

FR_OPT_REALLYQUIET="N'affiche absolument aucune sortie -- Attention: si -y (\"sans confimation\") n'est pas activé, n'effectue aucune action!" 

FR_OPT_SHOW_CONFIG_FILE="Affiche le fichier de configuration en cours"

FR_OPT_USE="gère package.use"

FR_OPT_UNMASK="gère package.unmask"

FR_OPT_MASK="gère package.mask"

FR_OPT_CFLAGS="gère package.cflags"

FR_OPT_KEYWORDS="gère package.keywords"

FR_OPT_PROVIDED="gère package.provided"

FR_ERR_BAD_EXEC="Veuillez ne pas utiliser ${0##*/} directement: utilisez plutôt l'un des ${0##*/}-{use,package,mask,...}."

FR_ABOUT_TO_DELETE="La configuration va être effacée"

FR_ABOUT_TO_REPLACE="La configuration va être écrasée"

FR_ABOUT_TO_UPDATE="La configuration va être modifiée"

FR_MSG_PLEASE_WAIT="Veuillez patienter..."

FR_REALLY_WANNA_DO_THAT="Voulez-vous poursuivre ? [N/y] \"y\" pour \"oui\""

# Show localized messages

# usage: mess [-e] [LOCALE_VAR] [text]

# -e: show message despite of QUIET but not of REALLYQUIET (use to print errors)

# ex. mess Attention: PKG_NOT_FOUND FOR_PKG $PKG

messinfo() { mess info $@; }

messerror() { mess error $@; }

mess() {

    local ERROR=0 INFO=0

    local msg show_msg

    case "$1" in

   error|-e) ERROR=1; shift;;

   infos|-i) INFO=1; shift;;

    esac

    

    if ((INFO)) || ((! QUIET)) || ((ERROR)); then

   if ((! REALLYQUIET)); then

       for m in $@

         do

         msg="${LG}_$m"

         if [ ! x"${!msg}" = x"" ]; then

          if ((COLORS)); then

            case $m in

           OPT_*) msg="${CY}${!msg}${NO}";;

           ERR_*|WARNING) msg="${RD}${!msg}${NO}";;

           ABOUT_*) msg="${RD}${!msg}${NO}";;

           *) msg="${CY}${!msg}${NO}";;

            esac

        else

            msg="${!msg}"

        fi

        [ x"$show_msg" = x"" ] && show_msg="${msg}" || show_msg="${show_msg} ${msg}"

         else

        [ x"$show_msg" = x"" ] && show_msg="${1}" || show_msg="${show_msg} ${1}"

         fi

         shift

       done

   fi

    fi

    if ((! REALLYQUIET)); then

   if ((ERROR)); then

       echo -ne "${show_msg}\n" >&2

   elif ((INFO)) || ((!QUIET)); then

       echo -ne "${show_msg}\n"

   fi

    fi

}

```

Well, j'espère que ça servira à quelqu'un    :Question: 

-------------------

ChangeLog (dernière mise-à-jour le [20-05-2006])

révision 60 (ici présente):

 quelques corrections, à plusieurs niveaux -- pas eu le temps de tester à fond...

 premier jet des fonctions de la version suivante 

 recherche exhaustive des dépendances et inclusion automatique ou manuelle

 affichage des USEs d'une ou de plusieurs versions d'un paquet (option -su de -U; "brutal", pour le moment...)

 mise-à-jour des message d'aide

révision 57 (13-05-2006):

 ajout du support pour package.provided (-P ou pmg-provided)

 show-config (-s): correction de quelques effets de bord dûs aux expressions régulières; la recherche porte d'abord sur les paquets lorsqu'aucune expression régulière n'est donnée -- semble fonctionner correctement maintenant

 simplification de l'affichage de sortie (suppression des messages intempestifs récapitulant les modifications)

 mise-à-jour du message d'aide

révision 48:

 lors d'un ajout dans keywords  (pmg -K -a pkg), il n'est plus nécessaire de préciser l'architecture: par défaut, ~x86 ou la variable DEFAULT_ARCH dans /etc/pmg/pmgrc

 show-config (-s) ne vérifie plus au préalable l'existence du packet dans l'arbre portage, mais seulement dans le fichier de config

 show-config (-s) recherche désormais des valeurs selon des expressions régulières et ne se limite plus aux noms de paquets

```

~# pmg-use -s ssl

cherchera d'abord ssl, puis .*ssl.* si ssl n'est pas trouvé

~# pmg-use -s .*ssl.*

cherchera tout ce qui contient ssl

```

 la sortie en erreur lors du lancement (problèmes de paramètres) est un plus précise 

 affichage les informations de version avec -V ou --version

 les sorties sont plus respectueuses des choix de silence (-q) et de tranquillité (-qq) de l'utilisateur

 la mise-à-jour (-u) ne crée plus de sauvegardes intempestives lorsque l'utilisateur annule l'action 

 il reste encore un problème lors de la mise-à-jour (-u): lorsqu'il n'y a aucun changement à éffectuer, l'utilisateur est tout de même sollicité pour confirmation... Mais l'opération est saine et peut-être validée, quoi qu'il en soit (n'en ai pas encore vraiment cherché la raison   :Embarassed:  )

révision 41:

 options sur la ligne de commande pour se dispenser des liens symboliques:

 -U -> use

 -K -> keywords

 -M -> mask

 -UM -> unmask

 -C  -> cflags

 les problèmes de mise-à-jour (-u) sont définitivement corrigés

 si plusieurs entrées existent pour un paquet, les affiche et sort

 nouvelle option -ss pour afficher le contenu du fichier de config en cours

 l'affichage de sortie a été légèrement modifié

 affiche l'aide générale depuis la commande pmg -h et l'aide spécifique depuis pmg-{CONFIG} -h ou pmg CONFIG -h

révision 29.1: corrige une erreur importante (rapportée par PabOu, thanks  :Wink:  )

 les premieres entrées des fichiers n'étaient pas manipulées correctement par le script (rapporté par PabOu)

 corrigé certaines erreurs dans le procédé de mise-à-jour (-u), qui n'était finalement pas très efficace... La prochaine mouture règle entièrement le problème des duplications

 corrections mineures sur la coloration des USEs dans la sortie

révision 29: corrige quelques erreurs, dont une importante:

 l'affichage de sortie est un peu plus soigné (c'est un point de vue...   :Smile:  )

 avant d'ajouter une entrée, on vérifie qu'elle n'existe pas déjà !!   :Embarassed: 

 du coup, on vérifie aussi qu'il n'y ait pas de doublons, au cas où l'utilisateur n'ait modifié le fichier à la main... Ou ne se soit servi de la version boguée  :Very Happy: 

à venir:

 FAIT - options sur la ligne de commande dispensant de l'utilisation des liens - FAIT

 EN COURS - effacer (choix interactif) les entrées dupliquées dans le fichier de config - EN COURS

 EN COURS - signaler les USEs, dupliqués et/ou contradictoires, sur la ligne de commande et dans le fichier de config. - EN COURS

 EN COURS - réécriture de la routine de traitement des drapeaux (USEs et autres) lors de la mise-à-jour (première étape d'une version très-très future qui vérifiera la validité des USEs d'après ceux que contient l'ebuild du paquet; cela servira aussi à les afficher, voire à les selctionner à la volée) -EN COURS

 --- ce qu'il vous semblera bon d'implémenter  :Smile: 

Last edited by distances on Tue May 30, 2006 8:49 pm; edited 18 times in total

----------

## kopp

Eh bien, pour une premier message, on ne peut pas dire que c'est pour rien.

Ça semble être du gros boulot ton truc.

Par contre, je pense que tu pourrais développer un peu plus sur le fonctionnement.

Par exemple, je n'ai pas très bien compris l'histoire des liens...

En tous cas, bienvenue et merci !

----------

## distances

 *kopp wrote:*   

> Eh bien, pour une premier message, on ne peut pas dire que c'est pour rien.
> 
> Ça semble être du gros boulot ton truc.
> 
> Par contre, je pense que tu pourrais développer un peu plus sur le fonctionnement.
> ...

 

Merci pour cet accueil, je reviendrai  :Smile: 

Pour ne pas avoir à créer un outil pour chaque fichier de config ou entrer une floppée d'arguments sur la ligne de commande, j'ai préféré créer un seul outil qui réagit selon la façon dont on l'appelle; d'où l'intérêt des liens symboliques;

c'est la dernière partie du nom qui importe (après le "-"): 

 si tu crées un lien depuis mpg que tu nommes mpg-use (le -use est essentiel), il s'occupera du fichier /etc/portage/package.use

 De même, un lien nommé mpg-keywords s'occupera de package.keywords.

 Etc.

Pour créer tous les liens d'un coup, tu peux entrer:

```

/usr/local/bin # for m in use keywords mask unmask; do ln -s mpg mpg-${m}; done

```

Pour ce qui est du fonctionnement ou de l'utilité du script à proprement parler,

ça permet juste d'éviter d'avoir à éditer ces fichiers à la main -- il m'arrive assez fréquemment d'installer des applis instables sans chercher pour autant à les réduire à un brutal ACCEPT_KEYWORDS="~x86"   :Very Happy: 

Pour ajouter un paquet instable (par exemple gimp), 

avec une version spécifique (2.2.9)

et seulement celle-ci,

on tapera

```

~# gmp-keywords -a =media-gfx/gimp-2.2.9

=media-gfx/gimp-2.2.9 a été ajouté dans /etc/portage/package.keywords

~#

```

Mais j'ai surtout écrit ce script pour gérer le fichier package.use (avec la commande mpg-use, donc)

avec l'option -a, on va ajouter un paquet et ses USEs personnalisés:

```

~# mpg-use -a gimp jpeg mmx png python sse aalib -debug gimpprint gtkhtml -hardened lcms mng scanner -smp svg tiff pdf wmf

media-gfx/gimp a été ajouté dans /etc/portage/package.use

```

on peut ensuite afficher la config de gimp avec l'option -s ...

```

~# mpg-use -s gimp

Configuration trouvée pour le paquet media-gfx/gimp dans /etc/portage/package.use:

media-gfx/gimp  jpeg mmx png python sse aalib -debug gimpprint gtkhtml -hardened lcms mng scanner -smp svg tiff pdf wmf

~#

```

... et modifier ces USEs avec l'option -u:

```

~# mpg-use -u gimp -wmf

La configuration va être modifiée pour le paquet media-gfx/gimp dans /etc/portage/package.use

de 

    media-gfx/gimp  jpeg mmx png python sse aalib -debug gimpprint gtkhtml -hardened lcms mng scanner -smp svg tiff pdf wmf

vers 

    media-gfx/gimp  jpeg mmx png python sse aalib -debug gimpprint gtkhtml -hardened lcms mng scanner -smp svg tiff pdf -wmf

 Voulez-vous poursuivre ? [N/y] "y" pour "oui" 

y

 La configuration a été changée pour le paquet media-gfx/gimp:

de 

    media-gfx/gimp  jpeg mmx png python sse aalib -debug gimpprint gtkhtml -hardened lcms mng scanner -smp svg tiff pdf wmf

vers 

    media-gfx/gimp  jpeg mmx png python sse aalib -debug gimpprint gtkhtml -hardened lcms mng scanner -smp svg tiff pdf -wmf

~#

```

et l'option -s à nouveau, si l'on veut vérifier que tout s'est bien passé:

```

~# mpg-use -s gimp

Configuration trouvée pour le paquet media-gfx/gimp dans /etc/portage/package.use:

media-gfx/gimp  jpeg mmx png python sse aalib -debug gimpprint gtkhtml -hardened lcms mng scanner -smp svg tiff pdf -wmf

```

l'option -s est d'ailleurs facultative:

```

~# mpg-use gimp

```

produira le même effet.

Et voilà!

Comme tu l'as bien remarqué, c'est mon premier post sur le forum... En fait, c'est mon premier post -- tout court   :Smile: 

D'où l'effet brouillon de mes explications, sans doute   :Embarassed: 

Si ce n'est toujours pas clair, je compte sur toi pour me le faire remarquer  :Wink: 

Bon emerge, en attendant!...

P.S. Ai corrigé un petit bug oublié dans la fonction update_config...

----------

## p0uLp3

salut,

Juste une remarque sur ton outil, ca va te sembler derisoire, par rapport a la quantité de boulot que tu as fait, mais tu devrais changer le nom assez rapidement, avant que l'outil devienne utilisé, car j'ai peur qu'il y ait confusion avec un outil pour la gestion de fichiers MPEG (video)

Sinon super boulot  :Smile: 

++

----------

## distances

 *p0uLp3 wrote:*   

> salut,
> 
> Juste une remarque sur ton outil, ca va te sembler derisoire, par rapport a la quantité de boulot que tu as fait, mais tu devrais changer le nom assez rapidement, avant que l'outil devienne utilisé, car j'ai peur qu'il y ait confusion avec un outil pour la gestion de fichiers MPEG (video)
> 
> Sinon super boulot 
> ...

 

 :Laughing: 

Ca ne me semble pas dérisoire du tout, je me suis fait la même remarque  :Very Happy: 

De toute façon, mpg, c'est d'une part, pas facile à taper, et d'autre part, ça ne veut rien dire (management-portage...)

  ---  pmg me semble mieux approprié... En plus, y'a rien qui corresponde dans le portage  :Very Happy: 

A moins que tu n'aies une sugestion à me faire ?...

à+

----------

## boozo

'alute

bien le bonjour   :Smile: 

ben dit donc... y'en a qui ont pas peur de faire du bruit en arrivant    :Laughing:    très intéressant ton script et surtout merci pour les précisions ; je teste tout ça dès que possible.

----------

## PabOu

Bienvenu à toi, et bravo pour le travail ;)

J'y jetterai un coup d'oeil ce soir, car ca m'a l'air intéressant :)

----------

## boozo

Plop !    :Smile: 

Je viens de tester "succinctement" mais je sens que je vais m'y faire, avec qq alias car pour la complétion c'est pas çà... trop de "tab" pour avoir pmg-use   :Laughing: 

Juste une remarque sinon tu fais un micmac terrible avec les noms du script j'en ai noté 3 différents pour le même : pmg ; mpg-X ; gmp-X ... je sais bien que ce n'est pas une chose simple mais peut-être travailler sur une normalisation qui intègrerait un gain en complétion en même temps  ?   :Wink: 

PS: fait même le tri pour les packages à double acception... joie !  :Razz: 

----------

## distances

 *boozo wrote:*   

> Plop !   
> 
> Je viens de tester "succinctement" mais je sens que je vais m'y faire, avec qq alias car pour la complétion c'est pas çà... trop de "tab" pour avoir pmg-use  
> 
> Juste une remarque sinon tu fais un micmac terrible avec les noms du script j'en ai noté 3 différents pour le même : pmg ; mpg-X ; gmp-X ... je sais bien que ce n'est pas une chose simple mais peut-être travailler sur une normalisation qui intègrerait un gain en complétion en même temps  ?  
> ...

 

Merci pour tes appréciations  :Smile: 

C'est un fait, la complétion n'est pas pratique... Penses-tu que des options sur la seule commande pmg (c'est le nom définitif   :Very Happy:  ), genre -U -K -M -UM -C seraient plus pratiques, ou bien des liens nommés du genre use-pmg, unmask-pmg, etc., plus faciles d'accès ?... Cette dernière solution me parait envisageable dans la mesure où je ne connais pas de commande commençant par use-* ... Comment as-tu nommés tes alias ?

Note: j'ai modifié à nouveau le script, pour corriger une bévue -- il ne vérifiait pas que l'entrée existe déjà avant de la valider...  :Confused: 

J'ai fait ces modifs' directement dans la première publication, en haut -- je ne sais pas trop si c'est l'usage   :Question: 

----------

## kopp

 *distances wrote:*   

> Note: j'ai modifié à nouveau le script, pour corriger une bévue -- il ne vérifiait pas que l'entrée existe déjà avant de la valider... 
> 
> J'ai fait ces modifs' directement dans la première publication, en haut -- je ne sais pas trop si c'est l'usage  

 

C'est l'usage, en plus j'ai vu que tu avais mis un petit changelog à la fin, c'est bien vu. Ce serait encore mieux si tu mettais les dates correspondant aux modifs. Voir aussi les mettres dans le script et/ou dans le titre du sujet. Comme ça les gens peuvent plus facilement suivre.

----------

## PabOu

j'ai remarqué un petit bug d'output chez moi :

 *Quote:*   

> root@chocolat ~ # ./pmg-use -s gxine
> 
>  Configuration trouvée pour le paquet media-video/gxine dans /etc/portage/package.use:
> 
> media-video/gxine edia-video/gxine -mozilla
> ...

 

J'ai mis en gras ce qui est "buggué" ici.

Mes remarques : je n'aime pas ces ln à faire. Je pense qu'il serait plus simple de rajouter des options comme tu dis.

J'ai vu une référence au début du script à /etc/pmg/pmgrc et même $HOME/.pmgrc .. à quoi ca sert exactement ? je ne suis pas sur, mais peut-être est-ce pour enlever la couleur ? Je me dis ca parceque la ligne suivante, c'est une drole de ligne que je ne comprends pas bien... drôle de façon d'assigner une valeur :o

----------

## distances

 *PabOu wrote:*   

> j'ai remarqué un petit bug d'output chez moi :
> 
> root@chocolat ~ # ./pmg-use -s gxine
> 
>  Configuration trouvée pour le paquet media-video/gxine dans /etc/portage/package.use:
> ...

 

Ah! Oui... C'est étrange, je n'arrive pas à le reproduire; 

Mais si tu as scrupuleusement reproduit la sortie, il me semble que tu as la version publiée hier -- j'ai fait un mise-à-jour dans la journée, c'est désormais la rév. 29.

A ce propos, je vais dorénavant suivre les indications de kopp (merci pour ces conseils d'étiquette  :Smile:  ), et préciser les dates et modifications de façon plus ostentatoire  :Very Happy: 

Si tu as bien la dernière version, pourrais-tu vérifier s'il y a des entrées dupliquées dans ton portage.use, des sauts de ligne, tout ce qui pourrait te paraître anormal ?...

 *Quote:*   

> 
> 
> Mes remarques : je n'aime pas ces ln à faire. Je pense qu'il serait plus simple de rajouter des options comme tu dis.
> 
> 

 

Ok, je vais ajouter cette possibilité, pour ceux que ça intéresse; personnellement, je préfère les liens symboliques...  :Smile: 

 *Quote:*   

> 
> 
> J'ai vu une référence au début du script à /etc/pmg/pmgrc et même $HOME/.pmgrc .. à quoi ca sert exactement ? je ne suis pas sur, mais peut-être est-ce pour enlever la couleur ?
> 
> 

 

Les emplacements au début du script sont les références possibles pour un fichier de config de  pmg; je n'ai pas documenté cette possibilité, parce que pour le moment, elle ne sert pas à grand chose... 

Toutefois, tu peux y placer quelques variables:

dans /etc/pmg/pmgrc ou dans ~/.pmgrc , donc:

COLOR=[1|0] -- 1 ou 0: active ou désactive l'affichage coloré (bien vu  :Smile:  )

DEBUG=[1|0] -- 1 ou 0: active ou désactive les infos de débogage

LIBRARIES_PATH=/chemin/vers/messages -- l'endroit où se trouve la bibliothèque messages

PORTAGE_CONFIG=/etc/portage -- cette variable est pour le moment tout à fait inutile, car un autre emplacement ne servirait à rien... C'est l'endroit où se trouvent les fichiers de config personnalisés (package.use, .mask, etc.)... Si un jour la Gentoo devait modifier cet emplacement, cette var. prendrait alors tout son sens  :Smile: 

 *Quote:*   

> 
> 
> Je me dis ca parceque la ligne suivante, c'est une drole de ligne que je ne comprends pas bien... drôle de façon d'assigner une valeur 
> 
> 

 

Un peu de cours Bash  :Very Happy: 

```

COLORS=${COLORS:=1}

```

Comme tu l'as bien compris, c'est avec cette assignation que la couleur va être affichée, puisque, par défaut, elle aura la valeur "1" (c'est le "=1", à la fin)

Ce qui se passe ici, c'est que l'on assigne à la variable COLORS la valeur de la variable COLORS (celle qui est à l'intérieur des accolades... Qui est la même, je te l'accorde  :Smile:  ) si et seulement si elle n'est pas vide ou inexistante; autrement, on lui assigne la valeur par défaut ("1"); mais cette valeur est aussi, et d'abord, assignée à la variable entre les accolades... Ce qui nous donne:

```

si {COLORS} = "" ,

alors {COLORS}=1

et 

COLORS={COLORS}

```

Si j'avais voulu assigner une valeur à la variable NB (noir et blanc) selon l'état de de la variable COLORS, j'aurais pu écrire:

```

NB=${COLORS:=1} -- si COLORS est nul, alors active le noir et blanc... Ce qui est un exemple stupide, puisque COLORS serait lui aussi, du coup,  à "1"  :s

```

Si, dans ton fichier de config ~/.pmgrc tu places la variable COLORS=0, au moment de ce test, COLORS n'étant pas nul, il gardera sa valeur.

Tu retrouveras, plus loin dans le script, quelque chose d'assez similaire, au début de certaines fonctions:

```

LPKG=${1:-$PKG}

```

Ici, on assigne directement à LPKG la valeur, soit de $1, soit de $PKG, si $1 est nul ou non initialisé

ainsi, pour reprendre notre exemple précédent

```

NB=${COLORS:-1} 

```

deviendrait du coup opérationnel, la variable COLORS demeurant dans son état initial    :Razz: 

C'est le "-" qui fait la différence.

En espérant que ce mini-cours puisse te servir  :Wink: Last edited by distances on Thu May 04, 2006 11:18 pm; edited 1 time in total

----------

## PabOu

 *distances wrote:*   

> Mais si tu as scrupuleusement reproduit la sortie, il me semble que tu as la version publiée hier -- j'ai fait un mise-à-jour dans la journée, c'est désormais la rév. 29.

 

J'ai copié/collé le script 10 à 15minutes avant mon message. Donc j'ai bien la dernière version.

 *distances wrote:*   

> Si tu as bien la dernière version, pourrais-tu vérifier s'il y a des entrées dupliquées dans ton portage.use, des sauts de ligne, tout ce qui pourrait te paraître anormal ?...

 

Ben non, mon package.use est normal...

```
net-fs/samba readline pam

media-video/gxine -mozilla

games-roguelike/nethack -qt

app-cdr/k3b vcd hal sndfile

media-sound/amarok visualization xine

x11-wm/compiz kde

kde-misc/krusader kde

net-misc/tightvnc server

app-office/openoffice mozilla

app-misc/screen multiuser

net-im/gaim startup-notification bonjour xscreensaver

games-fps/tremulous -openal

net-p2p/azureus-bin kde

dev-ml/lablgtk glade

dev-lang/python tcltk
```

 *distances wrote:*   

>  *Quote:*   Mes remarques : je n'aime pas ces ln à faire. Je pense qu'il serait plus simple de rajouter des options comme tu dis. 
> 
> Ok, je vais ajouter cette possibilité, pour ceux que ça intéresse; personnellement, je préfère les liens symboliques... :)

 

Merci :)

 *distances wrote:*   

> Un peu de cours Bash :D

 

Encore Merci ;)

C'est bien comme ca que j'avais compris (deviné) grâce à la lecture des fichiers de config AVANT l'assignation des variables, mais n'étant pas sur et n'ayant jamais vu ca auparavant (dans aucun langage... mais je ne suis pas programeur)... Tu es plus expérimenté que moi, et ca se voit.. j'utilise encore des "if [ -f ...]; then ..." et toi pas.. tu utilises simplement && ;) On en apprend tous les jours ! Merci (jamais deux sans trois) !

----------

## distances

 *PabOu wrote:*   

> 
> 
> j'ai remarqué un petit bug d'output chez moi :
> 
> root@chocolat ~ # ./pmg-use -s gxine
> ...

 

Ca, c'est réglé  :Very Happy: 

 *PabOu wrote:*   

> 
> 
> Mes remarques : je n'aime pas ces ln à faire. Je pense qu'il serait plus simple de rajouter des options comme tu dis.
> 
> 

 

Et ça, c'est en cours   :Razz: 

N'hésite pas à me faire part de nouvelles remarques ou questions, ça fait vraiment avancer les choses plus vite  :Wink: 

----------

## distances

et un ebuild pour ceux que ça intéresse  :Smile: 

http://distances.ath.cx/files/pmg-tools-1.0.6.ebuild

```

# Copyright 1999-2004 Gentoo Foundation

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

# $Header: $

DESCRIPTION="Bash script to manage unstable packages via /etc/portage"

HOMEPAGE="http://distances.ath.cx/"

SRC_URI="http://distances.ath.cx/files/${P}.tar.bz2"

LICENSE="GPL"

SLOT="0"

KEYWORDS="~x86"

IUSE=""

DEPEND=""

RESTRICT="nomirror"

src_install() {

   exeinto /usr/bin

   dobin pmg pmg-*

   insinto /usr/share/pmg

   doins messages

   insinto /etc/pmg

   doins pmgrc

}

```

Last edited by distances on Mon May 15, 2006 12:34 pm; edited 1 time in total

----------

## boozo

et en plus il fait du zèle le distances  :Mr. Green: 

non je blague là... c'est vraiment chouette avec tes modifs... et y'a même le package.provided   :Cool: 

(bon c'est d'une utilisation plus confidentielle mais c'est pour souligner le soucis du détails * d'ailleurs faudra que je fasse du ménage dans le mien un de ces 4   :Rolling Eyes:  * )

merci bcp vraiment   :Wink: 

PS : ah oui... encore une remarque... peut-être rajouter un RESTRICT="nomirror" dans l'ébuild et c'est parfait   :Wink: 

[Edit] tu as ouvert un topic dans le forum tips&tricks pour ton ebuid ? p'être une bonne idée non ? d'ailleurs si tu m'autorises je te rajouterai bien dans le sand-box

----------

## distances

Content que ça plaise  :Very Happy: 

 *boozo wrote:*   

> 
> 
> PS : ah oui... encore une remarque... peut-être rajouter un RESTRICT="nomirror" dans l'ébuild et c'est parfait  
> 
> 

 

C'est fait... C'est sur, c'est plus efficace; on en apprend tous les jours   :Razz: 

 *boozo wrote:*   

> 
> 
> tu as ouvert un topic dans le forum tips&tricks pour ton ebuid ? p'être une bonne idée non ? d'ailleurs si tu m'autorises je te rajouterai bien dans le sand-box
> 
> 

 

Tu as toute latitude pour agir comme bon te semble  :Very Happy: 

Thanx a lot !

----------

## boozo

je viens de tomber sur ceci tout-à-fait par hazard... c'est pas pour polémiquer le moins du monde mais bon, ce serait bien pour toute la communauté je pense que tu postes ton ebuild sur le forum Tips'n Tricks, car je suis presque certain qu'il pourrait à terme rentrer dans le gentoolkit et puis qui sait d'autres pourront peut-être te proposer des voies d'améliorations   :Wink: 

----------

## distances

Salut, salut!

Tes remarques sont décidemment très judicieuses, boozo  :Wink: 

J'ai pas eu beaucoup de temps pour moi ces derniers jours, même pas pour intégrer mes dernières modifs et corrections... :S

L'approche de ce gars pour son script est une bonne idée, je te remercie de ma l'avoir signalé  :Very Happy: 

Je commence par m'incruster sur son sujet pour l'intéresser au mien et je crée une branche pour pmg dans le Tips 'n' Tricks... Ou plutôt l'inverse  :Very Happy: 

----------

## boozo

En faisant un man pour ajouter un use aujourd'hui je viens de préter attention à ton package.cflags ce qui, je dois le dire, m'a remis en mémoire un de mes thread qui pourrait peut-être t'intéresser pour un hypothétique futur développement de pmg-tools   :Razz:   mais peut-être vis-tu aussi avec les mêmes démons qui me hantent    :Mr. Green: 

[Edit] au fait attendu qu'il y en a un... pourrais-tu renommer ton thread stp [Ebuild] pmg-tools...  :Wink:   merci

----------

## distances

Salut, salut!

J'ai réussi à trouver un peu de temps pour continuer ce script...

 *boozo wrote:*   

> En faisant un man pour ajouter un use aujourd'hui je viens de préter attention à ton package.cflags ce qui, je dois le dire, m'a remis en mémoire un de mes thread qui pourrait peut-être t'intéresser pour un hypothétique futur développement de pmg-tools   

 

Ah! Oui! Ca c'est une bonne idée  :Very Happy: 

Le fil sur le package.clags qui est référencé dans ton propre fil est celui dont je me sers actuellement; quoique sommairement depuis qu'il est installé...

 *Quote:*   

> 
> 
> mais peut-être vis-tu aussi avec les mêmes démons qui me hantent   
> 
> 

 

Je vais pas reprendre ton fil ici, mais la méthode utilisée exploite plutôt bien les possibilités de portage; et modifier l'environnement dans lequel il s'exécute n'est finalement rien de plus que de modifier l'environnement de l'utilisateur "portage"... Avec les risques que cela comporte, évidemment   :Confused: 

Je préfère en tout cas cette solution à celle que j'ai vu dans certains ebuilds, où le CFLAG est modifié en dur... Mais c'est aussi un bon garde-fou pour certains paquets sensibles... Alors oui, je vis avec les mêmes démons que toi  :Very Happy: 

 *Quote:*   

> 
> 
> au fait attendu qu'il y en a un... pourrais-tu renommer ton thread stp [Ebuild] pmg-tools...   merci
> 
> 

 

Yep! J'avais pas remarqué ton EDIT  :Wink: 

----------

## distances

Pour ceux qui ont mis le script à jour dans l'après-midi, 

je suis navré de vous demander de recommencer... J'ai un peu oublié d'y include une modif' qui le rend partiellement inopérant...

Mais avec les ebuilds, ça va vite, n'est-ce pas ?  :Very Happy: 

PS. N'oubliez pas de virer le paquet de /usr/portage/distfiles et les {files/digest-pmg-tools-20063005, Manifest} dans votre overlay portage -- je n'ai modifié que le contenu, pas le nom de l'archive...  Décidément...  :Embarassed: 

----------

