* [PATCH 0/3] delete directory documents on directory removal
@ 2015-09-25 20:48 Jani Nikula
2015-09-25 20:48 ` [PATCH 1/3] test: flag one more notmuch new test as broken Jani Nikula
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Jani Nikula @ 2015-09-25 20:48 UTC (permalink / raw)
To: notmuch
Hi all, this is a bit RFC-ish series for fixing some issues on directory
renames and removals. The commit messages could use some polish, but I
think I added enough to make it reasonable to follow. I'm not sure if
the directory document removal API does enough or not, or whether it's a
good API. This series just proves we need to do this.
BR,
Jani.
Jani Nikula (3):
test: flag one more notmuch new test as broken
lib: add interface to delete directory documents
cli: delete directory documents on directory removal
lib/directory.cc | 18 ++++++++++++++++++
lib/notmuch.h | 7 +++++++
notmuch-new.c | 12 +++---------
test/T050-new.sh | 2 +-
4 files changed, 29 insertions(+), 10 deletions(-)
--
2.1.4
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/3] test: flag one more notmuch new test as broken
2015-09-25 20:48 [PATCH 0/3] delete directory documents on directory removal Jani Nikula
@ 2015-09-25 20:48 ` Jani Nikula
2015-09-25 20:48 ` [PATCH 2/3] lib: add interface to delete directory documents Jani Nikula
2015-09-25 20:48 ` [PATCH 3/3] cli: delete directory documents on directory removal Jani Nikula
2 siblings, 0 replies; 11+ messages in thread
From: Jani Nikula @ 2015-09-25 20:48 UTC (permalink / raw)
To: notmuch
Drop the test update added in
commit e4e04bbc328f990e36b77f508aef904d156029b1
Author: David Bremner <david@tethera.net>
Date: Tue Aug 4 08:48:33 2015 +0200
cli/new: add more debugging output
and mark the test as broken, like the tests flagged as broken in
commit ed9ceda623d3f22fb66365b33db63c5c982067d3
Author: David Bremner <david@tethera.net>
Date: Tue Aug 4 08:48:34 2015 +0200
test: add debugging output to notmuch-new tests, mark 5 as broken
---
test/T050-new.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/T050-new.sh b/test/T050-new.sh
index 625739232369..33ce1ab90a3d 100755
--- a/test/T050-new.sh
+++ b/test/T050-new.sh
@@ -224,6 +224,7 @@ output=$(NOTMUCH_NEW 2>&1)
test_expect_equal "$output" "Added 1 new message to the database."
test_begin_subtest "Ignore files and directories specified in new.ignore (multiple occurrences)"
+test_subtest_known_broken
notmuch config set new.ignore .git ignored_file .ignored_hidden_file
notmuch new > /dev/null # ensure that files/folders will be printed in ASCII order.
touch "${MAIL_DIR}"/.git # change .git's mtime for notmuch new to rescan.
@@ -246,7 +247,6 @@ test_expect_equal "$output" \
(D) add_files_recursive, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/ignored_file
(D) add_files_recursive, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/three/.git
(D) add_files_recursive, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/three/ignored_file
-(D) add_files_recursive, pass 3: queuing leftover directory ${MAIL_DIR}/two for deletion from database
No new mail."
--
2.1.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/3] lib: add interface to delete directory documents
2015-09-25 20:48 [PATCH 0/3] delete directory documents on directory removal Jani Nikula
2015-09-25 20:48 ` [PATCH 1/3] test: flag one more notmuch new test as broken Jani Nikula
@ 2015-09-25 20:48 ` Jani Nikula
2015-09-28 11:42 ` David Bremner
2015-09-25 20:48 ` [PATCH 3/3] cli: delete directory documents on directory removal Jani Nikula
2 siblings, 1 reply; 11+ messages in thread
From: Jani Nikula @ 2015-09-25 20:48 UTC (permalink / raw)
To: notmuch
As mentioned in
commit acd66cdec075312944e527febd46382e54d99367
Author: Jani Nikula <jani@nikula.org>
Date: Sat Sep 5 12:35:31 2015 +0300
cli: reset db directory mtime upon directory removal
we don't have an interface to delete directory documents, and they're
left behind. Add the interface.
XXX: Should this also remove the files under it, or assume that's been
done by the caller? Should this incorporate some or all of the
functionality of _remove_directory() in notmuch-new.c?
---
lib/directory.cc | 18 ++++++++++++++++++
lib/notmuch.h | 7 +++++++
2 files changed, 25 insertions(+)
diff --git a/lib/directory.cc b/lib/directory.cc
index b836ea2812c8..f23b71769aef 100644
--- a/lib/directory.cc
+++ b/lib/directory.cc
@@ -281,6 +281,24 @@ notmuch_directory_get_child_directories (notmuch_directory_t *directory)
return child_directories;
}
+notmuch_status_t
+notmuch_directory_delete (notmuch_directory_t *directory)
+{
+ notmuch_status_t status;
+ Xapian::WritableDatabase *db;
+
+ status = _notmuch_database_ensure_writable (directory->notmuch);
+ if (status)
+ return status;
+
+ db = static_cast <Xapian::WritableDatabase *> (directory->notmuch->xapian_db);
+ db->delete_document (directory->document_id);
+
+ notmuch_directory_destroy (directory);
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
void
notmuch_directory_destroy (notmuch_directory_t *directory)
{
diff --git a/lib/notmuch.h b/lib/notmuch.h
index 87756838d072..1feda4521e4d 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -1720,6 +1720,13 @@ notmuch_filenames_t *
notmuch_directory_get_child_directories (notmuch_directory_t *directory);
/**
+ * Delete directory document from the database, and destroy the
+ * notmuch_directory_t object.
+ */
+notmuch_status_t
+notmuch_directory_delete (notmuch_directory_t *directory);
+
+/**
* Destroy a notmuch_directory_t object.
*/
void
--
2.1.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/3] cli: delete directory documents on directory removal
2015-09-25 20:48 [PATCH 0/3] delete directory documents on directory removal Jani Nikula
2015-09-25 20:48 ` [PATCH 1/3] test: flag one more notmuch new test as broken Jani Nikula
2015-09-25 20:48 ` [PATCH 2/3] lib: add interface to delete directory documents Jani Nikula
@ 2015-09-25 20:48 ` Jani Nikula
2015-10-10 12:27 ` V2 of directory delete patches David Bremner
2 siblings, 1 reply; 11+ messages in thread
From: Jani Nikula @ 2015-09-25 20:48 UTC (permalink / raw)
To: notmuch
There was a problem with the directory documents being left behind
when the filesystem directory was removed. This was worked around in
commit acd66cdec075312944e527febd46382e54d99367
Author: Jani Nikula <jani@nikula.org>
Date: Sat Sep 5 12:35:31 2015 +0300
cli: reset db directory mtime upon directory removal
However, that ignored the fact that the directory documents are also
still listed by notmuch_directory_get_child_directories() leading to
confusing results when running notmuch new. The directory documents
are found and queued for removal over and over again.
Fix the problem for real by removing the directory documents. This
fixes the tests flagged as broken in
commit ed9ceda623d3f22fb66365b33db63c5c982067d3
Author: David Bremner <david@tethera.net>
Date: Tue Aug 4 08:48:34 2015 +0200
test: add debugging output to notmuch-new tests, mark 5 as broken
The (non-deterministic) hack test from [1] also still passes with this
change.
[1] id:1441445731-4362-1-git-send-email-jani@nikula.org
---
notmuch-new.c | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/notmuch-new.c b/notmuch-new.c
index 33645349cd5f..8bfed37fef96 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -878,17 +878,11 @@ _remove_directory (void *ctx,
goto DONE;
}
- /*
- * XXX: The library does not have a function to remove a directory
- * document for a path. Usually this doesn't matter except for a
- * slight waste of space. However, if the directory gets added to
- * the filesystem again, the old directory document is found with
- * the old mtime. Reset the directory mtime to avoid problems.
- */
- notmuch_directory_set_mtime (directory, 0);
+ status = notmuch_directory_delete (directory);
DONE:
- notmuch_directory_destroy (directory);
+ if (status)
+ notmuch_directory_destroy (directory);
return status;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] lib: add interface to delete directory documents
2015-09-25 20:48 ` [PATCH 2/3] lib: add interface to delete directory documents Jani Nikula
@ 2015-09-28 11:42 ` David Bremner
0 siblings, 0 replies; 11+ messages in thread
From: David Bremner @ 2015-09-28 11:42 UTC (permalink / raw)
To: Jani Nikula, notmuch
Jani Nikula <jani@nikula.org> writes:
>
> XXX: Should this also remove the files under it, or assume that's been
> done by the caller? Should this incorporate some or all of the
> functionality of _remove_directory() in notmuch-new.c?
1) The top level _remove_directory function does seem to make sense in
the lib, however
2) it calls remove_filename, which reads and writes add_files_state in
pseudo-OO style.
3) In particular it needs to read synchronize_flags, and write
renamed_messages and removed_messages.
I guess one solution would be to pass through three arguments. A fancier
version would be to pass in a "visitor" function and closure pointer.
The cowardly solution would be to point at POSIX rmdir, and leave the
discussion immediately above for the future.
d
^ permalink raw reply [flat|nested] 11+ messages in thread
* V2 of directory delete patches
2015-09-25 20:48 ` [PATCH 3/3] cli: delete directory documents on directory removal Jani Nikula
@ 2015-10-10 12:27 ` David Bremner
2015-10-10 12:27 ` [PATCH 1/3] test: flag one more notmuch new test as broken David Bremner
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: David Bremner @ 2015-10-10 12:27 UTC (permalink / raw)
To: Jani Nikula, notmuch
Changes since id:cover.1443213654.git.jani@nikula.org
- tidy commit messages
- update docs in lib/notmuch.h
- make an executive decision not to push _remove_directory into lib
for now; it can always be a new api layer later.
- unmark fixed tests
- wrap xapian calls in try/catch
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/3] test: flag one more notmuch new test as broken
2015-10-10 12:27 ` V2 of directory delete patches David Bremner
@ 2015-10-10 12:27 ` David Bremner
2015-10-10 12:27 ` [PATCH 2/3] lib: add interface to delete directory documents David Bremner
` (2 subsequent siblings)
3 siblings, 0 replies; 11+ messages in thread
From: David Bremner @ 2015-10-10 12:27 UTC (permalink / raw)
To: Jani Nikula, notmuch
From: Jani Nikula <jani@nikula.org>
Drop the test update added in [1] and mark the test as broken, like the
tests flagged as broken in [2]. These all reflect the same underlying
breakage with (lack of) directory deletion.
[1] commit e4e04bbc328f990e36b77f508aef904d156029b1
[2] commit ed9ceda623d3f22fb66365b33db63c5c982067d3
---
test/T050-new.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/T050-new.sh b/test/T050-new.sh
index 6257392..33ce1ab 100755
--- a/test/T050-new.sh
+++ b/test/T050-new.sh
@@ -224,6 +224,7 @@ output=$(NOTMUCH_NEW 2>&1)
test_expect_equal "$output" "Added 1 new message to the database."
test_begin_subtest "Ignore files and directories specified in new.ignore (multiple occurrences)"
+test_subtest_known_broken
notmuch config set new.ignore .git ignored_file .ignored_hidden_file
notmuch new > /dev/null # ensure that files/folders will be printed in ASCII order.
touch "${MAIL_DIR}"/.git # change .git's mtime for notmuch new to rescan.
@@ -246,7 +247,6 @@ test_expect_equal "$output" \
(D) add_files_recursive, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/ignored_file
(D) add_files_recursive, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/three/.git
(D) add_files_recursive, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/three/ignored_file
-(D) add_files_recursive, pass 3: queuing leftover directory ${MAIL_DIR}/two for deletion from database
No new mail."
--
2.5.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/3] lib: add interface to delete directory documents
2015-10-10 12:27 ` V2 of directory delete patches David Bremner
2015-10-10 12:27 ` [PATCH 1/3] test: flag one more notmuch new test as broken David Bremner
@ 2015-10-10 12:27 ` David Bremner
2015-10-10 12:27 ` [PATCH 3/3] cli: delete directory documents on directory removal David Bremner
2015-10-11 16:45 ` V2 of directory delete patches Tomi Ollila
3 siblings, 0 replies; 11+ messages in thread
From: David Bremner @ 2015-10-10 12:27 UTC (permalink / raw)
To: Jani Nikula, notmuch
From: Jani Nikula <jani@nikula.org>
As mentioned in acd66cdec075312944e527febd46382e54d99367 we don't have
an interface to delete directory documents, and they're left behind. Add
the interface.
---
lib/directory.cc | 25 +++++++++++++++++++++++++
lib/notmuch.h | 10 ++++++++++
2 files changed, 35 insertions(+)
diff --git a/lib/directory.cc b/lib/directory.cc
index b836ea2..78637b3 100644
--- a/lib/directory.cc
+++ b/lib/directory.cc
@@ -281,6 +281,31 @@ notmuch_directory_get_child_directories (notmuch_directory_t *directory)
return child_directories;
}
+notmuch_status_t
+notmuch_directory_delete (notmuch_directory_t *directory)
+{
+ notmuch_status_t status;
+ Xapian::WritableDatabase *db;
+
+ status = _notmuch_database_ensure_writable (directory->notmuch);
+ if (status)
+ return status;
+
+ try {
+ db = static_cast <Xapian::WritableDatabase *> (directory->notmuch->xapian_db);
+ db->delete_document (directory->document_id);
+ } catch (const Xapian::Error &error) {
+ _notmuch_database_log (directory->notmuch,
+ "A Xapian exception occurred deleting directory entry: %s.\n",
+ error.get_msg().c_str());
+ directory->notmuch->exception_reported = TRUE;
+ status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+ }
+ notmuch_directory_destroy (directory);
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
void
notmuch_directory_destroy (notmuch_directory_t *directory)
{
diff --git a/lib/notmuch.h b/lib/notmuch.h
index c5f7dcb..85b56bf 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -1762,6 +1762,16 @@ notmuch_filenames_t *
notmuch_directory_get_child_directories (notmuch_directory_t *directory);
/**
+ * Delete directory document from the database, and destroy the
+ * notmuch_directory_t object. Assumes any child directories and files
+ * have been deleted by the caller.
+ *
+ * @since libnotmuch 4.3 (notmuch 0.21)
+ */
+notmuch_status_t
+notmuch_directory_delete (notmuch_directory_t *directory);
+
+/**
* Destroy a notmuch_directory_t object.
*/
void
--
2.5.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/3] cli: delete directory documents on directory removal
2015-10-10 12:27 ` V2 of directory delete patches David Bremner
2015-10-10 12:27 ` [PATCH 1/3] test: flag one more notmuch new test as broken David Bremner
2015-10-10 12:27 ` [PATCH 2/3] lib: add interface to delete directory documents David Bremner
@ 2015-10-10 12:27 ` David Bremner
2015-10-11 16:45 ` V2 of directory delete patches Tomi Ollila
3 siblings, 0 replies; 11+ messages in thread
From: David Bremner @ 2015-10-10 12:27 UTC (permalink / raw)
To: Jani Nikula, notmuch
From: Jani Nikula <jani@nikula.org>
There was a problem with the directory documents being left behind when
the filesystem directory was removed. This was worked around in [1].
However, that ignored the fact that the directory documents are also
still listed by notmuch_directory_get_child_directories() leading to
confusing results when running notmuch new. The directory documents are
found and queued for removal over and over again.
Fix the problem for real by removing the directory documents. This fixes
the tests flagged as broken in [2].
The (non-deterministic) hack test from [1] also still passes with this
change.
[1] commit acd66cdec075312944e527febd46382e54d99367
[2] commit ed9ceda623d3f22fb66365b33db63c5c982067d3
[3] id:1441445731-4362-1-git-send-email-jani@nikula.org
---
notmuch-new.c | 12 +++---------
test/T050-new.sh | 6 ------
2 files changed, 3 insertions(+), 15 deletions(-)
diff --git a/notmuch-new.c b/notmuch-new.c
index 442a2f0..d45d0af 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -878,17 +878,11 @@ _remove_directory (void *ctx,
goto DONE;
}
- /*
- * XXX: The library does not have a function to remove a directory
- * document for a path. Usually this doesn't matter except for a
- * slight waste of space. However, if the directory gets added to
- * the filesystem again, the old directory document is found with
- * the old mtime. Reset the directory mtime to avoid problems.
- */
- notmuch_directory_set_mtime (directory, 0);
+ status = notmuch_directory_delete (directory);
DONE:
- notmuch_directory_destroy (directory);
+ if (status)
+ notmuch_directory_destroy (directory);
return status;
}
diff --git a/test/T050-new.sh b/test/T050-new.sh
index 33ce1ab..81cf2fa 100755
--- a/test/T050-new.sh
+++ b/test/T050-new.sh
@@ -93,7 +93,6 @@ No new mail. Detected 3 file renames."
test_begin_subtest "Deleted directory"
-test_subtest_known_broken
rm -rf "${MAIL_DIR}"/dir-renamed
output=$(NOTMUCH_NEW --debug)
@@ -102,7 +101,6 @@ No new mail. Removed 3 messages."
test_begin_subtest "New directory (at end of list)"
-test_subtest_known_broken
generate_message [dir]=zzz
generate_message [dir]=zzz
@@ -114,7 +112,6 @@ test_expect_equal "$output" "Added 3 new messages to the database."
test_begin_subtest "Deleted directory (end of list)"
-test_subtest_known_broken
rm -rf "${MAIL_DIR}"/zzz
output=$(NOTMUCH_NEW --debug)
@@ -173,7 +170,6 @@ test_expect_equal "$output" "(D) add_files_recursive, pass 3: queuing leftover d
No new mail. Removed 3 messages."
test_begin_subtest "Support single-message mbox"
-test_subtest_known_broken
cat > "${MAIL_DIR}"/mbox_file1 <<EOF
From test_suite@notmuchmail.org Fri Jan 5 15:43:57 2001
From: Notmuch Test Suite <test_suite@notmuchmail.org>
@@ -187,7 +183,6 @@ test_expect_equal "$output" "Added 1 new message to the database."
# This test requires that notmuch new has been run at least once.
test_begin_subtest "Skip and report non-mail files"
-test_subtest_known_broken
generate_message
mkdir -p "${MAIL_DIR}"/.git && touch "${MAIL_DIR}"/.git/config
touch "${MAIL_DIR}"/ignored_file
@@ -224,7 +219,6 @@ output=$(NOTMUCH_NEW 2>&1)
test_expect_equal "$output" "Added 1 new message to the database."
test_begin_subtest "Ignore files and directories specified in new.ignore (multiple occurrences)"
-test_subtest_known_broken
notmuch config set new.ignore .git ignored_file .ignored_hidden_file
notmuch new > /dev/null # ensure that files/folders will be printed in ASCII order.
touch "${MAIL_DIR}"/.git # change .git's mtime for notmuch new to rescan.
--
2.5.3
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: V2 of directory delete patches
2015-10-10 12:27 ` V2 of directory delete patches David Bremner
` (2 preceding siblings ...)
2015-10-10 12:27 ` [PATCH 3/3] cli: delete directory documents on directory removal David Bremner
@ 2015-10-11 16:45 ` Tomi Ollila
2015-10-14 10:58 ` David Bremner
3 siblings, 1 reply; 11+ messages in thread
From: Tomi Ollila @ 2015-10-11 16:45 UTC (permalink / raw)
To: David Bremner, Jani Nikula, notmuch
On Sat, Oct 10 2015, David Bremner <david@tethera.net> wrote:
> Changes since id:cover.1443213654.git.jani@nikula.org
>
> - tidy commit messages
> - update docs in lib/notmuch.h
> - make an executive decision not to push _remove_directory into lib
> for now; it can always be a new api layer later.
> - unmark fixed tests
> - wrap xapian calls in try/catch
Looks good to me. tests pass.
Tomi
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: V2 of directory delete patches
2015-10-11 16:45 ` V2 of directory delete patches Tomi Ollila
@ 2015-10-14 10:58 ` David Bremner
0 siblings, 0 replies; 11+ messages in thread
From: David Bremner @ 2015-10-14 10:58 UTC (permalink / raw)
To: Tomi Ollila, Jani Nikula, notmuch
Tomi Ollila <tomi.ollila@iki.fi> writes:
>
>
> Looks good to me. tests pass.
>
> Tomi
Pushed, with one one commit message typo fix
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-10-14 11:00 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-25 20:48 [PATCH 0/3] delete directory documents on directory removal Jani Nikula
2015-09-25 20:48 ` [PATCH 1/3] test: flag one more notmuch new test as broken Jani Nikula
2015-09-25 20:48 ` [PATCH 2/3] lib: add interface to delete directory documents Jani Nikula
2015-09-28 11:42 ` David Bremner
2015-09-25 20:48 ` [PATCH 3/3] cli: delete directory documents on directory removal Jani Nikula
2015-10-10 12:27 ` V2 of directory delete patches David Bremner
2015-10-10 12:27 ` [PATCH 1/3] test: flag one more notmuch new test as broken David Bremner
2015-10-10 12:27 ` [PATCH 2/3] lib: add interface to delete directory documents David Bremner
2015-10-10 12:27 ` [PATCH 3/3] cli: delete directory documents on directory removal David Bremner
2015-10-11 16:45 ` V2 of directory delete patches Tomi Ollila
2015-10-14 10:58 ` David Bremner
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).