[ostree] triggers: We need to order their execution



commit 633da1e7adf911d2213b390378aa74d86ce427f2
Author: Colin Walters <walters verbum org>
Date:   Sun Feb 19 20:52:50 2012 -0500

    triggers: We need to order their execution
    
    Otherwise we run in inode order which is unpredictable.  In particular
    this causes problems because we might run e.g. the gtk+ trigger before
    the gdk-pixbuf one.  And ldconfig should really be first.

 Makefile-triggers.am                               |   20 +++---
 src/triggers/ostree-run-triggers.c                 |   76 ++++++++++++++++----
 .../{ldconfig.trigger => 0001ldconfig.trigger}     |    0
 ...-database.trigger => 0010mime-database.trigger} |    0
 .../{dconf.trigger => 0020dconf.trigger}           |    0
 .../triggers.d/{glib.trigger => 0030glib.trigger}  |    0
 .../{gdk-pixbuf.trigger => 0040gdk-pixbuf.trigger} |    0
 .../{gconf.trigger => 0050gconf.trigger}           |    0
 .../{immodules.trigger => 0060immodules.trigger}   |    0
 .../{pango.trigger => 0070pango.trigger}           |    0
 .../triggers.d/{gtk+.trigger => 0080gtk+.trigger}  |    0
 ...tabase.trigger => 0090desktop-database.trigger} |    0
 12 files changed, 72 insertions(+), 24 deletions(-)
---
diff --git a/Makefile-triggers.am b/Makefile-triggers.am
index 172a7c6..a4d54fc 100644
--- a/Makefile-triggers.am
+++ b/Makefile-triggers.am
@@ -19,16 +19,16 @@
 
 triggersdir = $(libexecdir)/ostree/triggers.d
 triggers_SCRIPTS = \
-	src/triggers/triggers.d/dconf.trigger \
-	src/triggers/triggers.d/desktop-database.trigger \
-	src/triggers/triggers.d/gdk-pixbuf.trigger \
-	src/triggers/triggers.d/gconf.trigger \
-	src/triggers/triggers.d/glib.trigger \
-	src/triggers/triggers.d/gtk+.trigger \
-	src/triggers/triggers.d/immodules.trigger \
-	src/triggers/triggers.d/ldconfig.trigger \
-	src/triggers/triggers.d/mime-database.trigger \
-	src/triggers/triggers.d/pango.trigger \
+	src/triggers/triggers.d/0001ldconfig.trigger \
+	src/triggers/triggers.d/0010mime-database.trigger \
+	src/triggers/triggers.d/0020dconf.trigger \
+	src/triggers/triggers.d/0030glib.trigger \
+	src/triggers/triggers.d/0040gdk-pixbuf.trigger \
+	src/triggers/triggers.d/0050gconf.trigger \
+	src/triggers/triggers.d/0060immodules.trigger \
+	src/triggers/triggers.d/0070pango.trigger \
+	src/triggers/triggers.d/0080gtk+.trigger \
+	src/triggers/triggers.d/0090desktop-database.trigger \
 	$(NULL)
 
 bin_PROGRAMS += ostree-run-triggers
diff --git a/src/triggers/ostree-run-triggers.c b/src/triggers/ostree-run-triggers.c
index 29f036b..7145cb6 100644
--- a/src/triggers/ostree-run-triggers.c
+++ b/src/triggers/ostree-run-triggers.c
@@ -128,9 +128,26 @@ check_trigger (GFile          *trigger,
   return ret;
 }
 
