summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark McLoughlin <mark@skynet.ie>2004-07-02 19:55:23 +0000
committerMark McLoughlin <markmc@src.gnome.org>2004-07-02 19:55:23 +0000
commitedd722576677d73c9fde40afa5c3b8716f57631d (patch)
tree776b24e44ffc095d78505af1725796be5c6aa1c4
parent37a7b62cbaedf40558a7586ea8669be536ac199f (diff)
downloadgconf-edd722576677d73c9fde40afa5c3b8716f57631d.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. (markup_dir_sync): recusively clean schemas and delete entries if we're saving as a subtree.
-rw-r--r--ChangeLog19
-rw-r--r--backends/markup-tree.c96
2 files changed, 90 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index e4a43562..9c589fb1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,24 @@
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.
+ (markup_dir_sync): recusively clean schemas and delete entries
+ if we're saving as a subtree.
+
+2004-07-02 Mark McLoughlin <mark@skynet.ie>
+
* configure.in: post release bump to 2.6.4.
==================== 2.6.3 ====================
diff --git a/backends/markup-tree.c b/backends/markup-tree.c
index 4e2088ca..942487c3 100644
--- a/backends/markup-tree.c
+++ b/backends/markup-tree.c
@@ -696,11 +696,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;
@@ -743,6 +742,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)
@@ -777,21 +806,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_path (subdir, FALSE, FALSE);
- fs_filename = markup_dir_build_path (subdir, TRUE, dir->save_as_subtree);
+ fs_filename = markup_dir_build_path (subdir, TRUE, subdir->save_as_subtree);
if (unlink (fs_filename) < 0)
{
@@ -840,7 +864,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;
@@ -892,12 +916,34 @@ delete_useless_entries (MarkupDir *dir)
}
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 gboolean
markup_dir_sync (MarkupDir *dir)
{
char *fs_dirname;
char *fs_filename;
char *fs_subtree;
- GSList *tmp;
gboolean some_useless_entries;
gboolean some_useless_subdirs;
@@ -913,15 +959,7 @@ markup_dir_sync (MarkupDir *dir)
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;
- }
+ clean_old_local_schemas_recurse (dir, dir->save_as_subtree);
fs_dirname = markup_dir_build_path (dir, FALSE, FALSE);
fs_filename = markup_dir_build_path (dir, TRUE, FALSE);
@@ -940,8 +978,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)