[gnumeric] Runtime: improve running-in-tree detection.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Runtime: improve running-in-tree detection.
- Date: Wed, 30 May 2018 13:53:41 +0000 (UTC)
commit a801e405b1e8d1ea4e9d94737ec9144728961ece
Author: Morten Welinder <terra gnome org>
Date: Wed May 30 09:51:16 2018 -0400
Runtime: improve running-in-tree detection.
This should handle running introspection in-tree too. g_get_prgname
is not reliable for that, so pass in a separate environment variable.
introspection/gi/overrides/Gnm.py | 28 +++++++++++++++++
src/gutils.c | 58 +++++++++++++++++++----------------
test/GnumericTest.pm | 16 ++++++++++
test/t3004-introspection-overrides.py | 20 +-----------
4 files changed, 76 insertions(+), 46 deletions(-)
---
diff --git a/introspection/gi/overrides/Gnm.py b/introspection/gi/overrides/Gnm.py
index f6c02645b..f680e492a 100644
--- a/introspection/gi/overrides/Gnm.py
+++ b/introspection/gi/overrides/Gnm.py
@@ -1,5 +1,6 @@
from ..overrides import override
from ..module import get_introspection_module
+import os.path
Gnm = get_introspection_module('Gnm')
@@ -7,6 +8,33 @@ __all__ = []
# ----------------------------------------------------------------------------
+def atomize_path(p):
+ res=[]
+ while 1:
+ h,t = os.path.split(p)
+ if t != "":
+ res.append(t)
+ if h == "":
+ break
+ if h == p:
+ res.append(h)
+ break
+ p = h
+ res.reverse()
+ return res
+
+l=atomize_path(os.path.dirname(__file__))
+Gnm.in_tree = (len(l) > 3 and l[-3] == "introspection")
+__all__.append('in_tree')
+
+if Gnm.in_tree:
+ # Somehow path gets dropped form g_get_prgname, so make up for that
+ from gi.repository import GLib
+ import sys
+ GLib.set_prgname(sys.argv[0])
+
+# ----------------------------------------------------------------------------
+
class Range(Gnm.Range):
def __new__(cls,start_col=0,start_row=0,end_col=None,end_row=None):
if end_col is None: end_col = start_col
diff --git a/src/gutils.c b/src/gutils.c
index 6f12d1f8c..0560687ff 100644
--- a/src/gutils.c
+++ b/src/gutils.c
@@ -43,33 +43,41 @@ static char *gnumeric_usr_dir_unversioned;
static char *gnumeric_extern_plugin_dir;
static GSList *gutils_xml_in_docs;
-static gboolean
+static char *
running_in_tree (void)
{
const char *argv0 = g_get_prgname ();
if (!argv0)
- return FALSE;
-
- /* Sometimes we see, e.g., "lt-gnumeric" as basename. */
- {
- char *base = g_path_get_basename (argv0);
- gboolean has_lt_prefix = (strncmp (base, "lt-", 3) == 0);
- g_free (base);
- if (has_lt_prefix)
- return TRUE;
- }
+ return NULL;
/* Look for ".libs" as final path element. */
{
const char *dotlibs = strstr (argv0, ".libs/");
if (dotlibs &&
(dotlibs == argv0 || G_IS_DIR_SEPARATOR (dotlibs[-1])) &&
- strchr (dotlibs + 6, G_DIR_SEPARATOR) == NULL)
- return TRUE;
+ strchr (dotlibs + 6, G_DIR_SEPARATOR) == NULL) {
+ size_t l = dotlibs - argv0;
+ char *res = g_strndup (argv0, l);
+
+ while (l > 0 && G_IS_DIR_SEPARATOR (res[l - 1]))
+ res[--l] = 0;
+ while (l > 0 && !G_IS_DIR_SEPARATOR (res[l - 1]))
+ res[--l] = 0;
+ while (l > 0 && G_IS_DIR_SEPARATOR (res[l - 1]))
+ res[--l] = 0;
+
+ return res;
+ }
}
- return FALSE;
+ {
+ const char *builddir = g_getenv ("GNM_TEST_TOP_BUILDDIR");
+ if (builddir)
+ return g_strdup (builddir);
+ }
+
+ return NULL;
}
static gboolean gutils_inited = FALSE;
@@ -78,6 +86,7 @@ void
gutils_init (void)
{
char const *home_dir;
+ char *top_builddir;
// This function will end up being called twice in normal operation:
// once from gnm_pre_parse_init and once from gnm_init. Introspection
@@ -99,19 +108,14 @@ gutils_init (void)
NULL);
g_free (dir);
#else
- if (running_in_tree ()) {
- const char *argv0 = g_get_prgname ();
- char *dotlibs = g_path_get_dirname (argv0);
- char *top = g_build_filename (dotlibs, "..", "../", NULL);
- char *plugins = g_build_filename (top, PLUGIN_SUBDIR, NULL);
- if (g_file_test (plugins, G_FILE_TEST_IS_DIR))
- gnumeric_lib_dir =
- go_filename_simplify (top, GO_DOTDOT_SYNTACTIC,
- FALSE);
- g_free (top);
- g_free (plugins);
- g_free (dotlibs);
- if (0) g_printerr ("Running in-tree\n");
+ top_builddir = running_in_tree ();
+ if (top_builddir) {
+ gnumeric_lib_dir =
+ go_filename_simplify (top_builddir, GO_DOTDOT_SYNTACTIC,
+ FALSE);
+ if (gnm_debug_flag ("in-tree"))
+ g_printerr ("Running in-tree [%s]\n", top_builddir);
+ g_free (top_builddir);
}
if (!gnumeric_lib_dir)
diff --git a/test/GnumericTest.pm b/test/GnumericTest.pm
index 8d152776b..0de6467c4 100644
--- a/test/GnumericTest.pm
+++ b/test/GnumericTest.pm
@@ -14,6 +14,7 @@ $| = 1;
test_ssindex sstest test_command message subtest
test_tool
setup_python_environment
+ make_absolute
$ssconvert $sstest $ssdiff $ssgrep $gnumeric
$topsrc $top_builddir
$subtests $samples corpus $PERL $PYTHON);
@@ -897,6 +898,18 @@ sub has_linear_solver {
# -----------------------------------------------------------------------------
+sub make_absolute {
+ my ($fn) = @_;
+
+ return $fn if $fn =~ m{^/};
+ $fn =~ s{^\./+([^/])}{$1};
+ my $pwd = $ENV{'PWD'};
+ $pwd .= '/' unless $pwd =~ m{/$};
+ return "$pwd$fn";
+}
+
+# -----------------------------------------------------------------------------
+
sub setup_python_environment {
$PYTHON = `grep '^#define PYTHON_INTERPRETER ' $top_builddir/gnumeric-config.h 2>&1`;
chomp $PYTHON;
@@ -917,6 +930,9 @@ sub setup_python_environment {
# Don't litter
$ENV{'PYTHONDONTWRITEBYTECODE'} = 1;
+
+ $0 = &make_absolute ($0);
+ $ENV{'GNM_TEST_TOP_BUILDDIR'} = $top_builddir;
}
# -----------------------------------------------------------------------------
diff --git a/test/t3004-introspection-overrides.py b/test/t3004-introspection-overrides.py
index bc43496e9..a8000812a 100755
--- a/test/t3004-introspection-overrides.py
+++ b/test/t3004-introspection-overrides.py
@@ -7,25 +7,7 @@ from gi.repository import Gnm
from gi.repository import GOffice as Go
Gnm.init()
-import os.path
-
-def atomize_path(p):
- res=[]
- while 1:
- h,t = os.path.split(p)
- if t != "":
- res.append(t)
- if h == "":
- break
- if h == p:
- res.append(h)
- break
- p = h
- res.reverse()
- return res
-
-l=atomize_path(os.path.dirname(gi.overrides.Gnm.__file__))
-if len(l) > 3 and l[-3] == "introspection":
+if Gnm.in_tree:
print("Using in-tree gi.overrides.Gnm")
else:
print("Using installed gi.overrides.Gnm at {}"
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]