r23539 - gnucash/trunk/src - Bug 720235 - Python bindings should load environment file just like gnucash does
Geert Janssens
gjanssens at code.gnucash.org
Wed Dec 11 09:45:41 EST 2013
Author: gjanssens
Date: 2013-12-11 09:45:40 -0500 (Wed, 11 Dec 2013)
New Revision: 23539
Trac: http://svn.gnucash.org/trac/changeset/23539
Added:
gnucash/trunk/src/core-utils/gnc-environment.c
gnucash/trunk/src/core-utils/gnc-environment.h
Modified:
gnucash/trunk/src/bin/gnucash-bin.c
gnucash/trunk/src/core-utils/Makefile.am
gnucash/trunk/src/core-utils/core-utils.i
gnucash/trunk/src/optional/python-bindings/gnucash_core.i
Log:
Bug 720235 - Python bindings should load environment file just like gnucash does
Modified: gnucash/trunk/src/bin/gnucash-bin.c
===================================================================
--- gnucash/trunk/src/bin/gnucash-bin.c 2013-12-10 23:38:58 UTC (rev 23538)
+++ gnucash/trunk/src/bin/gnucash-bin.c 2013-12-11 14:45:40 UTC (rev 23539)
@@ -35,6 +35,7 @@
#include "gnc-locale-utils.h"
#include "core-utils/gnc-version.h"
#include "gnc-engine.h"
+#include "gnc-environment.h"
#include "gnc-filepath-utils.h"
#include "gnc-ui-util.h"
#include "gnc-file.h"
@@ -157,184 +158,6 @@
_("To find the last stable version, please refer to http://www.gnucash.org"));
}
-static gchar *environment_expand(gchar *param)
-{
- gchar *search_start;
- gchar *opening_brace;
- gchar *closing_brace;
- gchar *result;
- gchar *tmp;
- gchar *expanded = NULL;
-
- if (!param)
- return NULL;
-
- /* Set an initial return value, so we can always use g_strconcat below) */
- result = g_strdup ("x");
-
- /* Look for matching pairs of { and }. Anything in between should be expanded */
- search_start = param;
- opening_brace = g_strstr_len (search_start, -1, "{");
- closing_brace = g_strstr_len (search_start, -1, "}");
-
- /* Note: the test on valid braces is fairly simple:
- * * if no pair of opening/closing braces is found, no expansion occurs
- * * braces can't be nested, this will give unexpected results
- * * the string should contain no other braces than those used to mark
- * expandable variables, or unexpected results will be returned.
- */
- while ( opening_brace && closing_brace && (closing_brace > opening_brace) )
- {
- /* Found a first matching pair */
- gchar *to_expand;
- const gchar *env_val;
-
- /* If the string had characters before the opening {, copy them first */
- if (opening_brace > search_start)
- {
- gchar *prefix = g_strndup (search_start, opening_brace - search_start);
-
- tmp = g_strconcat (result, prefix, NULL);
- g_free (result);
- result = tmp;
- g_free (prefix);
- }
-
- /* Expand the variable we found and append it to the result */
- to_expand = g_strndup (opening_brace + 1, closing_brace - opening_brace - 1);
- env_val = g_getenv (to_expand);
- tmp = g_strconcat (result, env_val, NULL);
- g_free (result);
- result = tmp;
- g_free (to_expand);
-
- /* Look for matching pairs of { and }. Anything in between should be expanded */
- search_start = closing_brace + 1;
- opening_brace = g_strstr_len (search_start, -1, "{");
- closing_brace = g_strstr_len (search_start, -1, "}");
- }
-
- /* No more braces found, append the remaining characters */
- tmp = g_strconcat (result, search_start, NULL);
- g_free (result);
- result = tmp;
-
- /* Remove the "x" from our result */
- if (g_strcmp0 (result, "x"))
- expanded = g_strdup (result + 1);
- g_free (result);
-
- return expanded;
-}
-
-static void
-environment_override()
-{
- gchar *config_path;
- gchar *env_file;
- GKeyFile *keyfile = g_key_file_new();
- GError *error;
- gchar **env_vars;
- gsize param_count;
- gint i;
- gboolean got_keyfile;
- gchar *env_parm, *bin_parm;
-
- /* Export default parameters to the environment */
- env_parm = gnc_path_get_prefix();
- if (!g_setenv("GNC_HOME", env_parm, FALSE))
- g_warning ("Couldn't set/override environment variable GNC_HOME.");
- bin_parm = g_build_filename(env_parm, "bin", NULL);
- if (!g_setenv("GNC_BIN", bin_parm, FALSE))
- g_warning ("Couldn't set/override environment variable GNC_BIN.");
- g_free (env_parm);
- g_free (bin_parm);
- env_parm = gnc_path_get_pkglibdir();
- if (!g_setenv("GNC_LIB", env_parm, FALSE))
- g_warning ("Couldn't set/override environment variable GNC_LIB.");
- g_free (env_parm);
- env_parm = gnc_path_get_pkgdatadir();
- if (!g_setenv("GNC_DATA", env_parm, FALSE))
- g_warning ("Couldn't set/override environment variable GNC_DATA.");
- g_free (env_parm);
- env_parm = gnc_path_get_pkgsysconfdir();
- if (!g_setenv("GNC_CONF", env_parm, FALSE))
- g_warning ("Couldn't set/override environment variable GNC_CONF.");
- g_free (env_parm);
- env_parm = gnc_path_get_libdir();
- if (!g_setenv("SYS_LIB", env_parm, FALSE))
- g_warning ("Couldn't set/override environment variable SYS_LIB.");
- g_free (env_parm);
-
- config_path = gnc_path_get_pkgsysconfdir();
-#ifdef G_OS_WIN32
- {
- /* unhide files without extension */
- gchar *pathext = g_build_path(";", ".", g_getenv("PATHEXT"),
- (gchar*) NULL);
- g_setenv("PATHEXT", pathext, TRUE);
- g_free(pathext);
- }
-#endif
-
- env_file = g_build_filename (config_path, "environment", NULL);
- got_keyfile = g_key_file_load_from_file (keyfile, env_file, G_KEY_FILE_NONE, &error);
- g_free (config_path);
- g_free (env_file);
- if ( !got_keyfile )
- {
- g_key_file_free(keyfile);
- return;
- }
-
- /* Read the environment overrides and apply them */
- env_vars = g_key_file_get_keys(keyfile, "Variables", ¶m_count, &error);
- for ( i = 0; i < param_count; i++ )
- {
- gchar **val_list;
- gsize val_count;
- gint j;
- gchar *new_val = NULL, *tmp_val;
-
- /* For each variable, read its new value, optionally expand it and set/unset it */
- val_list = g_key_file_get_string_list (keyfile, "Variables",
- env_vars[i], &val_count,
- &error );
- if ( val_count == 0 )
- g_unsetenv (env_vars[i]);
- else
- {
- /* Set an initial return value, so we can always use g_build_path below) */
- tmp_val = g_strdup ("x");
- for ( j = 0; j < val_count; j++ )
- {
- gchar *expanded = environment_expand (val_list[j]);
- if (expanded && strlen(expanded))
- {
- new_val = g_build_path (G_SEARCHPATH_SEPARATOR_S, tmp_val, expanded, NULL);
- g_free (tmp_val);
- g_free(expanded);
- tmp_val = new_val;
- }
- }
- g_strfreev (val_list);
-
- /* Remove the "x" from our result */
- if (g_strcmp0 (tmp_val, "x"))
- new_val = g_strdup (tmp_val + sizeof (G_SEARCHPATH_SEPARATOR_S));
- g_free (tmp_val);
-
- if (!g_setenv (env_vars[i], new_val, TRUE))
- g_warning ("Couldn't properly override environment variable \"%s\". "
- "This may lead to unexpected results", env_vars[i]);
- g_free(new_val);
- }
- }
-
- g_strfreev(env_vars);
- g_key_file_free(keyfile);
-}
-
#ifdef MAC_INTEGRATION
static void
set_mac_locale()
@@ -856,7 +679,7 @@
#ifdef MAC_INTEGRATION
set_mac_locale();
#endif
- environment_override();
+ gnc_environment_setup();
#ifdef HAVE_GETTEXT
{
gchar *localedir = gnc_path_get_localedir();
Modified: gnucash/trunk/src/core-utils/Makefile.am
===================================================================
--- gnucash/trunk/src/core-utils/Makefile.am 2013-12-10 23:38:58 UTC (rev 23538)
+++ gnucash/trunk/src/core-utils/Makefile.am 2013-12-11 14:45:40 UTC (rev 23539)
@@ -5,6 +5,7 @@
libgnc_core_utils_la_SOURCES = \
binreloc.c \
gnc-prefs.c \
+ gnc-environment.c \
gnc-features.c \
gnc-filepath-utils.c \
gnc-gdate-utils.c \
@@ -29,6 +30,7 @@
binreloc.h \
gnc-prefs.h \
gnc-prefs-p.h \
+ gnc-environment.h \
gnc-features.h \
gnc-filepath-utils.h \
gnc-gdate-utils.h \
Modified: gnucash/trunk/src/core-utils/core-utils.i
===================================================================
--- gnucash/trunk/src/core-utils/core-utils.i 2013-12-10 23:38:58 UTC (rev 23538)
+++ gnucash/trunk/src/core-utils/core-utils.i 2013-12-11 14:45:40 UTC (rev 23539)
@@ -1,6 +1,7 @@
%module sw_core_utils
%{
#include <config.h>
+#include <gnc-environment.h>
#include <gnc-glib-utils.h>
#include <gnc-prefs.h>
#include <gnc-path.h>
@@ -27,6 +28,7 @@
#endif
%import "base-typemaps.i"
+%include <gnc-environment.h>
%include <gnc-prefs.h>
%inline %{
const gchar *gnc_version(void)
Added: gnucash/trunk/src/core-utils/gnc-environment.c
===================================================================
--- gnucash/trunk/src/core-utils/gnc-environment.c (rev 0)
+++ gnucash/trunk/src/core-utils/gnc-environment.c 2013-12-11 14:45:40 UTC (rev 23539)
@@ -0,0 +1,205 @@
+/*
+ * gnc-environment.c:
+ *
+ * Copyright (C) 2013 Geert Janssens <geert at kobaltwit.be>
+ *
+ * This program 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 Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, contact:
+ *
+ * Free Software Foundation Voice: +1-617-542-5942
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
+ * Boston, MA 02110-1301, USA gnu at gnu.org
+ */
+
+#include <glib.h>
+#include <string.h>
+#include "gnc-environment.h"
+#include "gnc-path.h"
+
+static gchar *environment_expand(gchar *param)
+{
+ gchar *search_start;
+ gchar *opening_brace;
+ gchar *closing_brace;
+ gchar *result;
+ gchar *tmp;
+ gchar *expanded = NULL;
+
+ if (!param)
+ return NULL;
+
+ /* Set an initial return value, so we can always use g_strconcat below) */
+ result = g_strdup ("x");
+
+ /* Look for matching pairs of { and }. Anything in between should be expanded */
+ search_start = param;
+ opening_brace = g_strstr_len (search_start, -1, "{");
+ closing_brace = g_strstr_len (search_start, -1, "}");
+
+ /* Note: the test on valid braces is fairly simple:
+ * * if no pair of opening/closing braces is found, no expansion occurs
+ * * braces can't be nested, this will give unexpected results
+ * * the string should contain no other braces than those used to mark
+ * expandable variables, or unexpected results will be returned.
+ */
+ while ( opening_brace && closing_brace && (closing_brace > opening_brace) )
+ {
+ /* Found a first matching pair */
+ gchar *to_expand;
+ const gchar *env_val;
+
+ /* If the string had characters before the opening {, copy them first */
+ if (opening_brace > search_start)
+ {
+ gchar *prefix = g_strndup (search_start, opening_brace - search_start);
+
+ tmp = g_strconcat (result, prefix, NULL);
+ g_free (result);
+ result = tmp;
+ g_free (prefix);
+ }
+
+ /* Expand the variable we found and append it to the result */
+ to_expand = g_strndup (opening_brace + 1, closing_brace - opening_brace - 1);
+ env_val = g_getenv (to_expand);
+ tmp = g_strconcat (result, env_val, NULL);
+ g_free (result);
+ result = tmp;
+ g_free (to_expand);
+
+ /* Look for matching pairs of { and }. Anything in between should be expanded */
+ search_start = closing_brace + 1;
+ opening_brace = g_strstr_len (search_start, -1, "{");
+ closing_brace = g_strstr_len (search_start, -1, "}");
+ }
+
+ /* No more braces found, append the remaining characters */
+ tmp = g_strconcat (result, search_start, NULL);
+ g_free (result);
+ result = tmp;
+
+ /* Remove the "x" from our result */
+ if (g_strcmp0 (result, "x"))
+ expanded = g_strdup (result + 1);
+ g_free (result);
+
+ return expanded;
+}
+
+void
+gnc_environment_setup (void)
+{
+ gchar *config_path;
+ gchar *env_file;
+ GKeyFile *keyfile = g_key_file_new();
+ GError *error;
+ gchar **env_vars;
+ gsize param_count;
+ gint i;
+ gboolean got_keyfile;
+ gchar *env_parm, *bin_parm;
+
+ /* Export default parameters to the environment */
+ env_parm = gnc_path_get_prefix();
+ if (!g_setenv("GNC_HOME", env_parm, FALSE))
+ g_warning ("Couldn't set/override environment variable GNC_HOME.");
+ bin_parm = g_build_filename(env_parm, "bin", NULL);
+ if (!g_setenv("GNC_BIN", bin_parm, FALSE))
+ g_warning ("Couldn't set/override environment variable GNC_BIN.");
+ g_free (env_parm);
+ g_free (bin_parm);
+ env_parm = gnc_path_get_pkglibdir();
+ if (!g_setenv("GNC_LIB", env_parm, FALSE))
+ g_warning ("Couldn't set/override environment variable GNC_LIB.");
+ g_free (env_parm);
+ env_parm = gnc_path_get_pkgdatadir();
+ if (!g_setenv("GNC_DATA", env_parm, FALSE))
+ g_warning ("Couldn't set/override environment variable GNC_DATA.");
+ g_free (env_parm);
+ env_parm = gnc_path_get_pkgsysconfdir();
+ if (!g_setenv("GNC_CONF", env_parm, FALSE))
+ g_warning ("Couldn't set/override environment variable GNC_CONF.");
+ g_free (env_parm);
+ env_parm = gnc_path_get_libdir();
+ if (!g_setenv("SYS_LIB", env_parm, FALSE))
+ g_warning ("Couldn't set/override environment variable SYS_LIB.");
+ g_free (env_parm);
+
+ config_path = gnc_path_get_pkgsysconfdir();
+#ifdef G_OS_WIN32
+ {
+ /* unhide files without extension */
+ gchar *pathext = g_build_path(";", ".", g_getenv("PATHEXT"),
+ (gchar*) NULL);
+ g_setenv("PATHEXT", pathext, TRUE);
+ g_free(pathext);
+ }
+#endif
+
+ env_file = g_build_filename (config_path, "environment", NULL);
+ got_keyfile = g_key_file_load_from_file (keyfile, env_file, G_KEY_FILE_NONE, &error);
+ g_free (config_path);
+ g_free (env_file);
+ if ( !got_keyfile )
+ {
+ g_key_file_free(keyfile);
+ return;
+ }
+
+ /* Read the environment overrides and apply them */
+ env_vars = g_key_file_get_keys(keyfile, "Variables", ¶m_count, &error);
+ for ( i = 0; i < param_count; i++ )
+ {
+ gchar **val_list;
+ gsize val_count;
+ gint j;
+ gchar *new_val = NULL, *tmp_val;
+
+ /* For each variable, read its new value, optionally expand it and set/unset it */
+ val_list = g_key_file_get_string_list (keyfile, "Variables",
+ env_vars[i], &val_count,
+ &error );
+ if ( val_count == 0 )
+ g_unsetenv (env_vars[i]);
+ else
+ {
+ /* Set an initial return value, so we can always use g_build_path below) */
+ tmp_val = g_strdup ("x");
+ for ( j = 0; j < val_count; j++ )
+ {
+ gchar *expanded = environment_expand (val_list[j]);
+ if (expanded && strlen(expanded))
+ {
+ new_val = g_build_path (G_SEARCHPATH_SEPARATOR_S, tmp_val, expanded, NULL);
+ g_free (tmp_val);
+ g_free(expanded);
+ tmp_val = new_val;
+ }
+ }
+ g_strfreev (val_list);
+
+ /* Remove the "x" from our result */
+ if (g_strcmp0 (tmp_val, "x"))
+ new_val = g_strdup (tmp_val + sizeof (G_SEARCHPATH_SEPARATOR_S));
+ g_free (tmp_val);
+
+ if (!g_setenv (env_vars[i], new_val, TRUE))
+ g_warning ("Couldn't properly override environment variable \"%s\". "
+ "This may lead to unexpected results", env_vars[i]);
+ g_free(new_val);
+ }
+ }
+
+ g_strfreev(env_vars);
+ g_key_file_free(keyfile);
+}
Added: gnucash/trunk/src/core-utils/gnc-environment.h
===================================================================
--- gnucash/trunk/src/core-utils/gnc-environment.h (rev 0)
+++ gnucash/trunk/src/core-utils/gnc-environment.h 2013-12-11 14:45:40 UTC (rev 23539)
@@ -0,0 +1,58 @@
+/********************************************************************\
+ * gnc-environment.h -- code to set up the environment for proper *
+ * gnucash functioning *
+ * *
+ * Copyright (C) 2013 Geert Janssens <geert at kobaltwit.be> *
+ * *
+ * This program 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 Software Foundation; either version 2 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact: *
+ * *
+ * Free Software Foundation Voice: +1-617-542-5942 *
+ * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
+ * Boston, MA 02110-1301, USA gnu at gnu.org *
+ * *
+ ********************************************************************/
+
+/** @addtogroup Engine
+ @{ */
+/** @addtogroup Environment Environment
+
+ The API in this file is used to read the environment configuration
+ file and set up a number of environment variables based on the values
+ found in it. These parameters can be used to configure certain aspects
+ of gnucash or components it depends on.
+
+ For example if not installed in the standard prefix "/usr", environment
+ variable XDG_DATA_DIRS should be set such that glib can find the
+ gsettings schemas installed by GnuCash and yelp can find the help file
+ and guide (if these are installed).
+
+ @{ */
+/** @file gnc-environment.h
+ * @brief code to set up the environment for proper gnucash functioning.
+ * @author Copyright (C) 2013 Geert Janssens <geert at kobaltwit.be>
+ */
+
+#ifndef GNC_ENVIRONMENT_H
+#define GNC_ENVIRONMENT_H
+
+/** Parse <prefix>/etc/gnucash/environment and set environment variables
+ * based on the contents of that file. Read the comments in
+ * <prefix>/etc/gnucash/environment for more details.
+ */
+void gnc_environment_setup (void);
+
+#endif /* GNC_ENVIRONMENT_H */
+
+/** @} */
+/** @} */
Modified: gnucash/trunk/src/optional/python-bindings/gnucash_core.i
===================================================================
--- gnucash/trunk/src/optional/python-bindings/gnucash_core.i 2013-12-10 23:38:58 UTC (rev 23538)
+++ gnucash/trunk/src/optional/python-bindings/gnucash_core.i 2013-12-11 14:45:40 UTC (rev 23539)
@@ -206,6 +206,7 @@
%include <gnc-pricedb.h>
%init %{
+gnc_environment_setup();
qof_log_init();
qof_init();
qof_query_init();
More information about the gnucash-changes
mailing list