View previous topic :: View next topic |
Author |
Message |
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Wed May 03, 2006 6:25 pm Post subject: [EBUILD] pmg - gérer les paquets instables [MAJ-30-05-2006 |
|
|
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...
- 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:
Code: |
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
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
Code: |
#!/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)
Code: |
#!/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
-------------------
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
Code: |
~# 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 )
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 )
- 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... )
- avant d'ajouter une entrée, on vérifie qu'elle n'existe pas déjà !!
- 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
à 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
Last edited by distances on Tue May 30, 2006 8:49 pm; edited 18 times in total |
|
Back to top |
|
|
kopp Advocate
Joined: 09 Apr 2004 Posts: 2885 Location: Grenoble, France
|
Posted: Wed May 03, 2006 7:27 pm Post subject: |
|
|
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 ! |
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Wed May 03, 2006 8:37 pm Post subject: utilisations |
|
|
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.
Par exemple, je n'ai pas très bien compris l'histoire des liens...
En tous cas, bienvenue et merci ! |
Merci pour cet accueil, je reviendrai
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:
Code: |
/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"
Pour ajouter un paquet instable (par exemple gimp),
avec une version spécifique (2.2.9)
et seulement celle-ci,
on tapera
Code: |
~# 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:
Code: |
~# 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 ...
Code: |
~# 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:
Code: |
~# 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é:
Code: |
~# 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:
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
D'où l'effet brouillon de mes explications, sans doute
Si ce n'est toujours pas clair, je compte sur toi pour me le faire remarquer
Bon emerge, en attendant!...
P.S. Ai corrigé un petit bug oublié dans la fonction update_config... |
|
Back to top |
|
|
p0uLp3 n00b
Joined: 26 May 2005 Posts: 14 Location: /dev/proc
|
Posted: Wed May 03, 2006 9:18 pm Post subject: |
|
|
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
++ |
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Wed May 03, 2006 9:37 pm Post subject: |
|
|
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
++ |
Ca ne me semble pas dérisoire du tout, je me suis fait la même remarque
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
A moins que tu n'aies une sugestion à me faire ?...
à+ |
|
Back to top |
|
|
boozo Advocate
Joined: 01 Jul 2004 Posts: 3193
|
|
Back to top |
|
|
PabOu Veteran
Joined: 11 Feb 2004 Posts: 1088 Location: Hélécine - Belgium
|
Posted: Thu May 04, 2006 6:45 am Post subject: |
|
|
Bienvenu à toi, et bravo pour le travail ;)
J'y jetterai un coup d'oeil ce soir, car ca m'a l'air intéressant :) _________________ Mangez du poulet ! |
|
Back to top |
|
|
boozo Advocate
Joined: 01 Jul 2004 Posts: 3193
|
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Thu May 04, 2006 3:55 pm Post subject: |
|
|
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 ?
PS: fait même le tri pour les packages à double acception... joie ! |
Merci pour tes appréciations
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 ), 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...
J'ai fait ces modifs' directement dans la première publication, en haut -- je ne sais pas trop si c'est l'usage |
|
Back to top |
|
|
kopp Advocate
Joined: 09 Apr 2004 Posts: 2885 Location: Grenoble, France
|
Posted: Thu May 04, 2006 5:24 pm Post subject: |
|
|
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. |
|
Back to top |
|
|
PabOu Veteran
Joined: 11 Feb 2004 Posts: 1088 Location: Hélécine - Belgium
|
Posted: Thu May 04, 2006 9:12 pm Post subject: |
|
|
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 _________________ Mangez du poulet ! |
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Thu May 04, 2006 10:52 pm Post subject: |
|
|
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:
media-video/gxine edia-video/gxine -mozilla
|
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 ), et préciser les dates et modifications de façon plus ostentatoire
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...
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 )
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
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
Code: |
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 ) 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:
Code: |
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:
Code: |
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:
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
deviendrait du coup opérationnel, la variable COLORS demeurant dans son état initial
C'est le "-" qui fait la différence.
En espérant que ce mini-cours puisse te servir
Last edited by distances on Thu May 04, 2006 11:18 pm; edited 1 time in total |
|
Back to top |
|
|
PabOu Veteran
Joined: 11 Feb 2004 Posts: 1088 Location: Hélécine - Belgium
|
Posted: Thu May 04, 2006 11:16 pm Post subject: |
|
|
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... Code: | 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) ! _________________ Mangez du poulet ! |
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Sat May 06, 2006 4:37 am Post subject: |
|
|
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:
media-video/gxine edia-video/gxine -mozilla
|
Ca, c'est réglé
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
N'hésite pas à me faire part de nouvelles remarques ou questions, ça fait vraiment avancer les choses plus vite |
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Sat May 13, 2006 1:52 pm Post subject: un p'tit plus |
|
|
et un ebuild pour ceux que ça intéresse
http://distances.ath.cx/files/pmg-tools-1.0.6.ebuild
Code: |
# 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 |
|
Back to top |
|
|
boozo Advocate
Joined: 01 Jul 2004 Posts: 3193
|
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Mon May 15, 2006 12:45 pm Post subject: à vot' service, m'sieurs-dames :) |
|
|
Content que ça plaise
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
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
Thanx a lot ! |
|
Back to top |
|
|
boozo Advocate
Joined: 01 Jul 2004 Posts: 3193
|
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Sun May 21, 2006 6:48 pm Post subject: help always welcomed... |
|
|
Salut, salut!
Tes remarques sont décidemment très judicieuses, boozo
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é
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 |
|
Back to top |
|
|
boozo Advocate
Joined: 01 Jul 2004 Posts: 3193
|
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Tue May 30, 2006 6:13 pm Post subject: il faut savoir se défier de ses fantômes ;) |
|
|
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
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
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
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 |
|
Back to top |
|
|
distances n00b
Joined: 03 May 2006 Posts: 15 Location: France
|
Posted: Tue May 30, 2006 8:27 pm Post subject: inqualifiable! |
|
|
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 ?
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... |
|
Back to top |
|
|
|
|
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
|
|