+static int
+compare_files_by_basename (gconstpointer  ap,
+                           gconstpointer  bp)
+{
+  GFile *a = (GFile*)ap;
+  GFile *b = (GFile*)ap;
+  char *name_a, *name_b;
+  int c;
 
-gboolean
-run_triggers (GError        **error)
+  name_a = g_file_get_basename (a);
+  name_b = g_file_get_basename (b);
+  c = strcmp (name_a, name_b);
+  g_free (name_b);
+  g_free (name_a);
+  return c;
+}
+
+static gboolean
+get_sorted_triggers (GPtrArray       **out_triggers,
+                     GError          **error)
 {
   gboolean ret = FALSE;
   GError *temp_error = NULL;
@@ -138,6 +155,9 @@ run_triggers (GError        **error)
   GFile *triggerdir = NULL;
   GFileInfo *file_info = NULL;
   GFileEnumerator *enumerator = NULL;
+  GPtrArray *ret_triggers = NULL;
+
+  ret_triggers = g_ptr_array_new_with_free_func ((GDestroyNotify)g_object_unref);
 
   triggerdir_path = g_build_filename (LIBEXECDIR, "ostree", "triggers.d", NULL);
   triggerdir = g_file_new_for_path (triggerdir_path);
@@ -153,40 +173,68 @@ run_triggers (GError        **error)
     {
       const char *name;
       guint32 type;
-      char *child_path = NULL;
-      GFile *child = NULL;
-      gboolean success;
 
       name = g_file_info_get_attribute_byte_string (file_info, "standard::name"); 
       type = g_file_info_get_attribute_uint32 (file_info, "standard::type");
       
       if (type == G_FILE_TYPE_REGULAR && g_str_has_suffix (name, ".trigger"))
         {
+          char *child_path;
+          GFile *child;
+
           child_path = g_build_filename (triggerdir_path, name, NULL);
           child = g_file_new_for_path (child_path);
+          g_free (child_path);
 
-          success = check_trigger (child, error);
+          g_ptr_array_add (ret_triggers, child);
         }
-      else
-        success = TRUE;
-
-      g_object_unref (file_info);
-      g_free (child_path);
-      g_clear_object (&child);
-      if (!success)
-        goto out;
+      g_clear_object (&file_info);
     }
   if (file_info == NULL && temp_error != NULL)
     {
       g_propagate_error (error, temp_error);
       goto out;
     }
+  
+  g_ptr_array_sort (ret_triggers, compare_files_by_basename);
 
   ret = TRUE;
+  if (out_triggers)
+    {
+      *out_triggers = ret_triggers;
+      ret_triggers = NULL;
+    }
  out:
   g_free (triggerdir_path);
   g_clear_object (&triggerdir);
   g_clear_object (&enumerator);
+  if (ret_triggers)
+    g_ptr_array_unref (ret_triggers);
+  return ret;
+}
+
+gboolean
+run_triggers (GError        **error)
+{
+  gboolean ret = FALSE;
+  int i;
+  GPtrArray *triggers = NULL;
+
+  if (!get_sorted_triggers (&triggers, error))
+    goto out;
+
+  for (i = 0; i < triggers->len; i++)
+    {
+      GFile *trigger = triggers->pdata[i];
+
+      if (!check_trigger (trigger, error))
+        goto out;
+    }
+
+  ret = TRUE;
+ out:
+  if (triggers)
+    g_ptr_array_unref (triggers);
   return ret;
 }
 
diff --git a/src/triggers/triggers.d/ldconfig.trigger b/src/triggers/triggers.d/0001ldconfig.trigger
similarity index 100%
rename from src/triggers/triggers.d/ldconfig.trigger
rename to src/triggers/triggers.d/0001ldconfig.trigger
diff --git a/src/triggers/triggers.d/mime-database.trigger b/src/triggers/triggers.d/0010mime-database.trigger
similarity index 100%
rename from src/triggers/triggers.d/mime-database.trigger
rename to src/triggers/triggers.d/0010mime-database.trigger
diff --git a/src/triggers/triggers.d/dconf.trigger b/src/triggers/triggers.d/0020dconf.trigger
similarity index 100%
rename from src/triggers/triggers.d/dconf.trigger
rename to src/triggers/triggers.d/0020dconf.trigger
diff --git a/src/triggers/triggers.d/glib.trigger b/src/triggers/triggers.d/0030glib.trigger
similarity index 100%
rename from src/triggers/triggers.d/glib.trigger
rename to src/triggers/triggers.d/0030glib.trigger
diff --git a/src/triggers/triggers.d/gdk-pixbuf.trigger b/src/triggers/triggers.d/0040gdk-pixbuf.trigger
similarity index 100%
rename from src/triggers/triggers.d/gdk-pixbuf.trigger
rename to src/triggers/triggers.d/0040gdk-pixbuf.trigger
diff --git a/src/triggers/triggers.d/gconf.trigger b/src/triggers/triggers.d/0050gconf.trigger
similarity index 100%
rename from src/triggers/triggers.d/gconf.trigger
rename to src/triggers/triggers.d/0050gconf.trigger
diff --git a/src/triggers/triggers.d/immodules.trigger b/src/triggers/triggers.d/0060immodules.trigger
similarity index 100%
rename from src/triggers/triggers.d/immodules.trigger
rename to src/triggers/triggers.d/0060immodules.trigger
diff --git a/src/triggers/triggers.d/pango.trigger b/src/triggers/triggers.d/0070pango.trigger
similarity index 100%
rename from src/triggers/triggers.d/pango.trigger
rename to src/triggers/triggers.d/0070pango.trigger
diff --git a/src/triggers/triggers.d/gtk+.trigger b/src/triggers/triggers.d/0080gtk+.trigger
similarity index 100%
rename from src/triggers/triggers.d/gtk+.trigger
rename to src/triggers/triggers.d/0080gtk+.trigger
diff --git a/src/triggers/triggers.d/desktop-database.trigger b/src/triggers/triggers.d/0090desktop-database.trigger
similarity index 100%
rename from src/triggers/triggers.d/desktop-database.trigger
rename to src/triggers/triggers.d/0090desktop-database.trigger



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