[Xfce4-commits] <xfce4-panel:master> Prepare for filtered debugging.

Nick Schermer noreply at xfce.org
Tue Jan 4 22:10:01 CET 2011


Updating branch refs/heads/master
         to df0deff57e9a27cb30522fe0bb5b4834e10b6ab2 (commit)
       from 6a2b1033cffb2ff7bc9a13445b437afab5cd15a4 (commit)

commit df0deff57e9a27cb30522fe0bb5b4834e10b6ab2
Author: Nick Schermer <nick at xfce.org>
Date:   Tue Jan 4 19:45:25 2011 +0100

    Prepare for filtered debugging.

 common/panel-debug.c                        |   74 ++++++++++++++++++++-------
 common/panel-debug.h                        |   31 +++++------
 panel/main.c                                |   10 ++--
 panel/panel-application.c                   |    4 +-
 panel/panel-base-window.c                   |    2 +-
 panel/panel-plugin-external-wrapper.c       |    2 +-
 panel/panel-plugin-external.c               |   20 ++++---
 panel/panel-window.c                        |   18 +++---
 plugins/applicationsmenu/applicationsmenu.c |    6 +-
 plugins/tasklist/tasklist-widget.c          |    2 +-
 10 files changed, 103 insertions(+), 66 deletions(-)

diff --git a/common/panel-debug.c b/common/panel-debug.c
index 0a76d27..3f8e2f4 100644
--- a/common/panel-debug.c
+++ b/common/panel-debug.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 Nick Schermer <nick at xfce.org>
+ * Copyright (C) 2010-2011 Nick Schermer <nick at xfce.org>
  *
  * This library is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -37,28 +37,31 @@ PanelDebugFlag panel_debug_flags = 0;
 /* additional debug levels */
 static const GDebugKey panel_debug_keys[] =
 {
+  { "main", PANEL_DEBUG_MAIN },
+  { "positioning", PANEL_DEBUG_POSITIONING },
+  { "display-layout", PANEL_DEBUG_DISPLAY_LAYOUT },
+  { "struts", PANEL_DEBUG_STRUTS },
+  { "application", PANEL_DEBUG_APPLICATION },
+  { "external", PANEL_DEBUG_EXTERNAL },
+  { "external46", PANEL_DEBUG_EXTERNAL46 },
+  { "tasklist", PANEL_DEBUG_TASKLIST },
+  { "base-window", PANEL_DEBUG_BASE_WINDOW },
+  { "applicationmenu", PANEL_DEBUG_APPLICATIONMENU },
   { "gdb", PANEL_DEBUG_GDB },
   { "valgrind", PANEL_DEBUG_VALGRIND }
 };
 
 
 
