patch: sort commodities on write.

Rob Browning rlb@cs.utexas.edu
05 Nov 2000 17:14:59 -0600


Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/xacc/ChangeLog,v
retrieving revision 1.177
diff -u -r1.177 ChangeLog
--- ChangeLog	2000/10/30 10:46:38	1.177
+++ ChangeLog	2000/11/05 23:10:22
@@ -1,3 +1,8 @@
+2000-11-05  Rob Browning  <rlb@cs.utexas.edu>
+
+	* src/engine/io-gncxml-w.c: sort commodities by namespace and id
+	before writing so we get stable output.
+
 2000-10-30  Dave Peticolas  <dave@krondo.com>
 
 	* src/gnc-exp-parser.c: modify to use gnc_numerics instead of
Index: src/engine/io-gncxml-w.c
===================================================================
RCS file: /home/cvs/cvsroot/xacc/src/engine/io-gncxml-w.c,v
retrieving revision 1.6
diff -u -r1.6 io-gncxml-w.c
--- src/engine/io-gncxml-w.c	2000/11/01 08:51:58	1.6
+++ src/engine/io-gncxml-w.c	2000/11/05 23:10:22
@@ -271,7 +271,23 @@
 
   return(TRUE);
 }
-  
+
+
+static gint
+compare_namespaces(gconstpointer a, gconstpointer b) {
+  const gchar *sa = (const gchar *) a;
+  const gchar *sb = (const gchar *) b;
+  return(safe_strcmp(sa, sb));
+}
+
+static gint
+compare_commodity_ids(gconstpointer a, gconstpointer b) {
+  const gnc_commodity *ca = (const gnc_commodity *) a;
+  const gnc_commodity *cb = (const gnc_commodity *) b;
+  return(safe_strcmp(gnc_commodity_get_mnemonic(ca),
+                     gnc_commodity_get_mnemonic(cb)));
+}
+
 static gboolean
 xml_add_commodity_restorers(xmlNodePtr p) {
   gnc_commodity_table *commodities;
@@ -283,7 +299,9 @@
   commodities = gnc_engine_commodities();
   if(!commodities) return(FALSE);
 
-  namespaces = gnc_commodity_table_get_namespaces(commodities);
+  namespaces = g_list_sort(gnc_commodity_table_get_namespaces(commodities),
+                           compare_namespaces);
+  
 
   for(lp = namespaces; lp; lp = lp->next) {
     gchar *space;
@@ -297,6 +315,8 @@
     if(strcmp(GNC_COMMODITY_NS_ISO, space) != 0) {
       GList *comms = gnc_commodity_table_get_commodities(commodities, space);
       GList *lp2;
+
+      comms = g_list_sort(comms, compare_commodity_ids);
 
       for(lp2 = comms; lp2; lp2 = lp2->next) {
         gnc_commodity *com = (gnc_commodity *) lp2->data;


-- 
Rob Browning <rlb@cs.utexas.edu> PGP=E80E0D04F521A094 532B97F5D64E3930