summaryrefslogtreecommitdiff
path: root/metastore.c
diff options
context:
space:
mode:
authorPrzemyslaw Pawelczyk <przemoc@gmail.com>2015-09-02 02:12:09 +0200
committerPrzemyslaw Pawelczyk <przemoc@gmail.com>2015-09-02 02:12:09 +0200
commit90fe96d4f4952f8c4d32290c1cafa517526bdcf3 (patch)
tree7aedb0145f49dc4b9e25a04d37b2e0b7693435a5 /metastore.c
parent8260dd2dc45eecba25ee44831f1dd02acc1043f9 (diff)
metastore.c: Improve removing empty dirs not present in metadata.
Store extradirs list ordered by pathlen descendingly, so one traversal should be enough to remove empty dirs.
Diffstat (limited to 'metastore.c')
-rw-r--r--metastore.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/metastore.c b/metastore.c
index e607af4..82aabc5 100644
--- a/metastore.c
+++ b/metastore.c
@@ -67,6 +67,23 @@ insert_entry_plist(struct metaentry **list, struct metaentry *entry)
}
/*
+ * Inserts an entry in a linked list ordered by pathlen descendingly
+ */
+static void
+insert_entry_pdlist(struct metaentry **list, struct metaentry *entry)
+{
+ struct metaentry **parent;
+
+ for (parent = list; *parent; parent = &((*parent)->list)) {
+ if ((*parent)->pathlen < entry->pathlen)
+ break;
+ }
+
+ entry->list = *parent;
+ *parent = entry;
+}
+
+/*
* Prints differences between real and stored actual metadata
* - for use in mentries_compare
*/
@@ -136,7 +153,7 @@ compare_fix(struct metaentry *real, struct metaentry *stored, int cmp)
if (!stored) {
if (S_ISDIR(real->mode))
- insert_entry_plist(&extradirs, real);
+ insert_entry_pdlist(&extradirs, real);
msg(MSG_NORMAL, "%s:\tadded\n", real->path);
return;
}