[pango] Add an update-cache mode to pango-query-modules



commit 0be0b43f677520b155004a48b8cb6e9942f40a75
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Aug 25 13:47:49 2012 -0400

    Add an update-cache mode to pango-query-modules
    
    It is inconvenient for distro-builders to redirect the output
    of pango-query-modules to a location that depends on various
    factors, such as architecture and pango module version.
    
    With this commit, you can just run pango-querymodules --update-cache,
    and it will replace the file #libdir/pango/1.8.0/modules.cache.

 docs/pango-querymodules.xml |   80 ++++++++++++++++++++++++++++++++++++------
 pango/querymodules.c        |   56 +++++++++++++++++++++++-------
 2 files changed, 111 insertions(+), 25 deletions(-)
---
diff --git a/docs/pango-querymodules.xml b/docs/pango-querymodules.xml
index f58c758..09c3209 100644
--- a/docs/pango-querymodules.xml
+++ b/docs/pango-querymodules.xml
@@ -31,7 +31,8 @@
 <refsynopsisdiv>
 <cmdsynopsis>
 <command>pango-querymodules</command>
-<arg choice="opt" rep="repeat">module</arg>
+<arg choice="opt" rep="repeat">OPTION</arg>
+<arg choice="opt" rep="repeat">MODULE</arg>
 </cmdsynopsis>
 </refsynopsisdiv>
 
@@ -41,11 +42,13 @@
 modules for Pango and writes it to <filename>stdout</filename>.
 </para>
 <para>
-If called without arguments, it looks for modules in the Pango module path.
+If called without MODULE arguments, it looks for modules in the Pango
+module path, which is specified by the key <literal>Pango/ModulesPath</literal>
+in the Pango configuration database.
 </para>
 <para>
-If called with arguments, it looks for the specified modules. The arguments
-may be absolute or relative paths.
+If called with MODULE arguments, it looks for the specified modules. The
+arguments may be absolute or relative paths.
 </para>
 <para>
 At runtime, Pango looks for the loadable module information (i.e. the output
@@ -53,15 +56,68 @@ of pango-querymodules) in <filename><replaceable>libdir</replaceable>/pango/1.8.
 </para>
 </refsect1>
 
+<refsect1><title>Options</title>
+<variablelist>
+
+<varlistentry>
+<term><option>-?</option>, <option>--help</option></term>
+<listitem><para>Prints a short help text and exits.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--version</option></term>
+<listitem><para>Prints version information.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--system</option></term>
+<listitem><para>Do not load user-specific configuration.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><option>--update-cache</option></term>
+<listitem><para>Update the Pango module cache file directly,
+instead of writing the information to <filename>stdout</filename>.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</refsect1>
+
 <refsect1 id="Environment"><title>Environment</title>
-<para>
-The Pango module path is specified by the key
-<literal>Pango/ModulesPath</literal> in the Pango config database, which is
-read from
-      <filename><replaceable>sysconfdir</replaceable>/pango/pangorc</filename>,
-      <filename>~/.config/pango/pangorc</filename> and the file specified in
-      the environment variable <envar>PANGO_RC_FILE</envar>.
-</para>
+<variablelist>
+
+<varlistentry>
+<term><envar>PANGO_RC_FILE</envar></term>
+<listitem><para>Specifies an additional rc file for the Pango configuration
+database, in addition to the system-wide and per-user files.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</refsect1>
+
+<refsect1><title>Files</title>
+
+<variablelist>
+
+<varlistentry>
+<term><filename><replaceable>sysconfdir</replaceable>/pango/pangorc</filename></term>
+<listitem><para>System-wide Pango configuration file.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><filename><envar>$XDG_CONFIG_HOME</envar>/pango/pangorc</filename></term>
+<listitem><para>User-specific Pango configuration file.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><filename><replaceable>libdir</replaceable>/pango/1.8.0/modules.cache</filename></term>
+<listitem><para>Location of the module cache file read by Pango.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
 </refsect1>
 
 <refsect1 id="Bugs"><title>Bugs</title>
