[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [locales] Solving the "debconf is not a registry" issue



Hi,

At Tue, 22 Apr 2003 21:32:01 +0200,
Denis Barbier wrote:
> several threads recently came up on debian-devel about debconf issues.
> One concern is that debconf must not be used to store configuration
> items; another even more important is that user changes in configuration
> files must be preserved.  A detailed example of writing config and
> postinst files can be found in debconf-devel(7).
> Here is a first try to have the locales package get it right.
> It has been kindly reviewed (and improved) by Joey Hess (he also fixes
> typos in the templates file).  Of course, remaining bugs are mine.

Cool!

> There is a problem with the current files: locales are always generated
> when packages is reconfigured.  This is annoying, especially when
> building all supported locales, but it does the right thing because
> otherwise running locale-gen provides a different set of locales.
> IMO this issue could be discussed later, we first need to fix current
> ones.

I agree it's right thing, I don't think it's the serious problem.

> [2 templates.patch <text/plain; us-ascii (7bit)>]
> Index: templates
> ===================================================================
> RCS file: /cvs/glibc/glibc-package/debian/locales/DEBIAN/templates,v
> retrieving revision 1.5
> diff -u -r1.5 templates
> --- templates	27 Feb 2003 13:16:16 -0000	1.5
> +++ templates	22 Apr 2003 19:02:58 -0000
> @@ -1,24 +1,25 @@
>  Template: locales/locales_to_be_generated
>  Type: multiselect
> -_Choices: Leave alone, ${locales}
> +_Choices: None, ${locales}
>  _Description: Select locales to be generated.
>   Locale is a framework to switch between multiple languages for users who can
>   select to use their language, country, characters, collation order, etc.
>   .
>   You can choose locales to be generated by selecting locales you want.
> - Selected locales will be saved to `/etc/locale.gen' file. You can also
> - manually edit this file. You need to run `locale-gen' after edit the file.
> + Selected locales will be saved to the `/etc/locale.gen' file. You can also
> + manually edit this file. You need to run `locale-gen' after editing the
> + file.
>  
>  Template: locales/default_environment_locale
>  Type: select
> -_Choices: Leave alone, None, ${locales}
> +_Choices: None, ${locales}
>  Default: C
>  _Description: Which locale should be the default in the system environment?
>   Many packages in Debian use locales to display text in the correct
>   language for users. The default is C but you can change this if you're not
>   a native English speaker.
>   .
> - Note: This will reflect the language for your whole system. If you're
> + Note: This will select the language for your whole system. If you're
>   running a multi-user system where not all of your users speak the language
>   of your choice, then they will run into difficulties and you might want to
>   leave "C" as the default locale.

It's fine, and in this modification chance, we would like to apply
#117509 "locales: Message grammar".  Do you think?

> [3 config <text/plain; us-ascii (7bit)>]
> #!/bin/bash
> set -e
> 
> . /usr/share/debconf/confmodule
> db_version 2.0
> db_capb backup multiselect
> 
> #   Initializes debconf default values from the ones found in
> #   configuration files
> if [ -e /etc/locale.gen ]; then
>   LG=/etc/locale.gen
>   SELECTED_LOCALES=$(egrep -v "^#|^$" $LG | tr "\n" "," | sed -e "s/,/, /g" -e "s/, *$//")
>   db_set locales/locales_to_be_generated "${SELECTED_LOCALES}"
> else
>   LG=/dev/null
> fi
> if [ -e /etc/environment ]; then
>     db_set locales/default_environment_locale `awk 'BEGIN {lang="None"} /^LANG=/ {gsub("\"", ""); sub("LANG=", ""); lang=$0;} END {print lang}' /etc/environment`
> else
>     db_set locales/default_environment_locale None
> fi
> 
> SUPPORTED_LOCALES="__SUPPORTED_LOCALES__"
> SUPPORTED_LOCALES=$( (cat $LG && echo "$SUPPORTED_LOCALES") | egrep -hv "^#|^$" | sort -u | tr "\n" "," | sed -e "s/,/, /g" -e "s/, *$//")
> db_subst locales/locales_to_be_generated locales "${SUPPORTED_LOCALES}"
> 
> STATE=1
> while [ "$STATE" -ge 0 ]; do
>     case "$STATE" in
>     0)
>         exit 1
>         ;;
>     1)
>         db_input medium locales/locales_to_be_generated || true
>         ;;
>     2)
>         db_get locales/locales_to_be_generated && DEFAULT_LOCALES=$(echo $RET | sed -e 's/None,*//g' -e 's/ [^ ]*,/,/g' -e 's/ [^ ]*$//')
> 
>         if test -z "$DEFAULT_LOCALES"; then
>             DEFAULT_LOCALES=C
>         else
>             DEFAULT_LOCALES="C, $DEFAULT_LOCALES"
>         fi
>         db_subst locales/default_environment_locale locales $DEFAULT_LOCALES
>         db_input medium locales/default_environment_locale || true
>         ;;
>     *)
>         break
>         ;;
>     esac
>     if db_go; then
>         STATE=$(($STATE + 1))
>     else
>         STATE=$(($STATE - 1))
>     fi
> done