-void
-panel_debug (const gchar *domain,
-             const gchar *message,
-             ...)
+static PanelDebugFlag
+panel_debug_init (void)
 {
-  static volatile gsize   level__volatile = 0;
-  const gchar            *value;
-  gchar                  *string, *path;
-  va_list                 args;
-  const gchar            *proxy_application;
-
-  panel_return_if_fail (domain != NULL);
-  panel_return_if_fail (message != NULL);
+  static volatile gsize  inited__volatile = 0;
+  const gchar           *value;
+  gchar                 *path;
+  const gchar           *proxy_application;
 
-  /* initialize the debugging domains */
-  if (g_once_init_enter (&level__volatile))
+  if (g_once_init_enter (&inited__volatile))
     {
       value = g_getenv ("PANEL_DEBUG");
       if (value != NULL && *value != '\0')
@@ -66,7 +69,7 @@ panel_debug (const gchar *domain,
           panel_debug_flags = g_parse_debug_string (value, panel_debug_keys,
                                                     G_N_ELEMENTS (panel_debug_keys));
 
-          /* always enable debug logging */
+          /* always enable (unfiltered) debugging messages */
           PANEL_SET_FLAG (panel_debug_flags, PANEL_DEBUG_YES);
 
           if (PANEL_HAS_FLAG (panel_debug_flags, PANEL_DEBUG_GDB))
@@ -75,6 +78,9 @@ panel_debug (const gchar *domain,
 
               /* performs sanity checks on the released memory slices */
               g_setenv ("G_SLICE", "debug-blocks", TRUE);
+
+              /* make sure we don't run gdb and valgrind at the same time */
+              PANEL_UNSET_FLAG (panel_debug_flags, PANEL_DEBUG_VALGRIND);
             }
           else if (PANEL_HAS_FLAG (panel_debug_flags, PANEL_DEBUG_VALGRIND))
             {
@@ -109,17 +115,47 @@ panel_debug (const gchar *domain,
             }
         }
 
-      g_once_init_leave (&level__volatile, 1);
+      g_once_init_leave (&inited__volatile, 1);
     }
 
+  return panel_debug_flags;
+}
+
+
+
+void
+panel_debug (PanelDebugFlag  domain,
+             const gchar    *message,
+             ...)
+{
+  gchar       *string;
+  va_list      args;
+  const gchar *domain_name = NULL;
+  guint        i;
+
+  panel_return_if_fail (domain > 0);
+  panel_return_if_fail (message != NULL);
+
   /* leave when debug is disabled */
-  if (panel_debug_flags == 0)
+  if (panel_debug_init () == 0)
     return;
 
+  /* lookup domain name */
+  for (i = 0; i < G_N_ELEMENTS (panel_debug_keys); i++)
+    {
+      if (panel_debug_keys[i].value == domain)
+        {
+          domain_name = panel_debug_keys[i].key;
+          break;
+        }
+    }
+
+  panel_assert (domain_name != NULL);
+
   va_start (args, message);
   string = g_strdup_vprintf (message, args);
   va_end (args);
 
-  g_printerr (PACKAGE_NAME "(%s): %s\n", domain, string);
+  g_printerr (PACKAGE_NAME "(%s): %s\n", domain_name, string);
   g_free (string);
 }
diff --git a/common/panel-debug.h b/common/panel-debug.h
index 8cf3a85..b05211e 100644
--- a/common/panel-debug.h
+++ b/common/panel-debug.h
@@ -19,31 +19,30 @@
 #ifndef __PANEL_DEBUG_H__
 #define __PANEL_DEBUG_H__
 
-#define PANEL_DEBUG_DOMAIN_MAIN            "main"
-#define PANEL_DEBUG_DOMAIN_POSITIONING     "positioning"
-#define PANEL_DEBUG_DOMAIN_DISPLAY_LAYOUT  "display-layout"
-#define PANEL_DEBUG_DOMAIN_STRUTS          "struts"
-#define PANEL_DEBUG_DOMAIN_APPLICATION     "application"
-#define PANEL_DEBUG_DOMAIN_EXTERNAL        "external"
-#define PANEL_DEBUG_DOMAIN_EXTERNAL46      "external46"
-#define PANEL_DEBUG_DOMAIN_TASKLIST        "tasklist"
-#define PANEL_DEBUG_DOMAIN_BASE_WINDOW     "base-window"
-#define PANEL_DEBUG_DOMAIN_APPLICATIONMENU "applicationmenu"
-
 #define PANEL_DEBUG_BOOL(bool) ((bool) ? "true" : "false")
 
 typedef enum
 {
-  PANEL_DEBUG_YES      = 1 << 0,  /* always enabled if PANEL_DEBUG is not %NULL */
-  PANEL_DEBUG_GDB      = 1 << 1,  /* run plugin in gdb */
-  PANEL_DEBUG_VALGRIND = 1 << 2   /* run plugin in valgrind */
+  PANEL_DEBUG_YES             = 1 << 0, /* always enabled if PANEL_DEBUG is not %NULL */
+  PANEL_DEBUG_MAIN            = 1 << 1,
+  PANEL_DEBUG_POSITIONING     = 1 << 2,
+  PANEL_DEBUG_DISPLAY_LAYOUT  = 1 << 3,
+  PANEL_DEBUG_STRUTS          = 1 << 4,
+  PANEL_DEBUG_APPLICATION     = 1 << 5,
+  PANEL_DEBUG_EXTERNAL        = 1 << 6,
+  PANEL_DEBUG_EXTERNAL46      = 1 << 7,
+  PANEL_DEBUG_TASKLIST        = 1 << 8,
+  PANEL_DEBUG_BASE_WINDOW     = 1 << 9,
+  PANEL_DEBUG_APPLICATIONMENU = 1 << 10,
+  PANEL_DEBUG_GDB             = 1 << 11, /* run plugin in gdb */
+  PANEL_DEBUG_VALGRIND        = 1 << 12  /* run plugin in valgrind */
 }
 PanelDebugFlag;
 
 extern PanelDebugFlag panel_debug_flags;
 
-void panel_debug (const gchar *domain,
-                  const gchar *message,
+void panel_debug (PanelDebugFlag  domain,
+                  const gchar    *message,
                   ...) G_GNUC_PRINTF (2, 3);
 
 #endif /* !__PANEL_DEBUG_H__ */
diff --git a/panel/main.c b/panel/main.c
index 8190f17..446decc 100644
--- a/panel/main.c
+++ b/panel/main.c
@@ -121,7 +121,7 @@ panel_callback_handler (const gchar  *name,
 static void
 panel_signal_handler (gint signum)
 {
-  panel_debug (PANEL_DEBUG_DOMAIN_MAIN,
+  panel_debug (PANEL_DEBUG_MAIN,
                "received signal %s <%d>, %s panel",
                g_strsignal (signum), signum,
                signum == SIGUSR1 ? "restarting" : "quiting");
@@ -137,7 +137,7 @@ panel_sm_client_quit (XfceSMClient *sm_client)
   panel_return_if_fail (XFCE_IS_SM_CLIENT (sm_client));
   panel_return_if_fail (!panel_dbus_service_get_restart ());
 
-  panel_debug (PANEL_DEBUG_DOMAIN_MAIN,
+  panel_debug (PANEL_DEBUG_MAIN,
                "terminate panel for session manager");
 
   gtk_main_quit ();
@@ -152,7 +152,7 @@ panel_sm_client_save_state (XfceSMClient     *sm_client,
   panel_return_if_fail (XFCE_IS_SM_CLIENT (sm_client));
   panel_return_if_fail (PANEL_IS_APPLICATION (application));
 
-  panel_debug (PANEL_DEBUG_DOMAIN_MAIN,
+  panel_debug (PANEL_DEBUG_MAIN,
                "save configuration for session manager");
 
   panel_application_save (application, TRUE);
@@ -175,7 +175,7 @@ main (gint argc, gchar **argv)
   const gchar      *error_msg;
   XfceSMClient     *sm_client;
 
-  panel_debug (PANEL_DEBUG_DOMAIN_MAIN,
+  panel_debug (PANEL_DEBUG_MAIN,
                "version %s on gtk+ %d.%d.%d (%d.%d.%d), glib %d.%d.%d (%d.%d.%d)",
                LIBXFCE4PANEL_VERSION,
                gtk_major_version, gtk_minor_version, gtk_micro_version,
@@ -363,7 +363,7 @@ dbus_return:
                                          "automatically started the next time you login."),
                                        _("No running instance of %s was found"), G_LOG_DOMAIN))
                 {
-                  panel_debug (PANEL_DEBUG_DOMAIN_MAIN, "user confirmed to start the panel");
+                  panel_debug (PANEL_DEBUG_MAIN, "user confirmed to start the panel");
                   goto launch_panel;
                 }
               else
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 7baa644..9431f89 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -244,7 +244,7 @@ panel_application_finalize (GObject *object)
   g_object_unref (G_OBJECT (application->factory));
 
   /* this is a good reference if all the objects are released */
-  panel_debug (PANEL_DEBUG_DOMAIN_APPLICATION, "finalized");
+  panel_debug (PANEL_DEBUG_APPLICATION, "finalized");
 
   (*G_OBJECT_CLASS (panel_application_parent_class)->finalize) (object);
 }
@@ -1112,7 +1112,7 @@ panel_application_save (PanelApplication *application,
       if (panel_window_get_locked (li->data))
         continue;
 
-      panel_debug (PANEL_DEBUG_DOMAIN_APPLICATION,
+      panel_debug (PANEL_DEBUG_APPLICATION,
                    "saving /panels/panel-%u, save-plugins=%s",
                    i, PANEL_DEBUG_BOOL (save_plugin_providers));
 
diff --git a/panel/panel-base-window.c b/panel/panel-base-window.c
index 268daf6..9a0f3fe 100644
--- a/panel/panel-base-window.c
+++ b/panel/panel-base-window.c
@@ -670,7 +670,7 @@ panel_base_window_composited_changed (GtkWidget *widget)
   panel_return_if_fail (GDK_IS_COLORMAP (colormap));
   colormap_changed = gtk_widget_get_colormap (widget) != colormap;
 
-  panel_debug (PANEL_DEBUG_DOMAIN_BASE_WINDOW,
+  panel_debug (PANEL_DEBUG_BASE_WINDOW,
                "set new colormap; composited=%s, rgba=%s, visible=%s",
                PANEL_DEBUG_BOOL (gtk_widget_is_composited (widget)),
                PANEL_DEBUG_BOOL (colormap_rgba),
diff --git a/panel/panel-plugin-external-wrapper.c b/panel/panel-plugin-external-wrapper.c
index 64a5c43..f4a3607 100644
--- a/panel/panel-plugin-external-wrapper.c
+++ b/panel/panel-plugin-external-wrapper.c
@@ -185,7 +185,7 @@ panel_plugin_external_wrapper_constructor (GType                  type,
       panel_return_val_if_fail (PANEL_PLUGIN_EXTERNAL (object)->unique_id != -1, NULL);
       path = g_strdup_printf (PANEL_DBUS_WRAPPER_PATH, PANEL_PLUGIN_EXTERNAL (object)->unique_id);
       dbus_g_connection_register_g_object (connection, path, object);
-      panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL, "register dbus path %s", path);
+      panel_debug (PANEL_DEBUG_EXTERNAL, "register dbus path %s", path);
       g_free (path);
 
       dbus_g_connection_unref (connection);
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index e544856..6ed2669 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -358,7 +358,7 @@ panel_plugin_external_unrealize (GtkWidget *widget)
         kill (external->priv->pid, SIGTERM);
     }
 
-  panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+  panel_debug (PANEL_DEBUG_EXTERNAL,
                "%s-%d: plugin unrealized; quiting child",
                panel_module_get_name (external->module),
                external->unique_id);
@@ -375,7 +375,7 @@ panel_plugin_external_plug_added (GtkSocket *socket)
 
   external->priv->embedded = TRUE;
 
-  panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+  panel_debug (PANEL_DEBUG_EXTERNAL,
                "%s-%d: child is embedded; %d properties in queue",
                panel_module_get_name (external->module),
                external->unique_id,
@@ -394,7 +394,7 @@ panel_plugin_external_plug_removed (GtkSocket *socket)
 
   external->priv->embedded = FALSE;
 
-  panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+  panel_debug (PANEL_DEBUG_EXTERNAL,
                "%s-%d: child is unembedded",
                panel_module_get_name (external->module),
                external->unique_id);
@@ -510,6 +510,8 @@ panel_plugin_external_child_spawn (PanelPluginExternal *external)
       cmd_line = NULL;
       program = NULL;
 
+      /* note that if the program was not found in PATH, we already
+       * warned for it in panel_debug_init, so no need to do that again */
       if (PANEL_HAS_FLAG (panel_debug_flags, PANEL_DEBUG_GDB))
         {
           program = g_find_program_in_path ("gdb");
@@ -560,7 +562,7 @@ panel_plugin_external_child_spawn (PanelPluginExternal *external)
         }
       else
         {
-          panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+          panel_debug (PANEL_DEBUG_EXTERNAL,
                        "%s-%d: Failed to run the plugin in %s: %s",
                        panel_module_get_name (external->module),
                        external->unique_id, program,
@@ -580,7 +582,7 @@ panel_plugin_external_child_spawn (PanelPluginExternal *external)
                                  G_SPAWN_DO_NOT_REAP_CHILD, NULL,
                                  NULL, &pid, &error);
 
-  panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+  panel_debug (PANEL_DEBUG_EXTERNAL,
                "%s-%d: child spawned; pid=%d, argc=%d",
                panel_module_get_name (external->module),
                external->unique_id, pid, g_strv_length (argv));
@@ -619,7 +621,7 @@ panel_plugin_external_child_respawn (gpointer user_data)
   /* delay startup if the old child is still embedded */
   if (external->priv->embedded)
     {
-      panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+      panel_debug (PANEL_DEBUG_EXTERNAL,
                    "%s-%d: still a child embedded, respawn delayed",
                    panel_module_get_name (external->module), external->unique_id);
 
@@ -661,7 +663,7 @@ panel_plugin_external_child_watch (GPid     pid,
 
   external->priv->pid = 0;
 
-  panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+  panel_debug (PANEL_DEBUG_EXTERNAL,
                "%s-%d: child exited with status %d",
                panel_module_get_name (external->module),
                external->unique_id, status);
@@ -716,7 +718,7 @@ panel_plugin_external_child_watch (GPid     pid,
       && external->priv->spawn_timeout_id == 0
       && (auto_restart || panel_plugin_external_child_ask_restart (external)))
     {
-       panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+       panel_debug (PANEL_DEBUG_EXTERNAL,
                     "%s-%d: scheduled a respawn of the child",
                     panel_module_get_name (external->module), external->unique_id);
 
@@ -1038,7 +1040,7 @@ panel_plugin_external_restart (PanelPluginExternal *external)
 
   if (external->priv->pid != 0)
     {
-      panel_debug (PANEL_DEBUG_DOMAIN_EXTERNAL,
+      panel_debug (PANEL_DEBUG_EXTERNAL,
                    "%s-%d: child asked to restart; pid=%d",
                    panel_module_get_name (external->module),
                    external->unique_id, external->priv->pid);
diff --git a/panel/panel-window.c b/panel/panel-window.c
index a41a308..853bd8c 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -1520,11 +1520,11 @@ panel_window_screen_struts_set (PanelWindow *window)
       else if (struts[STRUT_BOTTOM] != 0)
         n = STRUT_BOTTOM;
       else
-        panel_debug (PANEL_DEBUG_DOMAIN_STRUTS, "unset");
+        panel_debug (PANEL_DEBUG_STRUTS, "unset");
 
       if (n != -1)
         {
-          panel_debug (PANEL_DEBUG_DOMAIN_STRUTS,
+          panel_debug (PANEL_DEBUG_STRUTS,
                        "%s=%ld, start_%s=%ld, end_%s=%ld",
                        strut_border[n], struts[n],
                        strut_xy[n], struts[4 + n * 2],
@@ -1728,7 +1728,7 @@ panel_window_display_layout_debug (GtkWidget *widget)
         g_string_append (str, ", ");
     }
 
-  panel_debug (PANEL_DEBUG_DOMAIN_DISPLAY_LAYOUT,
+  panel_debug (PANEL_DEBUG_DISPLAY_LAYOUT,
                "display %s: %s",
                gdk_display_get_name (display), str->str);
 
@@ -1774,7 +1774,7 @@ panel_window_screen_layout_changed (GdkScreen   *screen,
   n_monitors = gdk_screen_get_n_monitors (screen);
   panel_return_if_fail (n_monitors > 0);
 
-  panel_debug (PANEL_DEBUG_DOMAIN_POSITIONING,
+  panel_debug (PANEL_DEBUG_POSITIONING,
                "monitors=%d, output-name=%s, span-monitors=%s, base=%d,%d",
                n_monitors, window->output_name,
                PANEL_DEBUG_BOOL (window->span_monitors),
@@ -1802,7 +1802,7 @@ panel_window_screen_layout_changed (GdkScreen   *screen,
           display = gdk_screen_get_display (screen);
           if (gdk_display_get_n_screens (display) - 1 < screen_num)
             {
-              panel_debug (PANEL_DEBUG_DOMAIN_POSITIONING,
+              panel_debug (PANEL_DEBUG_POSITIONING,
                            "screen-%d not found, hiding panel", screen_num);
 
               /* out of range, hide the window */
@@ -1812,7 +1812,7 @@ panel_window_screen_layout_changed (GdkScreen   *screen,
             }
           else
             {
-              panel_debug (PANEL_DEBUG_DOMAIN_POSITIONING,
+              panel_debug (PANEL_DEBUG_POSITIONING,
                            "moving panel from screen %d to %d",
                            gdk_screen_get_number (screen),
                            screen_num);
@@ -1889,7 +1889,7 @@ panel_window_screen_layout_changed (GdkScreen   *screen,
 
           if (G_UNLIKELY (monitor_num == -1))
             {
-              panel_debug (PANEL_DEBUG_DOMAIN_POSITIONING,
+              panel_debug (PANEL_DEBUG_POSITIONING,
                            "output/monitor %s not found, hiding window",
                            window->output_name);
 
@@ -1943,13 +1943,13 @@ panel_window_screen_layout_changed (GdkScreen   *screen,
             }
         }
 
-      panel_debug (PANEL_DEBUG_DOMAIN_POSITIONING,
+      panel_debug (PANEL_DEBUG_POSITIONING,
                    "struts edge: %d", window->struts_edge);
     }
 
   /* set the new working area of the panel */
   window->area = a;
-  panel_debug (PANEL_DEBUG_DOMAIN_POSITIONING,
+  panel_debug (PANEL_DEBUG_POSITIONING,
                "working-area: x=%d, y=%d, w=%d, h=%d",
                a.x, a.y, a.width, a.height);
 
diff --git a/plugins/applicationsmenu/applicationsmenu.c b/plugins/applicationsmenu/applicationsmenu.c
index b0108ed..21a8511 100644
--- a/plugins/applicationsmenu/applicationsmenu.c
+++ b/plugins/applicationsmenu/applicationsmenu.c
@@ -211,7 +211,7 @@ applications_menu_plugin_init (ApplicationsMenuPlugin *plugin)
   plugin->show_button_title = TRUE;
   plugin->custom_menu = FALSE;
 
-  panel_debug (PANEL_DEBUG_DOMAIN_APPLICATIONMENU,
+  panel_debug (PANEL_DEBUG_APPLICATIONMENU,
                "XDG_MENU_PREFIX is set to \"%s\"",
                g_getenv ("XDG_MENU_PREFIX"));
 
@@ -816,7 +816,7 @@ applications_menu_plugin_menu_reload (ApplicationsMenuPlugin *plugin)
 
   if (plugin->menu != NULL)
     {
-      panel_debug (PANEL_DEBUG_DOMAIN_APPLICATIONMENU,
+      panel_debug (PANEL_DEBUG_APPLICATIONMENU,
                    "destroy menu for reload");
 
       /* if the menu is opened, do not destroy it under the users'
@@ -1024,7 +1024,7 @@ applications_menu_plugin_menu (GtkWidget              *button,
           filename = g_file_get_parse_name (file);
           g_object_unref (G_OBJECT (file));
 
-          panel_debug (PANEL_DEBUG_DOMAIN_APPLICATIONMENU,
+          panel_debug (PANEL_DEBUG_APPLICATIONMENU,
                        "loading from %s", filename);
           g_free (filename);
         }
diff --git a/plugins/tasklist/tasklist-widget.c b/plugins/tasklist/tasklist-widget.c
index 1de257b..0bce1b6 100644
--- a/plugins/tasklist/tasklist-widget.c
+++ b/plugins/tasklist/tasklist-widget.c
@@ -899,7 +899,7 @@ xfce_tasklist_size_layout (XfceTasklist  *tasklist,
        * overflow menu */
       if (n_buttons > n_buttons_target)
         {
-          panel_debug (PANEL_DEBUG_DOMAIN_TASKLIST,
+          panel_debug (PANEL_DEBUG_TASKLIST,
                        "Putting %d windows in overflow menu",
                        n_buttons - n_buttons_target);
 



More information about the Xfce4-commits mailing list