#!/bin/sh
-# Copyright 2023 Paul Hänsch
+# Copyright 2023, 2024 Paul Hänsch
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
# IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-export _EXEC="${0%/*}/" _DATA="."
+export _EXEC="${_EXEC:-${0%/*}/}" _DATA="${_DATA:-.}"
verb="" v=0 cmd="" force="" location=""
help() {
Options:
--exec INSTALL_DIR
- Point to the location of your shellwiki installation. This will
- default to the path at which the script is called, if it can be
- determined.
+ Point to the location of your shellwiki installation. Without
+ this optin, the location will be read from the environments
+ variable "\$_EXEC", or will default to the path at which the
+ script is called, if it can be determined.
--data SITE_DIR
- Point to the location of your site installation. I.e. the directory
- containing your "pages/" and "index/" dir. Defaults to working
- directory.
+ Point to the location of your site installation. I.e. the
+ directory containing your "pages/" and "index/" dir. Defaults to
+ the environment variable "\$_DATA" or the working directory.
--force
Add pages to index even if they seem to be indexed already.
- --loction /PAGE
+ --location /PAGE
Index only the given page and its children. The path is given
relative to the web root, i.e. without the DATA and "page/"
directory.
+ --purge
+ During pruning, remove empty database files. This will look
+ tidyer in the index/ directory, but the operation does not
+ guarantee atomicity and can disrupt index operations happening at
+ the same time. Use it carefully and maybe don't use it in
+ automatic runs via cron.
+
-v
Be more verbose.
EOF
while [ $# -gt 0 ]; do case $1 in
--exec|-e) _EXEC="${2%/}"; shift 2;;
--data|-d) _DATA="${2%/}"; shift 2;;
+ --location) location="${2}"; shift 2;;
--verbose|-v) verb=true; shift 1;;
--force) force=true; shift 1;;
+ --purge) purge=true; shift 1;;
--help) help 0 2>&1;;
prune|index)
[ ! "$cmd" ] && cmd="$1" || help 1
. "$_EXEC/cgilite/storage.sh"
prune() {
+ local v l d date location freq num total
+
for word in "$_DATA/index"/*; do
[ "$word" = "$_DATA/index/*" ] && continue
mv -- "$word" "${word}.$$"
while read -r date location freq num total; do
- l="$_DATA/pages$(UNSTRING "$location")#index.flag"
+ l="$_DATA/pages$(UNSTRING "$location")/#index.flag"
d="$(stat -c %Y "$l")" 2>&-
if [ "$date" -ge "$d" ] 2>&-; then
fi
done <"${word}.$$" >>"${word}"
rm -- "${word}.$$"
+ if [ "${purge}" -a -f "${word}" -a ! -s "${word}" ]; then
+ rm -- "${word}"
+ [ "$verb" ] && printf '\rRemoving empty search key "%s"\n' "${word}" >&2
+ fi
done
}
index() {
- export PATH_INFO="" _DATE="$(date +%s)"
+ local PATH_INFO _DATE SEARCH_INDEX location v
+ export PATH_INFO="" _DATE="$(date +%s)" SEARCH_INDEX=true
if [ "$location" ]; then
location="${location#/}" location="${location%/}"
then
[ "$verb" ] && printf "%${v}s\r%s\r" "" "$PATH_INFO" >&2
v="${#PATH_INFO}"
+ cd -- "$_DATA/pages/$PATH_INFO"
"$_EXEC/parsers/40_indexer.sh" <"$_DATA/pages/$PATH_INFO/#page.md" >/dev/null
fi
done