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

Bug#271260: countrychooser: Should use a progress bar while building the short country list



tags 271260 + patch
thanks

On Sunday 12 September 2004 09:51, Christian Perrier wrote:
> The cat_shortlist function in postinst is quite slow which results, on
> slow systems, on a blue screen being displayed for a while before the
> screen with the short list of countries being displayed.
>
> I think it would be worth adding a progress bar in the cat_shortlist
> functionn in coutnrychooser's postinst.

Instead of adding a progress bar, I think I have very much improved the 
efficiency of building the shortlist by changing the structure of 
the /etc/shortlists file combined with attached patch for postinst.

I have now tested the patch for postinst during an installation.
(bubulle: I had to make a few change from the first version I send to you!)

Also attached are:
- a patch for mkshort (untested!) that should generate the new 
  /etc/shortlists file;
- an example /etc/shortlists file in the new format.



--- mkshort	2004-06-14 18:11:43.000000000 +0200
+++ debian/new/mkshort	2004-09-12 18:05:21.000000000 +0200
@@ -35,9 +35,9 @@
 	 if [ "$2" ]; then
 	   translation=$( (grep "^$2	" $tabfile || true) | sed -e 's/^.*	//')
 	   if [ "$translation" ]; then
-	      echo "$1	$translation" >> $outfile
+	      echo -e "$1\t$translation" >> $outfile
 	   else
-	      echo "$1	$2" >> $outfile
+	      echo -e "$1\t$2" >> $outfile
 	   fi
 	 fi
       fi
@@ -57,7 +57,10 @@
 
 for file in debian/short-tmp/*.short; do
    lang=`basename $file .short`
-   echo ":$lang" >> $SHORTLISTS
-   cat $file >> $SHORTLISTS
+   echo -n "$lang" >> $SHORTLISTS
+   ( while read line; do
+         echo -en "\t$line" >> $SHORTLISTS
+     done
+   ) < $file
+   echo "" >> $SHORTLISTS
 done
-
--- postinst	2004-09-12 23:34:52.000000000 +0200
+++ new/postinst	2004-09-13 15:25:59.000000000 +0200
@@ -62,31 +62,52 @@
 	fi
 }
 
-cat_shortlist() {
-	(out=""
-	IFS='
-'
-	while read line; do
-		if $(echo "$line" | grep -q "^:$1\$"); then
-			out=1
-		elif $(echo "$line" | grep -q "^:"); then
-			out=""
-		elif [ "$out" ]; then
-			echo "$line"
+# This function performs several tasks:
+# - Search in $COUNTRY_SHORTLIST for either a coutrycode or a countryname
+# - Build a shortlist for the dialog
+get_shortlist() {
+	OLD_IFS="$IFS"
+	IFS=$(echo -en "\t")
+	SLIST=""
+	count=0
+	for value in $COUNTRY_SHORTLIST; do
+		count=$(($count+1))
+		if [ "$(($count % 2))" -eq 1 ] ; then
+			CCODE=$value
+		else
+			CNAME=$value
+			case "$1" in
+			code)
+				if [ "$CNAME" = "$2" ] ; then
+					echo $CCODE
+					break
+				fi
+				;;
+			name)
+				if [ "$CCODE" = "$2" ] ; then
+					echo $CNAME
+					break
+				fi
+				;;
+			shortlist)
+				if [ ! -z "${SLIST}" ]; then
+					SLIST="${SLIST}, "
+				fi
+				SL_NAME=$(echo "${INDENT}${CNAME}" | sed -e 's/,/\\,/')
+				SLIST="${SLIST}${SL_NAME}"
+				;;
+			esac
 		fi
 	done
-	) < $SHORTLISTS
+	if [ "$1" = "shortlist" ] ; then
+		echo "$SLIST"
+	fi
+	IFS="$OLD_IFS"
 }
 
 loccountry2code() {
 	COUNTRYNAME=$(echo "$1" | sed "s/^$INDENT//" | sed 's/\\,/,/g')
-	line=`cat_shortlist $2| grep "$COUNTRYNAME\$"`
-	if [ -n "$line" ]; then
-		set $line
-		if [ -n "$1" ]; then
-			echo "$1"
-		fi
-	fi
+	echo $(get_shortlist code "$COUNTRYNAME")
 }
 
 # First grab back the country we got from languagechooser
@@ -133,9 +154,9 @@
 
 FIRST_LANG=$(echo $LANGUAGELIST | sed -e 's/:.*$//')
 
-if grep -q "^:$FIRST_LANG\$" $SHORTLISTS; then
+if grep -q "^$FIRST_LANG" $SHORTLISTS; then
   use_lang=$FIRST_LANG
-elif grep -q "^:$LANGUAGE\$" $SHORTLISTS; then
+elif grep -q "^$LANGUAGE" $SHORTLISTS; then
   use_lang=$LANGUAGE
 else
   use_lang=""
@@ -160,19 +181,10 @@
 				if [ "$use_lang" ]; then
 					# Build a short list of supported locales for
 					# the language.
-					OLD_IFS="$IFS"
-					IFS='
-'
-					COUNTRIES=$(cat_shortlist $use_lang | sed -e 's/^.*	//');
-					SHORTLIST=""
-					for name in $COUNTRIES; do
-						if [ ! -z "${SHORTLIST}" ]; then
-							SHORTLIST="${SHORTLIST}, "
-						fi
-						countryname=$(echo "${INDENT}${name}" | sed -e 's/,/\\,/')
-						SHORTLIST="${SHORTLIST}${countryname}"
-					done
-					IFS="$OLD_IFS"	
+					COUNTRY_SHORTLIST=$(grep "^$use_lang[[:space:]]" $SHORTLISTS | \
+							    sed -e "s/^$use_lang[[:space:]]//")
+					SHORTLIST=$(get_shortlist shortlist $use_lang)
+
 					db_subst $shortlist SHORTLIST "${SHORTLIST}"
 					db_subst $shortlist DEFAULTLOCALE "${DEFAULTLOCALE}"
 					db_input $shortprio $shortlist || [ $? -eq 30 ]

Attachment: shortlists
Description: Binary data


Reply to: