rpms/gnome-spell/devel gnome-spell-enchant.patch, NONE, 1.1 gnome-spell.spec, 1.28, 1.29

Matthew Barnes (mbarnes) fedora-extras-commits at redhat.com
Thu Dec 20 13:09:06 UTC 2007


Author: mbarnes

Update of /cvs/pkgs/rpms/gnome-spell/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv21798

Modified Files:
	gnome-spell.spec 
Added Files:
	gnome-spell-enchant.patch 
Log Message:

* Thu Dec 20 2007 Caolan McNamara <caolanm at redhat.com> - 1.0.8-2.fc9
- Unify dictionaries, make gnome-spell use enchant


gnome-spell-enchant.patch:

--- NEW FILE gnome-spell-enchant.patch ---
Index: configure.in
===================================================================
RCS file: /cvs/gnome/gnome-spell/configure.in,v
retrieving revision 1.86
diff -u -p -u -p -r1.86 configure.in
--- configure.in.enchant	10 Feb 2006 12:08:11 -0000	1.86
+++ configure.in	2 Apr 2006 14:31:45 -0000
@@ -68,33 +68,6 @@
 AC_SUBST(API_VERSION)
 
 dnl
-dnl aspell
-dnl
-
-AC_ARG_WITH(aspell-prefix, [  --with-aspell-prefix=DIR
-                          specify under which prefix aspell is installed.], with_aspell_prefix="$withval", )
-
-if test "x$with_aspell_prefix" != "x"; then
-   saved_LDFLAGS=$LDFLAGS
-   LDFLAGS="-L$with_aspell_prefix/${_lib:-lib} "$LDFLAGS
-   ASPELL_INC="-I$with_aspell_prefix/include"
-   ASPELL_LIBS="-L$with_aspell_prefix/${_lib:-lib} -laspell"
-else
-   LDFLAGS="-L`aspell config prefix`/${_lib:-lib} "$LDFLAGS
-   ASPELL_INC="-I`aspell config prefix`/include"
-   ASPELL_LIBS="-L`aspell config prefix`/${_lib:-lib} -laspell"
-fi
-ASPELL_DICT="`aspell config dict-dir`"
-AC_CHECK_LIB(aspell,new_aspell_config,,AC_MSG_ERROR([gnome-spell cannot be built without aspell library]),)
-if test "x$with_aspell_prefix" != "x"; then
-   LDFLAGS=$saved_LDFLAGS
-fi
-
-AC_SUBST(ASPELL_DICT)
-AC_SUBST(ASPELL_INC)
-AC_SUBST(ASPELL_LIBS)
-
-dnl
 dnl flags
 dnl
 
@@ -103,7 +76,7 @@
 AC_SUBST(CPPFLAGS)
 AC_SUBST(LDFLAGS)
 
-GNOME_SPELL_MODULES="libgnomeui-2.0 >= 1.112.1 libbonoboui-2.0 >= 1.112.1 libglade-2.0 >= 1.99.9"
+GNOME_SPELL_MODULES="libgnomeui-2.0 >= 1.112.1 libbonoboui-2.0 >= 1.112.1 libglade-2.0 >= 1.99.9 enchant >= 1.2.5"
 PKG_CHECK_MODULES(GNOME_SPELL, $GNOME_SPELL_MODULES)
 AC_SUBST(GNOME_SPELL_CFLAGS)
 AC_SUBST(GNOME_SPELL_LIBS)
Index: gnome-spell/Makefile.am
===================================================================
RCS file: /cvs/gnome/gnome-spell/gnome-spell/Makefile.am,v
retrieving revision 1.34
diff -u -p -u -p -r1.34 Makefile.am
--- gnome-spell/Makefile.am.enchant	19 Jan 2006 23:37:50 -0000	1.34
+++ gnome-spell/Makefile.am	2 Apr 2006 14:31:46 -0000
@@ -7,13 +7,11 @@ END =
 
 INCLUDES =                                              \
         -I$(srcdir)                                     \
