summaryrefslogtreecommitdiff
path: root/backends/markup-tree.c
diff options
context:
space:
mode:
authorMark McLoughlin <mark@skynet.ie>2004-07-02 19:42:43 +0000
committerMark McLoughlin <markmc@src.gnome.org>2004-07-02 19:42:43 +0000
commit8f0b53000ea14ff38941cd0833e1c90c34a396b9 (patch)
treeebaf31c09e79f7e1464a75d2b49089fe40826337 /backends/markup-tree.c
parent53698f1bc44dc75bf40764a389644fe6be3ef281 (diff)
downloadgconf-8f0b53000ea14ff38941cd0833e1c90c34a396b9.tar.gz
Fixup some bugs with the merge files support which was causing unset
2004-07-02 Mark McLoughlin <mark@skynet.ie> Fixup some bugs with the merge files support which was causing unset entries not to be completely wiped out. * backends/markup-tree.c: (clean_old_local_schemas): rename. (clean_old_local_schemas_recurse): if we're saving as a subtree, recurse down the tree. (delete_useless_subdirs): ignore the some_subdir_needs_sync and entries_need_save flags on the subdir - they're irrelevant if there's no entries or subdirs. Also, check whether the subdir is in a subtree file rather than current dir. (delete_useless_subdirs_recurse): correctly recurse over subdirs. (delete_useless_entries_recurse): implement recursively deleting entries too. (recursively_load_subtree): set the not_in_filesytem flag if we're going to be saving as a subtree. (markup_dir_sync): recusively clean schemas and delete entries if we're saving as a subtree.
Diffstat (limited to 'backends/markup-tree.c')
-rw-r--r--backends/markup-tree.c101
1 files changed, 74 insertions, 27 deletions
diff --git a/backends/markup-tree.c b/backends/markup-tree.c
index c97f19ce..a34e068b 100644
--- a/backends/markup-tree.c
+++ b/backends/markup-tree.c
@@ -732,11 +732,10 @@ markup_dir_set_entries_need_save (MarkupDir *dir)
}
}
+/* Get rid of any local_schema that no longer apply */
static void
-markup_entry_clean_old_local_schemas (MarkupEntry *entry)
+clean_old_local_schemas (MarkupEntry *entry)
{
-
- /* Get rid of any local_schema that no longer apply */
GSList *tmp;
GSList *kept_schemas;
@@ -779,6 +778,36 @@ markup_entry_clean_old_local_schemas (MarkupEntry *entry)
entry->local_schemas = g_slist_reverse (kept_schemas);
}
+static void
+clean_old_local_schemas_recurse (MarkupDir *dir,
+ gboolean recurse)
+{
+ GSList *tmp;
+
+ if (recurse)
+ {
+ tmp = dir->subdirs;
+ while (tmp)
+ {
+ MarkupDir *subdir = tmp->data;
+
+ clean_old_local_schemas_recurse (subdir, TRUE);
+
+ tmp = tmp->next;
+ }
+ }
+
+ tmp = dir->entries;
+ while (tmp != NULL)
+ {
+ MarkupEntry *entry = tmp->data;
+
+ clean_old_local_schemas (entry);
+
+ tmp = tmp->next;
+ }
+}
+
static gboolean
create_filesystem_dir (const char *name,
guint dir_mode)
@@ -813,21 +842,16 @@ delete_useless_subdirs (MarkupDir *dir)
{
MarkupDir *subdir = tmp->data;
- if (subdir->entries_loaded &&
- subdir->subdirs_loaded &&
- !subdir->some_subdir_needs_sync &&
- !subdir->entries_need_save &&
- subdir->entries == NULL &&
- subdir->subdirs == NULL)
+ if (subdir->entries_loaded && subdir->entries == NULL &&
+ subdir->subdirs_loaded && subdir->subdirs == NULL)
{
-
- if (!dir->not_in_filesystem)
+ if (!subdir->not_in_filesystem)
{
char *fs_dirname;
char *fs_filename;
fs_dirname = markup_dir_build_dir_path (subdir, TRUE);
- fs_filename = markup_dir_build_file_path (subdir, dir->save_as_subtree);
+ fs_filename = markup_dir_build_file_path (subdir, subdir->save_as_subtree);
if (unlink (fs_filename) < 0)
{
@@ -876,7 +900,7 @@ delete_useless_subdirs_recurse (MarkupDir *dir)
{
MarkupDir *subdir = tmp->data;
- if (delete_useless_subdirs (subdir))
+ if (delete_useless_subdirs_recurse (subdir))
retval = TRUE;
tmp = tmp->next;
@@ -927,6 +951,29 @@ delete_useless_entries (MarkupDir *dir)
return some_deleted;
}
+static gboolean
+delete_useless_entries_recurse (MarkupDir *dir)
+{
+ GSList *tmp;
+ gboolean retval = FALSE;
+
+ tmp = dir->subdirs;
+ while (tmp)
+ {
+ MarkupDir *subdir = tmp->data;
+
+ if (delete_useless_entries_recurse (subdir))
+ retval = TRUE;
+
+ tmp = tmp->next;
+ }
+
+ if (delete_useless_entries (dir))
+ retval = TRUE;
+
+ return retval;
+}
+
static void
recursively_load_subtree (MarkupDir *dir)
{
@@ -941,6 +988,7 @@ recursively_load_subtree (MarkupDir *dir)
MarkupDir *subdir = tmp->data;
recursively_load_subtree (subdir);
+ subdir->not_in_filesystem = TRUE;
tmp = tmp->next;
}
@@ -1007,7 +1055,6 @@ markup_dir_sync (MarkupDir *dir)
char *fs_dirname;
char *fs_filename;
char *fs_subtree;
- GSList *tmp;
gboolean some_useless_entries;
gboolean some_useless_subdirs;
@@ -1022,22 +1069,14 @@ markup_dir_sync (MarkupDir *dir)
if (dir->not_in_filesystem)
return TRUE;
- /* Sanitize the entries */
- tmp = dir->entries;
- while (tmp != NULL)
- {
- MarkupEntry *entry = tmp->data;
-
- markup_entry_clean_old_local_schemas (entry);
-
- tmp = tmp->next;
- }
-
if (!dir->save_as_subtree && should_save_as_subtree (dir))
{
dir->save_as_subtree = TRUE;
recursively_load_subtree (dir);
}
+
+ /* Sanitize the entries */
+ clean_old_local_schemas_recurse (dir, dir->save_as_subtree);
fs_dirname = markup_dir_build_dir_path (dir, TRUE);
fs_filename = markup_dir_build_file_path (dir, FALSE);
@@ -1056,8 +1095,16 @@ markup_dir_sync (MarkupDir *dir)
g_return_val_if_fail (dir->entries_loaded, FALSE);
- if (delete_useless_entries (dir))
- some_useless_entries = TRUE;
+ if (!dir->save_as_subtree)
+ {
+ if (delete_useless_entries (dir))
+ some_useless_entries = TRUE;
+ }
+ else
+ {
+ if (delete_useless_entries_recurse (dir))
+ some_useless_entries = TRUE;
+ }
/* Be sure the directory exists */
if (!dir->filesystem_dir_probably_exists)