diff --git a/pango/querymodules.c b/pango/querymodules.c
index a1eec70..4133ef9 100644
--- a/pango/querymodules.c
+++ b/pango/querymodules.c
@@ -113,7 +113,7 @@ string_from_script (PangoScript script)
 }
 
 static void
-query_module (const char *dir, const char *name)
+query_module (const char *dir, const char *name, GString *contents)
 {
   void (*list) (PangoEngineInfo **engines, gint *n_engines);
   void (*init) (GTypeModule *module);
@@ -161,17 +161,21 @@ query_module (const char *dir, const char *name)
 	      quoted_path = g_strdup (path);
 	    }
 
-	  g_printf ("%s%s%s %s %s %s", quote, quoted_path, quote,
-		    engines[i].id, engines[i].engine_type, engines[i].render_type);
+	  g_string_append_printf (contents,
+                                  "%s%s%s %s %s %s",
+                                  quote, quoted_path, quote,
+		                  engines[i].id, engines[i].engine_type,
+                                  engines[i].render_type);
 	  g_free (quoted_path);
 
 	  for (j=0; j < engines[i].n_scripts; j++)
 	    {
-	      g_printf (" %s:%s",
-			string_from_script (engines[i].scripts[j].script),
-			engines[i].scripts[j].langs);
+	      g_string_append_printf (contents,
+                                      " %s:%s",
+			              string_from_script (engines[i].scripts[j].script),
+			              engines[i].scripts[j].langs);
 	    }
-	  g_printf ("\n");
+	  g_string_append_c (contents, '\n');
 	}
     }
   else
@@ -203,12 +207,16 @@ main (int argc, char **argv)
   char *path;
   GOptionContext *context;
   GError *parse_error = NULL;
+  gboolean update_cache = FALSE;
+  GString *contents;
   GOptionEntry entries[] =
     {
       {"version",	0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &show_version,
        "Show version numbers",                                             NULL},
       {"system",	0, 0, G_OPTION_ARG_NONE, &system_mode,
        "Do not load configuration from home directory", NULL},
+      {"update-cache",	0, 0, G_OPTION_ARG_NONE, &update_cache,
+       "Update the default cache file", NULL},
       {NULL}
     };
 
@@ -232,9 +240,11 @@ main (int argc, char **argv)
 
   g_type_init ();
 
-  g_printf ("# Pango Modules file\n"
-	    "# Automatically generated file, do not edit\n"
-	    "#\n");
+  contents = g_string_new ("");
+  g_string_append (contents,
+                   "# Pango Modules file\n"
+                   "# Automatically generated file, do not edit\n"
+                   "#\n");
 
   if (argc == 1)		/* No arguments given */
     {
@@ -251,7 +261,7 @@ main (int argc, char **argv)
 				 "modules",
 				 NULL);
 
-      g_printf ("# ModulesPath = %s\n#\n", path);
+      g_string_append_printf (contents, "# ModulesPath = %s\n#\n", path);
 
       dirs = pango_split_file_list (path);
 
@@ -268,7 +278,7 @@ main (int argc, char **argv)
 		{
 		  int len = strlen (dent);
 		  if (len > SOEXT_LEN && strcmp (dent + len - SOEXT_LEN, SOEXT) == 0)
-		    query_module (dirs[i], dent);
+		    query_module (dirs[i], dent, contents);
 		}
 
 	      g_dir_close (dir);
@@ -282,10 +292,30 @@ main (int argc, char **argv)
       cwd = g_get_current_dir ();
 
       for (i=1; i<argc; i++)
-	query_module (cwd, argv[i]);
+	query_module (cwd, argv[i], contents);
 
       g_free (cwd);
     }
 
+  if (update_cache)
+    {
+      gchar *cache_file;
+      GError *err;
+
+      cache_file = g_build_filename (pango_get_lib_subdirectory (),
+                                     MODULE_VERSION,
+                                     "modules.cache",
+                                     NULL);
+      err = NULL;
+      if (!g_file_set_contents (cache_file, contents->str, -1, &err))
+        {
+          g_fprintf (stderr, "%s\n", err->message);
+          exit(1);
+        }
+      g_free (cache_file);
+    }
+  else
+    g_print ("%s\n", contents->str);
+
   return 0;
 }



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