-	$(ASPELL_INC)					\
 	-DPREFIX=\""$(prefix)"\"			\
         -DGNOMEDATADIR=\""$(datadir)"\"         	\
         -DGNOMELOCALEDIR=\""$(datadir)/locale"\"        \
 	-DGLADE_DATADIR=\"$(gladedir)\"			\
 	-DPLUGIN_DIR=\""$(PLUGIN_DIR)"\"		\
-	-DASPELL_DICT=\""$(ASPELL_DICT)"\"		\
 	$(GNOME_SPELL_CFLAGS)				\
 	$(END)
 
@@ -55,7 +53,6 @@ libgnome_spell_idl_la_SOURCES =	\
 libgnome_spell_component_la_LDFLAGS = -release $(API_VERSION) $(NO_UNDEFINED)
 libgnome_spell_component_la_LIBADD = 		\
 	libgnome-spell-idl.la		\
-	$(ASPELL_LIBS)		\
 	$(GNOME_SPELL_LIBS)			\
 	$(END)
 
@@ -69,7 +66,6 @@ libgnome_spell_component_la_SOURCES =		\
 
 test_gnome_spell_component_LDADD =		\
 	libgnome-spell-idl.la		\
-	$(ASPELL_LIBS)				\
 	$(GNOME_SPELL_LIBS)			\
 	$(END)
 
Index: gnome-spell/dictionary.c
===================================================================
RCS file: /cvs/gnome/gnome-spell/gnome-spell/dictionary.c,v
retrieving revision 1.39
diff -u -p -u -p -r1.39 dictionary.c
--- gnome-spell/dictionary.c.enchant	5 Feb 2006 21:31:09 -0000	1.39
+++ gnome-spell/dictionary.c	2 Apr 2006 14:31:46 -0000
@@ -30,16 +30,21 @@
 #include <glib.h>
 #include <libgnome/gnome-i18n.h>
 #include <libgnome/gnome-config.h>
-#include <gconf/gconf-client.h>
 #include <bonobo.h>
 
 #include "Spell.h"
 #include "dictionary.h"
 
+#include <enchant/enchant.h>
+
+typedef struct {
+	EnchantBroker * config;
+	EnchantDict   * speller;
+} SpellEngine;
+
 static BonoboObjectClass                  *dictionary_parent_class;
 
 #define DICT_DEBUG(x)
-#define GNOME_SPELL_GCONF_DIR "/GNOME/Spell"
 
 static void release_engines (GNOMESpellDictionary *dict);
 
