2011-12-08 23:48:31 +01:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
test_description='hooks'
|
2017-09-25 22:38:19 +02:00
|
|
|
. $(dirname "$0")/test-lib.sh || exit 1
|
2011-12-08 23:48:31 +01:00
|
|
|
|
2021-03-19 02:54:13 +01:00
|
|
|
test_require_external_prereq xapian-delve
|
|
|
|
|
2011-12-08 23:48:31 +01:00
|
|
|
create_echo_hook () {
|
|
|
|
local TOKEN="${RANDOM}"
|
|
|
|
mkdir -p ${HOOK_DIR}
|
|
|
|
cat <<EOF >"${HOOK_DIR}/${1}"
|
|
|
|
#!/bin/sh
|
|
|
|
echo "${TOKEN}" > ${3}
|
|
|
|
EOF
|
|
|
|
chmod +x "${HOOK_DIR}/${1}"
|
|
|
|
echo "${TOKEN}" > ${2}
|
|
|
|
}
|
|
|
|
|
2021-03-19 02:54:13 +01:00
|
|
|
create_write_hook () {
|
|
|
|
local TOKEN="${RANDOM}"
|
|
|
|
mkdir -p ${HOOK_DIR}
|
|
|
|
cat <<EOF >"${HOOK_DIR}/${1}"
|
|
|
|
#!/bin/sh
|
|
|
|
if xapian-delve ${MAIL_DIR}/.notmuch/xapian | grep -q "writing = false"; then
|
|
|
|
echo "${TOKEN}" > ${3}
|
|
|
|
fi
|
|
|
|
EOF
|
|
|
|
chmod +x "${HOOK_DIR}/${1}"
|
|
|
|
echo "${TOKEN}" > ${2}
|
|
|
|
}
|
|
|
|
|
2021-05-11 22:48:52 +02:00
|
|
|
create_change_hook () {
|
|
|
|
mkdir -p ${HOOK_DIR}
|
|
|
|
cat <<EOF >"${HOOK_DIR}/${1}"
|
|
|
|
#!/bin/sh
|
|
|
|
notmuch insert --no-hooks < ${2} > /dev/null
|
|
|
|
rm -f ${2}
|
|
|
|
EOF
|
|
|
|
chmod +x "${HOOK_DIR}/${1}"
|
|
|
|
}
|
|
|
|
|
2011-12-08 23:48:31 +01:00
|
|
|
create_failing_hook () {
|
2021-01-10 12:50:14 +01:00
|
|
|
local HOOK_DIR=${2}
|
2011-12-08 23:48:31 +01:00
|
|
|
mkdir -p ${HOOK_DIR}
|
|
|
|
cat <<EOF >"${HOOK_DIR}/${1}"
|
|
|
|
#!/bin/sh
|
|
|
|
exit 13
|
|
|
|
EOF
|
|
|
|
chmod +x "${HOOK_DIR}/${1}"
|
|
|
|
}
|
|
|
|
|
|
|
|
# add a message to generate mail dir and database
|
|
|
|
add_message
|
2014-10-18 09:22:35 +02:00
|
|
|
# create maildir structure for notmuch-insert
|
|
|
|
mkdir -p "$MAIL_DIR"/{cur,new,tmp}
|
2011-12-08 23:48:31 +01:00
|
|
|
|
2021-05-07 12:38:32 +02:00
|
|
|
for config in traditional profile explicit relative XDG split; do
|
2021-01-10 12:50:14 +01:00
|
|
|
unset NOTMUCH_PROFILE
|
|
|
|
notmuch config set database.hook_dir
|
2021-02-17 12:16:54 +01:00
|
|
|
notmuch config set database.path ${MAIL_DIR}
|
2021-01-10 12:50:14 +01:00
|
|
|
case $config in
|
|
|
|
traditional)
|
|
|
|
HOOK_DIR=${MAIL_DIR}/.notmuch/hooks
|
|
|
|
;;
|
|
|
|
profile)
|
|
|
|
dir=${HOME}/.config/notmuch/other
|
|
|
|
mkdir -p ${dir}
|
|
|
|
HOOK_DIR=${dir}/hooks
|
|
|
|
cp ${NOTMUCH_CONFIG} ${dir}/config
|
|
|
|
export NOTMUCH_PROFILE=other
|
|
|
|
;;
|
|
|
|
explicit)
|
|
|
|
HOOK_DIR=${HOME}/.notmuch-hooks
|
|
|
|
mkdir -p $HOOK_DIR
|
|
|
|
notmuch config set database.hook_dir $HOOK_DIR
|
|
|
|
;;
|
2021-05-07 12:38:32 +02:00
|
|
|
relative)
|
|
|
|
HOOK_DIR=${HOME}/.notmuch-hooks
|
|
|
|
mkdir -p $HOOK_DIR
|
|
|
|
notmuch config set database.hook_dir .notmuch-hooks
|
|
|
|
;;
|
2021-01-10 12:50:14 +01:00
|
|
|
XDG)
|
|
|
|
HOOK_DIR=${HOME}/.config/notmuch/default/hooks
|
|
|
|
;;
|
2021-02-17 12:16:54 +01:00
|
|
|
split)
|
|
|
|
dir="$TMP_DIRECTORY/database.$test_count"
|
|
|
|
notmuch config set database.path $dir
|
|
|
|
notmuch config set database.mail_root $MAIL_DIR
|
|
|
|
HOOK_DIR=${dir}/hooks
|
|
|
|
;;
|
2021-01-10 12:50:14 +01:00
|
|
|
esac
|
|
|
|
|
|
|
|
test_begin_subtest "pre-new is run [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
generate_message
|
|
|
|
create_echo_hook "pre-new" expected output $HOOK_DIR
|
|
|
|
notmuch new > /dev/null
|
|
|
|
test_expect_equal_file expected output
|
|
|
|
|
|
|
|
test_begin_subtest "post-new is run [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
generate_message
|
|
|
|
create_echo_hook "post-new" expected output $HOOK_DIR
|
|
|
|
notmuch new > /dev/null
|
|
|
|
test_expect_equal_file expected output
|
|
|
|
|
|
|
|
test_begin_subtest "post-insert hook is run [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
generate_message
|
|
|
|
create_echo_hook "post-insert" expected output $HOOK_DIR
|
|
|
|
notmuch insert < "$gen_msg_filename"
|
|
|
|
test_expect_equal_file expected output
|
|
|
|
|
|
|
|
test_begin_subtest "pre-new is run before post-new [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
generate_message
|
|
|
|
create_echo_hook "pre-new" pre-new.expected pre-new.output $HOOK_DIR
|
|
|
|
create_echo_hook "post-new" post-new.expected post-new.output $HOOK_DIR
|
|
|
|
notmuch new > /dev/null
|
|
|
|
test_expect_equal_file post-new.expected post-new.output
|
|
|
|
|
|
|
|
test_begin_subtest "pre-new non-zero exit status (hook status) [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
generate_message
|
|
|
|
create_failing_hook "pre-new" $HOOK_DIR
|
|
|
|
output=`notmuch new 2>&1`
|
|
|
|
test_expect_equal "$output" "Error: pre-new hook failed with status 13"
|
|
|
|
|
|
|
|
# depends on the previous subtest leaving broken hook behind
|
|
|
|
test_begin_subtest "pre-new non-zero exit status (notmuch status) [${config}]"
|
|
|
|
test_expect_code 1 "notmuch new"
|
|
|
|
|
|
|
|
# depends on the previous subtests leaving 1 new message behind
|
|
|
|
test_begin_subtest "pre-new non-zero exit status aborts new [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
output=$(NOTMUCH_NEW)
|
|
|
|
test_expect_equal "$output" "Added 1 new message to the database."
|
|
|
|
|
|
|
|
test_begin_subtest "post-new non-zero exit status (hook status) [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
generate_message
|
|
|
|
create_failing_hook "post-new" $HOOK_DIR
|
|
|
|
NOTMUCH_NEW 2>output.stderr >output
|
|
|
|
cat output.stderr >> output
|
|
|
|
echo "Added 1 new message to the database." > expected
|
|
|
|
echo "Error: post-new hook failed with status 13" >> expected
|
|
|
|
test_expect_equal_file expected output
|
|
|
|
|
|
|
|
# depends on the previous subtest leaving broken hook behind
|
|
|
|
test_begin_subtest "post-new non-zero exit status (notmuch status) [${config}]"
|
|
|
|
test_expect_code 1 "notmuch new"
|
|
|
|
|
|
|
|
test_begin_subtest "post-insert hook does not affect insert status [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
generate_message
|
|
|
|
create_failing_hook "post-insert" $HOOK_DIR
|
|
|
|
test_expect_success "notmuch insert < \"$gen_msg_filename\" > /dev/null"
|
|
|
|
|
|
|
|
test_begin_subtest "hook without executable permissions [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
mkdir -p ${HOOK_DIR}
|
|
|
|
cat <<EOF >"${HOOK_DIR}/pre-new"
|
|
|
|
#!/bin/sh
|
|
|
|
echo foo
|
2011-12-08 23:48:31 +01:00
|
|
|
EOF
|
2021-01-10 12:50:14 +01:00
|
|
|
output=`notmuch new 2>&1`
|
|
|
|
test_expect_code 1 "notmuch new"
|
|
|
|
|
|
|
|
test_begin_subtest "hook execution failure [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
mkdir -p ${HOOK_DIR}
|
|
|
|
cat <<EOF >"${HOOK_DIR}/pre-new"
|
|
|
|
no hashbang, execl fails
|
2011-12-08 23:48:31 +01:00
|
|
|
EOF
|
2021-01-10 12:50:14 +01:00
|
|
|
chmod +x "${HOOK_DIR}/pre-new"
|
|
|
|
test_expect_code 1 "notmuch new"
|
2011-12-08 23:48:31 +01:00
|
|
|
|
2021-03-19 02:54:13 +01:00
|
|
|
test_begin_subtest "post-new with write access [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
create_write_hook "post-new" write.expected write.output $HOOK_DIR
|
|
|
|
NOTMUCH_NEW
|
|
|
|
test_expect_equal_file write.expected write.output
|
|
|
|
|
|
|
|
test_begin_subtest "pre-new with write access [${config}]"
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
create_write_hook "pre-new" write.expected write.output $HOOK_DIR
|
|
|
|
NOTMUCH_NEW
|
|
|
|
test_expect_equal_file write.expected write.output
|
|
|
|
|
2021-05-11 22:48:52 +02:00
|
|
|
test_begin_subtest "add message in pre-new [${config}]"
|
|
|
|
test_subtest_known_broken
|
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
generate_message '[subject]="add msg in pre-new"'
|
|
|
|
id1=$gen_msg_id
|
|
|
|
create_change_hook "pre-new" $gen_msg_filename $HOOK_DIR
|
|
|
|
generate_message '[subject]="add msg in new"'
|
|
|
|
NOTMUCH_NEW
|
|
|
|
notmuch search id:$id1 or id:$gen_msg_id | notmuch_search_sanitize > OUTPUT
|
|
|
|
cat <<EOF | sed s'/^[ \t]*//' > EXPECTED
|
|
|
|
thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; add msg in pre-new (inbox unread)
|
|
|
|
thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; add msg in new (inbox unread)
|
|
|
|
EOF
|
|
|
|
test_expect_equal_file EXPECTED OUTPUT
|
|
|
|
|
2021-01-10 12:50:14 +01:00
|
|
|
rm -rf ${HOOK_DIR}
|
|
|
|
done
|
2011-12-08 23:48:31 +01:00
|
|
|
test_done
|