docs: further implement merging from doc-updates
authorStefan Kost <ensonic@users.sf.net>
Thu, 19 May 2011 13:42:43 +0000 (16:42 +0300)
committerStefan Kost <ensonic@users.sf.net>
Thu, 19 May 2011 13:42:43 +0000 (16:42 +0300)
Also merge interfaces and prerequisites files. Sort types before outputing the
hierarchy. This already avoid delta that would just have re-ordered entries.

gstdoc-scangobj
gtk-doc-plugins.mak
scangobj-merge.py

index f31bd46..5b13352 100755 (executable)
@@ -775,6 +775,16 @@ output_object_hierarchy (void)
   fclose (fp);
 }
 
+static int
+compare_types (const void *a, const void *b)
+{
+  const char *na = g_type_name (*((GType *)a));
+  const char *nb = g_type_name (*((GType *)b));
+
+  return g_strcmp0 (na, nb);
+}
+
+
 /* This is called recursively to output the hierarchy of a object. */
 static void
 output_hierarchy (FILE  *fp,
@@ -793,6 +803,8 @@ output_hierarchy (FILE  *fp,
   fprintf (fp, "%s\\n", g_type_name (type));
 
   children = g_type_children (type, &n_children);
+  qsort (children, n_children, sizeof (GType), compare_types);
+
 
   for (i=0; i < n_children; i++)
     output_hierarchy (fp, children[i], level + 1);
@@ -1578,9 +1590,9 @@ if (!defined($ENV{"GTK_DOC_KEEP_INTERMEDIATE"})) {
 }
 
 &UpdateFileIfChanged ($old_hierarchy_filename, $new_hierarchy_filename, 0);
-&UpdateFileIfChanged ($old_interfaces_filename, $new_interfaces_filename, 0);
-&UpdateFileIfChanged ($old_prerequisites_filename, $new_prerequisites_filename, 0);
 # we will merge these in scangobj-merge.py
+#&UpdateFileIfChanged ($old_interfaces_filename, $new_interfaces_filename, 0);
+#&UpdateFileIfChanged ($old_prerequisites_filename, $new_prerequisites_filename, 0);
 #&UpdateFileIfChanged ($old_signals_filename, $new_signals_filename, 0);
 #&UpdateFileIfChanged ($old_args_filename, $new_args_filename, 0);
 
index 1a0b7dc..f4d220f 100644 (file)
@@ -108,11 +108,7 @@ scanobj-update:
 
 # gstdoc-scanobj produces 5 output files (.new)
 # scangobj-merge.py merges them into the file which we commit later
-# TODO: scangobj-merge.py only merges signals and args
-#  - for interfaces and prerequisites do:
-#    'sort -du file file.new' and update file if changed
-#  - do that either in gstdoc-scanobj (which we change already) or in
-#    scangobj-merge.py
+# TODO: also merge the hierarchy
 scanobj-build.stamp: $(SCANOBJ_DEPS) $(basefiles)
        @echo "  DOC   Introspecting gobjects"
        @if test x"$(srcdir)" != x. ; then                              \
index 0682ab2..9a1cac9 100755 (executable)
@@ -3,7 +3,7 @@
 # vi:si:et:sw=4:sts=4:ts=4
 
 """
-parse, update and write .signals and .args files
+parse, merge and write gstdoc-scanobj files
 """
 
 import sys
@@ -110,8 +110,7 @@ class GDoc:
 
     def save_file(self, filename, backup=False):
         """
-        Save the signals information to the given .signals file if the
-        file content changed.
+        Save the information to the given file if the file content changed.
         """
         olddata = None
         try:
@@ -256,6 +255,25 @@ class Args(GDoc):
 
         return "\n".join(lines) + '\n'
 
+class SingleLine(GDoc):
+    def __init__(self):
+        self._objects = []
+
+    def load_data(self, data):
+        """
+        Load the .interfaces/.prerequisites lines, merge duplicates
+        """
+        # split data on '\n'
+        lines = data.splitlines();
+        # merge them into self._objects
+        for line in lines:
+            if line not in self._objects:
+                self._objects.append(line)
+
+    def get_data(self):
+        lines = sorted(self._objects)
+        return "\n".join(lines) + '\n'
+
 def main(argv):
     modulename = None
     try:
@@ -276,4 +294,16 @@ def main(argv):
     args.save_file(modulename + '.args', backup=True)
     os.unlink(modulename + '.args.new')
 
+    ifaces = SingleLine()
+    ifaces.load_file(modulename + '.interfaces')
+    ifaces.load_file(modulename + '.interfaces.new')
+    ifaces.save_file(modulename + '.interfaces', backup=True)
+    os.unlink(modulename + '.interfaces.new')
+
+    prereq = SingleLine()
+    prereq.load_file(modulename + '.prerequisites')
+    prereq.load_file(modulename + '.prerequisites.new')
+    prereq.save_file(modulename + '.prerequisites', backup=True)
+    os.unlink(modulename + '.prerequisites.new')
+
 main(sys.argv)