@@ -72,12 +77,24 @@ gnome_spell_dictionary_init (GObject *ob
 {
 	GNOMESpellDictionary *dict = GNOME_SPELL_DICTIONARY (object);
 
-	dict->changed = TRUE;
 	dict->engines = NULL;
 	dict->languages = g_hash_table_new (g_str_hash, g_str_equal);
 	dict->engines_ht = g_hash_table_new (NULL, NULL);
 }
 
+static char **
+dup_string_list (char ** str_list, size_t list_len)
+{
+	char ** new_str_list;
+	size_t i;
+
+	new_str_list = g_new0 (char *, list_len + 1);
+	for (i = 0; i < list_len; i++)
+		new_str_list [i] = g_strdup (str_list [i]);
+
+	return new_str_list;
+}
+
 static void
 dictionary_finalize (GObject *object)
 {
@@ -93,15 +110,16 @@ dictionary_finalize (GObject *object)
 }
 
 static SpellEngine *
-new_engine (const gchar *language)
+new_engine (const gchar *language, CORBA_Environment *ev)
 {
 	SpellEngine *se;
 
 	se = g_new0 (SpellEngine, 1);
-	se->config = new_aspell_config ();
-	aspell_config_replace (se->config, "language-tag", language);
-	aspell_config_replace (se->config, "encoding", "utf-8");
-	se->changed = TRUE;
+	se->config = enchant_broker_init ();
+	se->speller = enchant_broker_request_dict (se->config, language);
+
+	if(se->speller == NULL)
+		raise_error (ev, enchant_broker_get_error (se->config));
 
 	return se;
 }
@@ -129,9 +147,9 @@ release_engines (GNOMESpellDictionary *d
 		SpellEngine *se = dict->engines->data;
 
 		if (se->speller)
-			delete_aspell_speller (se->speller);
+			enchant_broker_free_dict (se->config, se->speller);
 		if (se->config)
-			delete_aspell_config (se->config);
+			enchant_broker_free (se->config);
 		g_free (se);
 		dict->engines = g_slist_remove (dict->engines, se);
 	}
@@ -140,7 +158,6 @@ release_engines (GNOMESpellDictionary *d
 	g_hash_table_foreach_remove (dict->languages, remove_engine_ht, NULL);
 
 	dict->engines = NULL;
-	dict->changed = TRUE;
 }
 
 static LangInfo known_languages [] = {
@@ -352,88 +369,31 @@ static LangInfo known_languages [] = {
 };
 
 static GSList *
-get_languages_real (gint *ln)
+get_languages (gint *ln)
 {
 	GSList *langs;
-	AspellCanHaveError *err;
-	AspellConfig  *config;
-	AspellSpeller *speller;
-	gint i;
+	EnchantBroker *broker;
+	gint i, nb_langs;
 
-	DICT_DEBUG (printf ("get_languages_real\n"));
+	DICT_DEBUG (printf ("get_languages\n"));
 
+	/* todo: this could probably be better done by enchant_broker_list_dicts(), but let's keep
+	   the initial code change to a minimum */
+
+	broker = enchant_broker_init ();
 	langs = NULL;
-	*ln = 0;
+	nb_langs = 0;
 	for (i=0; i < G_N_ELEMENTS (known_languages); i++) {
-		config = new_aspell_config ();
-		aspell_config_replace (config, "language-tag", known_languages [i].abbreviation);
-		err = new_aspell_speller (config);
-		if (aspell_error_number (err) == 0) {
-			speller = to_aspell_speller (err);
+		if (enchant_broker_dict_exists (broker, known_languages [i].abbreviation)) {
 			DICT_DEBUG (printf ("Language: %s\n", known_languages [i].name));
-			delete_aspell_speller (speller);
 			langs = g_slist_prepend (langs, GINT_TO_POINTER (i));
-			(*ln) ++;
+			nb_langs++;
 		}
 	}
 
-	return langs;
-}
-
-static GSList *
-get_languages_load (GConfClient *gc, gint *ln)
-{
-	GString *str;
-	GSList *langs = NULL;
-	gint i, lang_num;
-
-	/* printf ("get_languages_load\n"); */
-
-	str = g_string_new (NULL);
-	*ln = gconf_client_get_int (gc, GNOME_SPELL_GCONF_DIR "/languages", NULL);
-	for (i = 0; i < *ln; i++) {
-		g_string_sprintf (str, GNOME_SPELL_GCONF_DIR "/language%d", i);
-		lang_num = gconf_client_get_int (gc, str->str, NULL);
-		langs = g_slist_prepend (langs, GINT_TO_POINTER (lang_num));
-	}
-
-	return langs;
-}
-
-static GSList *
-get_languages (gint *ln)
-{
-	GSList *langs, *l;
-	GConfClient *gc;
-	time_t mtime;
-	struct stat buf;
-	gint i, kl;
-
-	gc = gconf_client_get_default ();
-
-	mtime = gconf_client_get_int (gc, GNOME_SPELL_GCONF_DIR "/mtime", NULL);
-	kl = gconf_client_get_int (gc, GNOME_SPELL_GCONF_DIR "/known_languages", NULL);
-
-	if (stat (ASPELL_DICT, &buf) || buf.st_mtime != mtime || kl != G_N_ELEMENTS(known_languages)) {
-		GString *str;
-		langs = get_languages_real (ln);
-
-		str = g_string_new (NULL);
-		gconf_client_set_int (gc, GNOME_SPELL_GCONF_DIR "/languages", *ln, NULL);
-		for (l = langs, i = 0; i < *ln; i ++) {
-			g_string_sprintf (str, GNOME_SPELL_GCONF_DIR "/language%d", *ln - i - 1);
-			gconf_client_set_int (gc, str->str, GPOINTER_TO_INT (l->data), NULL);
-			l = l->next;
-		}
-		gconf_client_set_int (gc, GNOME_SPELL_GCONF_DIR "/mtime", buf.st_mtime, NULL);
-		gconf_client_set_int (gc, GNOME_SPELL_GCONF_DIR "/known_languages", G_N_ELEMENTS(known_languages), NULL);
-		g_string_free (str, TRUE);
-		gnome_config_sync ();
-	} else
-		langs = get_languages_load (gc, ln);
+	*ln = nb_langs;
 
-	gconf_client_suggest_sync (gc, NULL);
-	g_object_unref (gc);
+	enchant_broker_free (broker);
 
 	return langs;
 }
@@ -504,59 +464,19 @@ impl_gnome_spell_dictionary_set_language
 			SpellEngine *se;
 			
 			one_language = g_strndup (begin, len);
-			se = new_engine (one_language);
+			se = new_engine (one_language, ev);
 			dict->engines = g_slist_prepend (dict->engines, se);
 			g_hash_table_insert (dict->languages, one_language, se);
 			g_hash_table_insert (dict->engines_ht, se, g_strdup (one_language));
-
-			dict->changed = TRUE;
-		}
-	}
-}
-
-static void
-update_engine (SpellEngine *se, CORBA_Environment * ev)
-{
-	AspellCanHaveError *err;
-
-	DICT_DEBUG (printf ("Dictionary: creating new aspell speller\n"));
-
-	if (se->changed) {
-		if (se->speller)
-			delete_aspell_speller (se->speller);
-		err = new_aspell_speller (se->config);
-		if (aspell_error_number (err) != 0) {
-			g_warning ("aspell error: %s\n", aspell_error_message (err));
-			se->speller = NULL;
-			raise_error (ev, aspell_error_message (err));
-		} else {
-			se->speller = to_aspell_speller (err);
-			se->changed = FALSE;
 		}
 	}
 }
 