I wonder why this STATE transition is needed?

> [4 postinst <text/plain; us-ascii (7bit)>]
> #! /bin/sh
> set -e
> 
> LG="/etc/locale.gen"
> EE="/etc/environment"
> 
> if [ "$1" = configure ]; then

Trivial, "configure".

> 
>     . /usr/share/debconf/confmodule
>     db_version 2.0
> 
>     db_get locales/locales_to_be_generated && SELECTED_LOCALES=$RET
>     db_get locales/default_environment_locale && SELECTED="$RET"
> 
>     if [ -n "$SELECTED_LOCALES" -a "$SELECTED_LOCALES" != "None" ]; then
>         if [ -e $LG ]; then
>             #   Comment previous defined locales
>             sed -e 's/^[a-zA-Z]/#&/' $LG > $LG.tmp || true
>             mv -f $LG.tmp $LG

Why are the previous defined locales commented out, not simply removed?

>         else
>             cat > $LG << EOF
> # This file lists locales that you wish to have built. You can find a list
> # of valid supported locales at /usr/share/i18n/SUPPORTED. Other
> # combinations are possible, but may not be well tested. If you change
> # this file, you need to rerun locale-gen.
> #
> 
> EOF
>         fi
>         list=`echo $SELECTED_LOCALES | sed -e 's/, /,/g'`
>         save_IFS=$IFS
>         IFS=,
>         for locale in $list; do
>             if grep -q "^#$locale *\$" $LG; then
>                 #   Uncomment previous defined locales
>                 sed -e "s,#$locale *\$,$locale," $LG > $LG.tmp || true
>                 mv -f $LG.tmp $LG
>             else
>                 #   Never wondered why Emacs sux?
>                 echo >> $LG

Why is this "empty line" added?

>                 #   Add a new locale
>                 echo $locale >> $LG
>             fi
>         done
>         IFS=$save_IFS
> 
>         # Update requested locales.  Remove all old locale dir and 
>         # locale-archive before generating new locale data.
>         rm -rf /usr/lib/locale/* || true
>         /usr/sbin/locale-gen
>     fi
> 
>     # Set default LANG environment variable
>     if [ -e $EE ]; then
>         sed -e '/^ *LANG=/d' $EE > $EE.tmp || true
>     else
>         :> $EE.tmp
>     fi
>     if [ -n "$SELECTED" ] && [ "$SELECTED" != "None" ]; then
>         echo "LANG=$SELECTED" >> $EE.tmp
>         mv -f $EE.tmp $EE
>     else
>         rm -f $EE.tmp
>     fi
> fi

From my test, there was one bug.  If I unselected all locales in the
first selection, but it was not reflected into /etc/locale.gen.

It Looks really fine.  I think it's ok to include in 2.3.2-1 :)

Regards,
-- gotom



Reply to: