]> git.plutz.net Git - shellwiki/commitdiff
bugfix: accidentally wiped search index when pruning
authorPaul Hänsch <paul@plutz.net>
Wed, 28 Feb 2024 14:57:10 +0000 (15:57 +0100)
committerPaul Hänsch <paul@plutz.net>
Wed, 28 Feb 2024 14:57:10 +0000 (15:57 +0100)
searchindex.sh

index 162fad12e72109af68e6ad3365142112202affb6..28bd76a82e979386dfaa76aaf26cf507bec614c0 100755 (executable)
@@ -65,18 +65,25 @@ help() {
            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 the
-           environment variable "\$_DATA" or the 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
@@ -90,6 +97,7 @@ while [ $# -gt 0 ]; do case $1 in
   --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
@@ -112,6 +120,8 @@ fi
 . "$_EXEC/cgilite/storage.sh"
 
 prune() {
+  local v l d date location freq num total
+
   for word in "$_DATA/index"/*; do
     [ "$word" = "$_DATA/index/*" ] && continue
   
@@ -120,7 +130,7 @@ prune() {
     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
@@ -131,10 +141,15 @@ prune() {
       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() {
+  local PATH_INFO _DATE SEARCH_INDEX location v
   export PATH_INFO="" _DATE="$(date +%s)" SEARCH_INDEX=true
 
   if [ "$location" ]; then