-static void
-update_engines (GNOMESpellDictionary *dict, CORBA_Environment * ev)
-{
-	g_return_if_fail (IS_GNOME_SPELL_DICTIONARY (dict));
-
-	if (dict->changed) {
-		GSList *l;
-
-		for (l = dict->engines; l; l = l->next) {
-			update_engine ((SpellEngine *) l->data, ev);
-		}
-
-		dict->changed = FALSE;
-	}
-}
-
 static CORBA_boolean
 engine_check_word (SpellEngine *se, const gchar *word, CORBA_Environment *ev)
 {
-	CORBA_boolean result = CORBA_TRUE;
-	gint aspell_result;
+	CORBA_boolean result = CORBA_FALSE;
+	gint enchant_result;
 
 #ifndef G_DISABLE_CHECKS
 	g_return_val_if_fail (se->speller, CORBA_TRUE);
@@ -564,12 +484,12 @@ engine_check_word (SpellEngine *se, cons
 	if (!se->speller)
 		return CORBA_TRUE;
 #endif
-	aspell_result = aspell_speller_check (se->speller, word, strlen (word));
-	if (aspell_result == 0)
-		result = CORBA_FALSE;
-	if (aspell_result == -1) {
-		g_warning ("aspell error: %s\n", aspell_speller_error_message (se->speller));
-		raise_error (ev, aspell_speller_error_message (se->speller));
+	enchant_result = enchant_dict_check (se->speller, word, strlen (word));
+	if (enchant_result == 0)
+		result = CORBA_TRUE;
+	if (enchant_result == -1) {
+		g_warning ("enchant error: %s\n", enchant_dict_get_error (se->speller));
+		raise_error (ev, enchant_dict_get_error (se->speller));
 	}
 
 	return result;
@@ -592,7 +512,6 @@ impl_gnome_spell_dictionary_check_word (
 	if (!strcmp (word, "Ximian"))
 		return CORBA_TRUE;
 
-	update_engines (dict, ev);
 	for (l = dict->engines; l; l = l->next) {
 		if (((SpellEngine *) l->data)->speller) {
 			valid_speller = TRUE;
@@ -621,11 +540,10 @@ impl_gnome_spell_dictionary_add_word_to_
 	if (!word)
 		return;
 #endif
-	update_engines (dict, ev);
 	DICT_DEBUG (printf ("Dictionary add_word_to_session: %s\n", word));
 	for (l = dict->engines; l; l = l->next) {
 		if (((SpellEngine *) l->data)->speller)
-			aspell_speller_add_to_session (((SpellEngine *) l->data)->speller, word, strlen (word));
+			enchant_dict_add_to_session (((SpellEngine *) l->data)->speller, word, strlen (word));
 	}
 }
 
@@ -642,13 +560,11 @@ impl_gnome_spell_dictionary_add_word_to_
 	if (!word || !language)
 		return;
 #endif
-	update_engines (dict, ev);
 	DICT_DEBUG (printf ("Dictionary add_word_to_personal: %s (%s)\n", word, language));
 	se = (SpellEngine *) g_hash_table_lookup (dict->languages, language);
 
 	if (se && se->speller) {
-		aspell_speller_add_to_personal (se->speller, word, strlen (word));
-		aspell_speller_save_all_word_lists (se->speller);
+		enchant_dict_add_to_pwl (se->speller, word, strlen (word));
 		DICT_DEBUG (printf ("Added and saved.\n"));
 	}
 }
@@ -666,14 +582,12 @@ impl_gnome_spell_dictionary_set_correcti
 	if (!word || !replacement)
 		return;
 #endif
-	update_engines (dict, ev);
 	DICT_DEBUG (printf ("Dictionary correction: %s <-- %s\n", word, replacement));
 	se = (SpellEngine *) g_hash_table_lookup (dict->languages, language);
 
 	if (se && se->speller) {
-		aspell_speller_store_replacement (se->speller, word, strlen (word),
-						  replacement, strlen (replacement));
-		aspell_speller_save_all_word_lists (se->speller);
+		enchant_dict_store_replacement (se->speller, word, strlen (word),
+						replacement, strlen (replacement));
 		DICT_DEBUG (printf ("Set and saved.\n"));
 	}
 }
@@ -683,8 +597,8 @@ impl_gnome_spell_dictionary_get_suggesti
 					     const CORBA_char *word, CORBA_Environment *ev)
 {
 	GNOMESpellDictionary  *dict = GNOME_SPELL_DICTIONARY (bonobo_object_from_servant (servant));
-	const AspellWordList  *suggestions;
-	AspellStringEnumeration *elements;
+	char **suggestions;
+	size_t number_of_suggestions;
 	GNOME_Spell_StringSeq *seq = NULL;
 	GSList *l, *suggestion_list = NULL;
 	gint i, len, pos;
@@ -696,17 +610,19 @@ impl_gnome_spell_dictionary_get_suggesti
 		return NULL;
 #endif
 	DICT_DEBUG (printf ("Dictionary correction: %s\n", word));
-	update_engines (dict, ev);
 
 	len = 0;
 	for (l = dict->engines; l; l = l->next) {
 		SpellEngine *se = (SpellEngine *) l->data;
 
 		if (se->speller) {
-			suggestions  = aspell_speller_suggest (se->speller, word, strlen (word));
-			suggestion_list = g_slist_prepend (suggestion_list, (gpointer) suggestions);
-			len += 2*aspell_word_list_size (suggestions);
+			suggestions = enchant_dict_suggest (se->speller, word, strlen (word), &number_of_suggestions);
+			suggestion_list = g_slist_prepend (suggestion_list, 
+							   (gpointer) dup_string_list (suggestions, number_of_suggestions));
+			len += 2*number_of_suggestions;
 			suggestion_list = g_slist_prepend (suggestion_list, engine_to_language (dict, se));
+			suggestion_list = g_slist_prepend (suggestion_list, GINT_TO_POINTER (number_of_suggestions));
+			enchant_dict_free_string_list (se->speller, suggestions);
 		}
 	}
 
@@ -723,17 +639,18 @@ impl_gnome_spell_dictionary_get_suggesti
 		gint list_len;
 		gchar *language;
 
+		list_len = GPOINTER_TO_INT (l->data);
+		l = l->next;
 		language = (gchar *) l->data;
 		l = l->next;
-		suggestions = (const AspellWordList  *) l->data;
-		elements = aspell_word_list_elements (suggestions);
-		list_len = aspell_word_list_size (suggestions);
+		suggestions = (char **) l->data;
 		for (i = 0; i < list_len; i ++, pos ++) {
-			seq->_buffer [pos] = CORBA_string_dup (aspell_string_enumeration_next (elements));
+			seq->_buffer [pos] = CORBA_string_dup (suggestions [i]);
 			pos ++;
 			seq->_buffer [pos] = CORBA_string_dup (language);
 		}
-		delete_aspell_string_enumeration (elements);
+
+		g_strfreev (suggestions);
 	}
 	CORBA_sequence_set_release (seq, CORBA_TRUE);
 	g_slist_free (suggestion_list);
Index: gnome-spell/dictionary.h
===================================================================
RCS file: /cvs/gnome/gnome-spell/gnome-spell/dictionary.h,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 dictionary.h
--- gnome-spell/dictionary.h.enchant	5 Feb 2006 21:31:09 -0000	1.8
+++ gnome-spell/dictionary.h	2 Apr 2006 14:31:46 -0000
@@ -26,7 +26,6 @@
 G_BEGIN_DECLS
 
 #include <bonobo/bonobo-object.h>
-#include <aspell.h>
 
 #define GNOME_SPELL_DICTIONARY_TYPE        (gnome_spell_dictionary_get_type ())
 #define GNOME_SPELL_DICTIONARY(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), \
@@ -37,12 +36,6 @@ G_BEGIN_DECLS
 #define IS_GNOME_SPELL_DICTIONARY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GNOME_SPELL_DICTIONARY_TYPE))
 
 typedef struct {
-	AspellConfig  *config;
-	AspellSpeller *speller;
-	gboolean       changed;
-} SpellEngine;
-
-typedef struct {
 	gchar *abbreviation;
 	gchar *name;
 } LangInfo;
@@ -50,7 +43,6 @@ typedef struct {
 typedef struct {
 	BonoboObject parent;
 
-	gboolean changed;
 	GSList *engines;
 	GHashTable *languages;
 	GHashTable *engines_ht;
Index: gnome-spell/test-spell.c
===================================================================
RCS file: /cvs/gnome/gnome-spell/gnome-spell/test-spell.c,v
retrieving revision 1.12
diff -u -p -u -p -r1.12 test-spell.c
--- gnome-spell/test-spell.c.enchant	6 Mar 2003 16:37:36 -0000	1.12
+++ gnome-spell/test-spell.c	2 Apr 2006 14:31:46 -0000
@@ -52,7 +52,6 @@ main (int argc, char *argv [])
 	 * test dictionary
 	 */
 
-	GNOME_Spell_Dictionary_getLanguages (en, &ev);
 	GNOME_Spell_Dictionary_setLanguage (en, "en", &ev);
 
 	printf ("check: %s --> %d\n",


Index: gnome-spell.spec
===================================================================
RCS file: /cvs/pkgs/rpms/gnome-spell/devel/gnome-spell.spec,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- gnome-spell.spec	15 Oct 2007 14:52:52 -0000	1.28
+++ gnome-spell.spec	20 Dec 2007 13:08:09 -0000	1.29
@@ -2,7 +2,7 @@
 
 Name: gnome-spell
 Version: 1.0.8
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: GPL
 Group: Applications/Text
 Summary: Bonobo component for spell checking
@@ -12,6 +12,7 @@
 ### Patches ###
 
 Patch1: gnome-spell-1.0.7-multilib.patch
+Patch2: gnome-spell-enchant.patch
 
 ### Dependencies ###
 
@@ -21,9 +22,11 @@
 
 ### Build Dependencies ###
 
-BuildRequires: aspell-devel
+BuildRequires: enchant-devel
 BuildRequires: gettext
 BuildRequires: intltool
+BuildRequires: autoconf
+BuildRequires: automake
 BuildRequires: libbonoboui-devel
 BuildRequires: libglade2-devel
 BuildRequires: libgnomeui-devel
@@ -37,9 +40,12 @@
 %prep
 %setup -q -n gnome-spell-%{version}
 %patch1 -p1 -b .multilib
+%patch2 -p0 -b .enchant
 
 %build
 export _lib=%{_lib}
+autoconf
+automake
 %configure
 make
 
@@ -70,6 +76,9 @@
 %{_datadir}/idl/*
 
 %changelog
+* Thu Dec 20 2007 Caolan McNamara <caolanm at redhat.com> - 1.0.8-2.fc9
+- Unify dictionaries, make gnome-spell use enchant
+
 * Mon Oct 15 2007 Matthew Barnes <mbarnes at redhat.com> - 1.0.8-1.fc8
 - Update to 1.0.8
 




More information about the scm-commits mailing list