Fix build failures if userdata_home exists but gnc_userdata_home doesn't

userdata_home is a different directory on each platform we support (default /home/janssege/.local/share on linux for example)
and gnc_userdata_home is normally userdata_home/GnuCash.
These directories may not always exist (yet) in all circumstances, so properly handle
all of these possible situations.
This commit is contained in:
Geert Janssens 2017-09-26 12:37:33 +02:00
parent 4d59be7f46
commit d266ee346c
2 changed files with 98 additions and 10 deletions

View File

@ -504,6 +504,7 @@ get_userdata_home(bool create)
gboolean
gnc_filepath_init(gboolean create)
{
userdata_is_home = userdata_is_tmp = false;
auto gnc_userdata_home_exists = false;
auto gnc_userdata_home_from_env = false;
auto gnc_userdata_home_env = g_getenv("GNC_DATA_HOME");
@ -559,7 +560,15 @@ gnc_filepath_init(gboolean create)
* skip migrating to that location in the next step but that's
* a good thing.
*/
gnc_validate_directory(gnc_userdata_home, (create || userdata_is_tmp));
try
{
gnc_validate_directory(gnc_userdata_home, (create || userdata_is_tmp));
}
catch (const bfs::filesystem_error& ex)
{
g_warning("User data directory doesn't exist, yet the calling code requested not to create it. Proceed with caution.\n"
"(Error: %s)", ex.what());
}
}
auto migrated = FALSE;
@ -567,11 +576,18 @@ gnc_filepath_init(gboolean create)
migrated = copy_recursive(bfs::path (g_get_home_dir()) / ".gnucash",
gnc_userdata_home);
/* Since we're in code that is only executed once....
* Note these calls may throw and end the program! */
gnc_validate_directory(gnc_userdata_home / "books", (create || userdata_is_tmp));
gnc_validate_directory(gnc_userdata_home / "checks", (create || userdata_is_tmp));
gnc_validate_directory(gnc_userdata_home / "translog", (create || userdata_is_tmp));
/* Try to create the standard subdirectories for gnucash' user data */
try
{
gnc_validate_directory(gnc_userdata_home / "books", (create || userdata_is_tmp));
gnc_validate_directory(gnc_userdata_home / "checks", (create || userdata_is_tmp));
gnc_validate_directory(gnc_userdata_home / "translog", (create || userdata_is_tmp));
}
catch (const bfs::filesystem_error& ex)
{
g_warning("Default user data subdirectories don't exist, yet the calling code requested not to create them. Proceed with caution.\n"
"(Error: %s)", ex.what());
}
return migrated;
}

View File

@ -26,6 +26,7 @@
#include <string.h>
#include <glib.h>
#include <glib/gstdio.h>
#include "test-stuff.h"
#include "gnc-filepath-utils.h"
#ifdef MAC_INTEGRATION
@ -149,9 +150,65 @@ main(int argc, char **argv)
g_free(wantout);
g_free(daout);
}
g_free(home_dir);
g_free(tmp_dir);
/* Second run, after properly having called gnc_filepath_init */
/* Second run, with existing userdata_dir, but without the GnuCash subdir
This test can not be run on OS X or Windows, as our code is not using
XDG_DATA_HOME on these platforms */
#ifndef MAC_INTEGRATION
#ifndef G_OS_WIN32
userdata_dir = g_build_filename(home_dir, ".local", "share", (gchar *)NULL);
g_mkdir_with_parents(userdata_dir, 0750);
g_setenv("XDG_DATA_HOME", userdata_dir, TRUE);
gnc_filepath_init(FALSE);
for (i = 0; strs2[i].funcname != NULL; i++)
{
char *daout;
char *wantout;
if (strs2[i].func_num == 0)
{
wantout = g_build_filename(userdata_dir, PACKAGE_NAME, "foo",
(gchar *)NULL);
daout = gnc_build_userdata_path("foo");
}
else if (strs2[i].func_num == 1)
{
wantout = g_build_filename(userdata_dir, PACKAGE_NAME, strs2[i].output, "foo",
(gchar *)NULL);
daout = gnc_build_book_path("foo");
}
else if (strs2[i].func_num == 2)
{
wantout = g_build_filename(userdata_dir, PACKAGE_NAME, strs2[i].output, "foo",
(gchar *)NULL);
daout = gnc_build_translog_path("foo");
}
else // if (strs2[i].prefix_home == 3)
{
wantout = g_build_filename(userdata_dir, PACKAGE_NAME, strs2[i].output, "foo",
(gchar *)NULL);
daout = gnc_build_data_path("foo");
}
do_test_args(g_strcmp0(daout, wantout) == 0,
"gnc_build_x_path",
__FILE__, __LINE__,
"%s (%s) vs %s", daout, strs2[i].funcname, wantout);
g_free(wantout);
g_free(daout);
}
/* Remove intermediate directories again in order to test their automatic
* creation in the next test run */
g_rmdir(userdata_dir);
g_free(userdata_dir);
userdata_dir = g_build_filename(home_dir, ".local", (gchar *)NULL);
g_rmdir(userdata_dir);
g_free(userdata_dir);
#endif
#endif
/* Third run, with GNC_DATA_HOME not set and having run gnc_filepath_init */
g_unsetenv("GNC_DATA_HOME");
gnc_filepath_init(TRUE);
userdata_dir = test_get_userdatadir();
for (i = 0; strs2[i].funcname != NULL; i++)
@ -193,7 +250,7 @@ main(int argc, char **argv)
}
g_free(userdata_dir);
/* Third run, after setting GNC_DATA_HOME gnc_filepath_init */
/* Fourth run, with GNC_DATA_HOME set and having run gnc_filepath_init */
gnc_data_home_dir = g_build_filename(home_dir, "Test", NULL);
g_setenv("GNC_DATA_HOME", gnc_data_home_dir, TRUE);
gnc_filepath_init(TRUE);
@ -235,6 +292,21 @@ main(int argc, char **argv)
g_free(daout);
}
/* Clean up the temporaries that were created for the GNC_DATA_HOME test run */
g_free (home_dir);
g_free (tmp_dir);
tmp_dir = g_build_filename(gnc_data_home_dir, "data", (gchar *)NULL);
g_rmdir (tmp_dir);
g_free (tmp_dir);
tmp_dir = g_build_filename(gnc_data_home_dir, "translog", (gchar *)NULL);
g_rmdir (tmp_dir);
g_free (tmp_dir);
tmp_dir = g_build_filename(gnc_data_home_dir, "books", (gchar *)NULL);
g_rmdir (tmp_dir);
g_free (tmp_dir);
g_rmdir (gnc_data_home_dir);
g_free(gnc_data_home_dir);
print_test_results();
return get_rv();
}