On Sun, Feb 06, 2005 at 01:19:24PM -0800, Don Armstrong wrote:
> Package: dictionaries-common
> Severity: important
> Version: 0.24.7
>
> dictionaries-common needs to have an option in the debconf prompting
> such that a user can decline to have dictionaries-common munge their
> precious configuration settings.
>
> That is, if I've got a dicionary and hash file installed that
> dicionaries-common doesn't know about, I should be able to keep as my
> default if I've set the symlinks myself.
>
> [This probably is a serious bug, since it doesn't allow administrators
> to preserve their configuration file settings, but I'll leave the RC
> nature of this bug to your discretion.]
>
A fix for that is in unstable, for two weeks now, and I think this should go
into sarge. I have prepared a sarge package with this problem fixed, and
would like to know the release team opinion about the convenience of its
upload to testing-proposed-updates, since it involves changes that are
neither very small nor absolutely straightforward.
This is the changelog for the manual mode stuff dealing with the above
problem,
* Introducing a manual mode so administrators are allowed
to preserve their personal settings (closes: #293926):
- debian/dictionaries-common.templates:
+ Declare itself as an ispell dictionary and wordlist with a
manual value, so a manual option is added to the debconf
selection menu.
- scripts/system/{update,remove}-default.in:
+ Behavior adjusted when debconf selection is ~manual~ to not
try setting symlinks.
- debian/dictionaries-common.config-base:
+ Make sure shared question is prompted if ~manual~ is not yet
one of the options.
+ Force question be prompted if ispell/wordlist alternative was
set in manual mode.
+ Improved debugging code.
- debian/dictionaries-common.preinst:
+ Make sure old alternatives are removed when in manual mode.
remove-default.in change also includes fix for #272530 [Selecting a wordlist
in preconf leads to confusion], since the same code area is involved.
There are some minor changes that I think should also go there,
* debian/dictionaries-common.config-base:
- Deal with debian-installer/language values using @ variant.
- Added new tagalog entry to the %equivs hash. itagalog is
already in Debian.
If debian-installer/language uses as first entry a locale with a @
variant in some cases the automatic selection might not be correct.
This will not be a problem for most languages where match in the
two letters language code is enough, but might be in some (rare)
others. Since fix is simple I propose to put it.
The second thing is just adding a new language to a hash.
plus some new l10n stuff,
* debian/po:
- Added turkish debconf templates translation,
thanks to Mehmet Turker (closes: #281420).
- Added Romanian debconf templates translation,
thanks to Sorin Batariuc (closes: #283207).
- Updated Galician debconf templates translation,
thanks to Jacobo Tarrio (closes: #296305).
- Added new Tagalog debconf templates translation,
thanks to Eric Pareja (closes: #296411).
I am attaching a diff file of dictionaries-common-0.22.40sarge8 against
previous dictionaries-common-0.22.40sarge7, stripped of the l10n changes.
Full packages are available for inspection at our alioth repository,
http://dict-common.alioth.debian.org/testing
with sources and changes file in the sources subdir.
Cheers,
--
Agustin
diff -Nru /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/debian/changelog /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/debian/changelog
--- /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/debian/changelog 2004-11-05 13:03:20.000000000 +0100
+++ /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/debian/changelog 2005-02-24 19:18:39.000000000 +0100
@@ -1,3 +1,37 @@
+dictionaries-common (0.22.40sarge8) testing-proposed-updates; urgency=low
+
+ * debian/dictionaries-common.config-base:
+ - Deal with debian-installer/language values using @ variant.
+ - Added new tagalog entry to the %equivs hash. itagalog is
+ already in Debian.
+ * Introducing a manual mode so administrators are allowed
+ to preserve their personal settings (closes: #293926):
+ - debian/dictionaries-common.templates:
+ + Declare itself as an ispell dictionary and wordlist with a
+ manual value, so a manual option is added to the debconf
+ selection menu.
+ - scripts/system/{update,remove}-default.in:
+ + Behavior adjusted when debconf selection is ~manual~ to not
+ try setting symlinks.
+ - debian/dictionaries-common.config-base:
+ + Make sure shared question is prompted if ~manual~ is not yet
+ one of the options.
+ + Force question be prompted if ispell/wordlist alternative was
+ set in manual mode.
+ - debian/dictionaries-common.preinst:
+ + Make sure old alternatives are removed when in manual mode.
+ * debian/po:
+ - Added turkish debconf templates translation,
+ thanks to Mehmet Turker (closes: #281420).
+ - Added Romanian debconf templates translation,
+ thanks to Sorin Batariuc (closes: #283207).
+ - Updated Galician debconf templates translation,
+ thanks to Jacobo Tarrio (closes: #296305).
+ - Added new Tagalog debconf templates translation,
+ thanks to Eric Pareja (closes: #296411).
+
+ -- Agustin Martin Domingo <agmartin@debian.org> Thu, 24 Feb 2005 19:09:54 +0100
+
dictionaries-common (0.22.40sarge7) testing-proposed-updates; urgency=low
* debian/po:
diff -Nru /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/debian/dictionaries-common.config-base /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/debian/dictionaries-common.config-base
--- /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/debian/dictionaries-common.config-base 2004-08-24 13:15:07.000000000 +0200
+++ /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/debian/dictionaries-common.config-base 2005-02-24 19:18:40.000000000 +0100
@@ -67,31 +67,36 @@
"pt_BR" => "brazilian",
"ru" => "russian",
"sv" => "swedish",
+ "tl" => "tagalog",
"uk" => "ukrainian");
my %reverse_equivs = ();
+my %alternatives = ("ispell" => "ispell-dictionary.hash",
+ "wordlist" => "dictionary");
sub dc_debugprint(){
print STDERR "@_" if $debug;
}
sub dc_set (){
- my $question = shift;
- my $value = shift;
+ my $question = shift;
+ my $value = shift;
+
+ my ($errorcode, $oldvalue) = get($question);
- my ($errorcode,$existingvalue) = get($question);
- &dc_debugprint("*** ($errorcode,$existingvalue)\n");
- $errorcode = "unset" if not $existingvalue;
- &dc_debugprint("***+ ($errorcode,$existingvalue)\n");
- if ( $errorcode ){
+ $oldvalue = "unset" unless $oldvalue;
+ if ( $errorcode or $oldvalue eq "unset" ){
+ &dc_debugprint(" errorcode: $errorcode; $question
+ Old:[$oldvalue] --> New:[$value]\n");
set("$question","$value");
- } elsif ( $existingvalue eq $value ) {
+ } elsif ( $oldvalue eq $value ) {
print STDERR "Info: $question is already set to
- $existingvalue. Preserving it.\n";
+ [$oldvalue]. Preserving it.\n";
} else {
print STDERR "Warning: $question is already set to
- $existingvalue.
- Not setting to $value\n";
+ [$oldvalue].
+ Not setting to [$value]\n";
}
+ &dc_debugprint("---\n");
}
sub extractlang (){
@@ -101,7 +106,7 @@
my $thevariant = '';
my @thevalues = ();
- &dc_debugprint("$language\n");
+ &dc_debugprint("Trying lang $language\n");
if ( exists $equivs{$language} ){
($thepackage,$thevariant) = split ("->",$equivs{$language});
foreach $prfx ( @prefixes ){
@@ -110,7 +115,7 @@
} else {
$pkgfullname = "$classprefix$thepackage$prfx";
}
- &dc_debugprint("$pkgfullname\n");
+ &dc_debugprint("Trying package $pkgfullname\n");
if ( exists $debconf_vals{"$pkgfullname"} ){
if ( exists $debconf_defaultvals{"$pkgfullname"} ){
$thestring = $debconf_defaultvals{"$pkgfullname"};
@@ -200,6 +205,22 @@
return;
}
+sub dc_manual_alternative (){
+ my $class = shift;
+ my $file = "/var/lib/dpkg/alternatives/$alternatives{$class}";
+ my $status = '';
+
+ if ( -r $file ){
+ open(FILE,"< $file") or return;
+ $status = <FILE>;
+ close FILE;
+ $status = "" unless $status;
+ chomp $status;
+ return unless ( exists $debconf_vals{"dictionaries-common"} );
+ return $debconf_vals{"dictionaries-common"} if ( $status eq "manual" );
+ }
+}
+
sub dc_debconf_rebuild (){
my $class = shift;
return unless $class;
@@ -223,9 +244,12 @@
if ( not -e $dcscript ){
($errorcode,$language) = get($di_language);
- if ( not $errorcode and $language ){
- # Deal with de_DE:de_DE:de:en_GB:en like entries
- ($language,$country) = split("_",( split(":",$language) )[0]);
+ if ( not $errorcode and $language ){ # Installing from scratch
+ # Deal with de_DE:de_DE@euro:de:en_GB:en like entries
+ $language = ( split(":",$language) )[0];
+ #($language,$langvariant) = split("@",$language);
+ $language = ( split("@",$language) )[0];
+ ($language,$country) = split("_",$language);
if ( not $country ){
($errorcode,$country) = get($di_country);
if ( $errorcode or not $country ){
@@ -236,7 +260,7 @@
$classprefix = substr($class,0,1);
if ( &dc_debconf_rebuild($class) ){
if ( $guessed = &guesslang($class,$language,$country) ){
- &dc_debugprint("($class,$language,$country)\n");
+ &dc_debugprint("* Guessed [d-i]->($class,$language,$country)\n");
&dc_set("dictionaries-common/default-$class","$guessed");
} else {
if ( $guessed = &guesslang($class,"en","US") ){
@@ -252,7 +276,7 @@
}
}
}
- } else {
+ } else { # Upgrading from woody or previous release
foreach ( keys %equivs ){
$reverse_equivs{$equivs{$_}} = $_;
}
@@ -260,12 +284,24 @@
$classprefix = substr($class,0,1);
if ( &dc_debconf_rebuild($class) ){
if ( $guessed = &guesslink($class) ){
- foreach ( keys %debconf_vals ){
- my $oldpackage = $_;
- $oldpackage = "wenglish" if ( $oldpackage eq "wamerican" );
+ if ( &dc_manual_alternative($class) ){
+ &dc_debugprint("- $class was in manual mode. Setting critical priority\n");
$priority{$class} = "critical";
- last if ( not -e "/var/lib/dpkg/info/$oldpackage.list");
+ } else {
$priority{$class} = "low";
+ foreach ( keys %debconf_vals ){
+ my $oldpackage = $_;
+ next if ( $oldpackage eq "dictionaries-common" );
+ $oldpackage = "wenglish" if ( $oldpackage eq "wamerican" );
+ # critical priority if exists debconf entry without a
+ # previous package installed. This means that besides
+ # upgrading, new dicts are being installed.
+ if ( not -e "/var/lib/dpkg/info/$oldpackage.list" ){
+ $priority{$class} = "critical";
+ &dc_debugprint("* New dict [$oldpackage] is to be installed\n");
+ last;
+ }
+ }
}
&dc_set("dictionaries-common/default-$class","$guessed");
}
@@ -276,14 +312,20 @@
# Prompting the questions if required
-if ( not -e $dcscript or $ARGV[0] eq "reconfigure" ){
+if ( not -e $dcscript ){ # First dictionaries-common installation
foreach $class ("ispell","wordlist"){
&dc_debconf_select($class,$priority{$class});
+ # This might have been pre-seeded and question not asked.
+ # Make sure question is tagged as seen in this case
if ( $priority{$class} ne "critical" ){
fset ("dictionaries-common/default-$class", "seen", "true");
go();
}
}
+} else { # Reconfiguring or upgrading
+ foreach $class ("ispell","wordlist"){
+ &dc_debconf_select($class);
+ }
}
#
diff -Nru /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/debian/dictionaries-common.preinst /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/debian/dictionaries-common.preinst
--- /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/debian/dictionaries-common.preinst 2003-09-04 14:23:30.000000000 +0200
+++ /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/debian/dictionaries-common.preinst 2005-02-24 19:18:40.000000000 +0100
@@ -6,18 +6,21 @@
case "$1" in install|upgrade)
# This will clean up the alternatives for ispell-dictionary.hash
# set by the pre-Policy ispell dictionary packages
- #
+ # A /var/lib/dpkg/alternatives/ispell-dictionary.hash file is sometimes left
+ # if alternative was set to manual mode. Setting it to --auto ensures removal.
DICTS=`/usr/sbin/update-alternatives --display ispell-dictionary.hash \
| grep priority | cut -f1 -d" "`
for i in $DICTS ; do
/usr/sbin/update-alternatives --remove ispell-dictionary.hash $i
done
+ /usr/sbin/update-alternatives --auto ispell-dictionary.hash
# The same for wordlists
WORDS=`/usr/sbin/update-alternatives --display dictionary \
| grep priority | cut -f1 -d" "`
for i in $WORDS ; do
/usr/sbin/update-alternatives --remove dictionary $i
done
+ /usr/sbin/update-alternatives --auto dictionary
;;
esac
diff -Nru /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/debian/dictionaries-common.templates /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/debian/dictionaries-common.templates
--- /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/debian/dictionaries-common.templates 2004-07-05 18:58:28.000000000 +0200
+++ /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/debian/dictionaries-common.templates 2005-02-24 19:18:40.000000000 +0100
@@ -96,3 +96,16 @@
will not set the default ispell dictionary.
.
Use instead 'select-default-ispell' or 'select-default-wordlist' scripts.
+
+Template: shared/packages-ispell
+Type: text
+Description:
+
+Template: shared/packages-wordlist
+Type: text
+Description:
+
+Template: dictionaries-common/languages
+Type: text
+Default: ~manual~ (I set symlinks manually)
+Description:
diff -Nru /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/scripts/system/remove-default.in /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/scripts/system/remove-default.in
--- /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/scripts/system/remove-default.in 2003-10-13 12:30:34.000000000 +0200
+++ /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/scripts/system/remove-default.in 2005-02-24 19:18:44.000000000 +0100
@@ -1,5 +1,6 @@
#!/usr/bin/perl -w
+use Debian::DictionariesCommon q(:all);
use Debconf::Client::ConfModule q(:all);
die "$0: You must run this as root.\n" if ($> != 0);
@@ -10,43 +11,53 @@
my $class = "[I:ispell:][W:wordlist:]";
my $question = "dictionaries-common/default-$class";
+my $manual = '';
+my $options = "";
-(my $ret, my $value) = get $question;
+($ret, $value) = get $question;
if ($ret == 0) {
- my $package = $ARGV[0];
- my @languages = split (/\s*,\s*/, metaget ("$package/languages",
- "default"));
- my @oldchoices = split (/\s*,\s*/, metaget ($question, "choices"));
- my @newchoices = ();
- foreach $choice ( @oldchoices ){
- my $found = 0;
- foreach (@languages) {
- s/\s*(.*)\s*/$1/;
- if ($_ eq $choice){
- $found = 1;
- last;
- }
- }
- push (@newchoices, $choice) if ($found == 0);
- }
+ $manual = "yes" if ( $value =~ m/^~manual.*/i );
- subst ($question, "choices", join (', ', @newchoices));
+ updatedb ($class);
- my $found = 0;
- foreach my $k (@languages) {
- last if ($found = ($value eq $k));
+ my $package = $ARGV[0];
+ my $dictionaries = loaddb ($class);
+ my $languages = metaget ("$package/languages", "default");
+ my @oldchoices = split (/\s*,\s*/, metaget ($question, "choices"));
+ my @newchoices = ();
+ my %langsinpkg = ();
+
+ for ( $languages ){ # Trim leading/trailing whitespaces the perlfaq way
+ s/^\s+//;
+ s/\s+$//;
}
-
- if ($found == 1) {
- system "select-default-[I:ispell:][W:wordlist:]";
+
+ foreach ( split (/\s*,\s*/, $languages) ){
+ $langsinpkg{$_}++;
+ }
+
+ foreach $choice ( @oldchoices ){
+ push (@newchoices, $choice) unless exists $langsinpkg{$choice};
}
- system "update-default-[I:ispell:][W:wordlist:] --rebuild";
-
+ subst ($question, "choices", join (', ', @newchoices));
+
+ if ( $manual || scalar(keys %{$dictionaries}) <= 1 ) {
+ $options = "--ignore-symlinks";
+ } else {
+ if ( exists $langsinpkg{$value} ) {
+ system "select-default-[I:ispell:][W:wordlist:]";
+ }
+ }
+ system "update-default-[I:ispell:][W:wordlist:] --rebuild $options";
}
+#Local Variables:
+#perl-indent-level: 2
+#End:
+
__END__
=head1 NAME
diff -Nru /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/scripts/system/update-default.in /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/scripts/system/update-default.in
--- /tmp/cA4MuZxM8E/dictionaries-common-0.22.40sarge7/scripts/system/update-default.in 2004-06-02 12:36:42.000000000 +0200
+++ /tmp/HW6oi2vuuT/dictionaries-common-0.22.40sarge8/scripts/system/update-default.in 2005-02-24 19:18:44.000000000 +0100
@@ -8,6 +8,7 @@
my $rebuild = '';
my $ignoresymlinks = '';
+
GetOptions ('rebuild' => \$rebuild,
'ignore-symlinks' => \$ignoresymlinks);
@@ -18,16 +19,22 @@
my $question = "dictionaries-common/default-$class";
my $iquestion = "dictionaries-common/invalid_debconf_value";
my $linkdir = "/etc/dictionaries-common";
+my $manual = '';
[I:my $emacsen_default = "nil";
my $emacsen_default_file = "/var/cache/dictionaries-common/emacsen-ispell-default.el";:]
-my ($ret, $value) = get ($question);
+($ret, $value) = get ($question);
if ($ret == 0 && $value ){
updatedb ($class);
my $dictionaries = loaddb ($class);
+ if ( $value =~ m/^~manual.*/i ){ # Check if we are in manual mode
+ $ignoresymlinks = "yes";
+ $manual = "yes";
+ }
+
if ( not $ignoresymlinks) {
if (not exists $dictionaries->{$value}){ # Handle invalid debconf values
@@ -41,25 +48,25 @@
die "Selected [I:ispell dictionary:I][W:wordlist:W]:\n" .
" $value \n" .
"does not correspond to any installed package in the system\n" .
- "and no alternative [I:ispell dictionary:I][W:wordlist:W] could be selected.";
+ "and no alternative [I:ispell dictionary:I][W:wordlist:W] could be selected.\n";
subst($iquestion,"value",$value);
- fset ($iquestion,"isdefault","true");
+ fset ($iquestion,"seen","false");
input("high",$iquestion); # Warn about what happened
subst ($question, "choices", $choices); # Put sane values in debconf choices field
set ($question, $forced_key); # Set debconf value to a sane one
- fset ($question,"isdefault","true");
+ fset ($question,"seen","false");
input ("critical", $question);
title ("dictionaries-common: [I:ispell dictionaries:I][W:wordlists:W]");
go ();
($ret, $value) = get ($question);
die "\n Could not get a valid value for debconf question:\n" .
- "$question"
+ "$question\n"
if ( $ret != 0 ); # This should never be reached
}
die "Selected [I:ispell dictionary:][W:wordlist:]:\n" .
" $value \n" .
- "does not contain a hash name entry in the database."
+ "does not contain a hash name entry in the database.\n"
if (not exists $dictionaries->{$value}{"hash-name"});
[I:
setsysdefault ($value); # This here is only for ispell, not wordlist
@@ -73,7 +80,7 @@
the file to link [$hash$i] was not found. Please report this as a bug to the
maintainer of the [I:ispell dictionary:][W:wordlist:] package you tried to
select.
-In the meantime select other default value for your [I:ispell dictionary:][W:wordlist:]."
+In the meantime select other default value for your [I:ispell dictionary:][W:wordlist:].\n"
if (not -e "$hash$i");
system "ln -fs $hash$i $linkdir/[I:default:][W:words:]$i";
@@ -81,13 +88,15 @@
}
}
[I:
- if ( exists $dictionaries->{$value}{"emacs-display"}
- and lc($dictionaries->{$value}{"emacs-display"}) eq "no" ){
- $emacsen_default = "nil";
- } elsif ( exists $dictionaries->{$value}{"emacsen-name"} ){
- $emacsen_default = "\"" . $dictionaries->{$value}{"emacsen-name"} . "\"";
- } elsif( exists $dictionaries->{$value}{"hash-name"} ){
- $emacsen_default = "\"" . $dictionaries->{$value}{"hash-name"} . "\"";
+ unless ( $manual ){
+ if ( exists $dictionaries->{$value}{"emacs-display"}
+ and lc($dictionaries->{$value}{"emacs-display"}) eq "no" ){
+ $emacsen_default = "nil";
+ } elsif ( exists $dictionaries->{$value}{"emacsen-name"} ){
+ $emacsen_default = "\"" . $dictionaries->{$value}{"emacsen-name"} . "\"";
+ } elsif( exists $dictionaries->{$value}{"hash-name"} ){
+ $emacsen_default = "\"" . $dictionaries->{$value}{"hash-name"} . "\"";
+ }
}:]
}
@@ -109,7 +118,7 @@
build_emacsen_support ();
build_jed_support ();
system ("ispell-autobuildhash") == 0
- or die "Error running ispell-autobuildhash";
+ or die "Error running ispell-autobuildhash\n";
# End of specific ispell support :]
}
Attachment:
signature.asc
Description: Digital signature