campaign,de,fr: fix body lang attributes
[gnupg-doc.git] / tools / build-website.sh
index 68bf0df..afb61a9 100755 (executable)
@@ -5,6 +5,7 @@
 #
 #   webbuilder - the user to run this script
 #   webbuild-x - the user used by this script to run emacs
+#   webbuild-y - the user used by this script to run emacs (for preview)
 #
 # A certain directory layout is required with permissions setup
 # so that the webbuild-x has only write access to the stage area
@@ -17,6 +18,7 @@
 # --8<---------------cut here---------------start------------->8---
 # # Pull the master branch of the web pages
 # */20  * * * * cd /home/webbuilder/gnupg-doc && git pull -q origin master
+# */18  * * * * cd /home/webbuilder/gnupg-doc-preview && git pull -q origin preview
 #
 # # In case of race conditions we try to build every few ours again.
 # 35  */7 * * * /home/webbuilder/bin/build-website.sh --cron
@@ -25,7 +27,7 @@
 # /etc/sudoers needs this:
 # --8<---------------cut here---------------start------------->8---
 # # Let webbuilder run any command as user webbuild-x
-# webbuilder         ALL = (webbuild-x) NOPASSWD: ALL
+# webbuilder         ALL = (webbuild-x,webbuild-y) NOPASSWD: ALL
 # --8<---------------cut here---------------end--------------->8---
 #
 
@@ -34,6 +36,7 @@ set -e
 pgm=build-website.sh
 mainuser=webbuilder
 workuser=webbuild-x
+workuser_pv=webbuild-y
 
 # We use a fixed HOME so that this script can be run here from other
 # accounts.
@@ -45,12 +48,16 @@ fi
 
 reponame=gnupg-doc
 htdocs_web="/var/www/www/www.gnupg.org/htdocs"
+htdocs_preview="/var/www/www/preview.gnupg.org/htdocs"
 htdocs_blog="/var/www/www/www.gnupg.org/misc/blog"
 
 workuser_dir=$HOME/${workuser}
+workuser_pv_dir=$HOME/${workuser_pv}
 log_dir="$HOME/log"
 root_dir="$HOME/${reponame}"
+root_dir_pv="$HOME/${reponame}-preview"
 stage_dir="$HOME/${reponame}-stage"
+stage_dir_pv="$HOME/${reponame}-preview-stage"
 LOCKFILE="${log_dir}/${reponame}.lock"
 
 if [ x"$1" = x"--git" ]; then
@@ -68,8 +75,14 @@ if ! id $workuser >/dev/null 2>&1 ; then
    exit 1
 fi
 
+if ! id $workuser_pv >/dev/null 2>&1 ; then
+   echo "$pgm: sudo user '${workuser_pv}' not available" >&2;
+   exit 1
+fi
+
 # Check directories
-for f in "${workuser_dir}" "${root_dir}" "${stage_dir}"; do
+for f in "${workuser_dir}" "${root_dir}" "${stage_dir}" \
+         "${workuser_pv_dir}" "${root_dir_pv}" "${stage_dir_pv}"; do
   if [ ! -d "$f" ]; then
      echo "$pgm: directory '$f' missing" >&2;
      exit 1
@@ -85,11 +98,21 @@ for f in "${workuser_dir}" "${stage_dir}"; do
     exit 1
   fi
 done
+want="2775:${workuser_pv}:${mainuser}"
+for f in "${workuser_pv_dir}" "${stage_dir_pv}"; do
+  x=$(stat -c '%a:%U:%G' "$f")
+  if [ x"$x" != x"$want" ]; then
+    echo "$pgm: directory '$f' has wrong permissions" >&2
+    echo "$pgm:   want: $want" >&2
+    echo "$pgm:   have: $x" >&2
+    exit 1
+  fi
+done
 
 cd "${root_dir}"
 
 #
-# Take a lock so that only one instacne of this script runs.
+# Take a lock so that only one instance of this script runs.
 #
 if ! lockfile -l 7200 -r 2 $LOCKFILE; then
     echo "$pgm: another instance is still running" >&2
@@ -98,9 +121,11 @@ fi
 trap "rm -f $LOCKFILE" 0
 
 
-# These flags are set to the stage directory iof a sync is required
+# These flags are set to the stage directory if a sync is required
 sync_web=
 sync_blog=
+sync_preview=
+
 
 #
 # Build main part
@@ -204,6 +229,54 @@ fi
 
 
 #
+# Build the preview site (w/o blogs)
+#
+branch=preview
+subdir=web
+
+cd "${root_dir_pv}"
+
+revlastfile="${log_dir}/${reponame}.$branch.$(echo $subdir | tr / _).revlast"
+buildlog="${log_dir}/${reponame}.$branch.$(echo $subdir | tr / _).log"
+rev="$(git rev-parse --verify $branch:$subdir)"
+if [ -z "$rev" ]; then
+   echo "$pgm: No git revision found" >&2;
+   exit 1
+fi
+revlast="$(head -1 ${revlastfile} 2>/dev/null || true)"
+if [ x"$rev" = x"$revlast" ]; then
+   echo "$pgm: No need to build $branch:$subdir" >&2;
+else
+
+  echo "$(date -u -Iseconds) build started for $branch:$subdir" | tee ${buildlog}
+
+  if [ ! -d ${stage_dir_pv}/${subdir} ]; then
+      sudo -u webbuild-y mkdir ${stage_dir_pv}/${subdir}
+  fi
+
+  sudo 2>>${buildlog} -u webbuild-y emacs24 -q --batch  \
+  --eval "(require 'assoc)" \
+  --eval "(require 'org)" \
+  --eval "(setq make-backup-files nil)" \
+  --eval "(setq gpgweb-root-dir  \"${root_dir_pv}/${subdir}/\")" \
+  --eval "(setq gpgweb-stage-dir \"${stage_dir_pv}/${subdir}/\")" \
+  --eval "(require 'gpgweb (concat gpgweb-root-dir \"share/gpgweb.el\"))" \
+  --eval "(setq org-publish-use-timestamps-flag nil)" \
+  --eval "(setq org-export-html-toplevel-hlevel 1)" \
+  --eval "(setq org-export-html-coding-system 'utf-8)" \
+  --eval "(gpgweb-setup-project)" \
+  --eval "(org-publish-initialize-cache \"gpgweb\")" \
+  --eval "(message \"root=(%s)\" gpgweb-root-dir)" \
+  --eval "(org-publish \"gpgweb\" t nil)"
+
+  echo "$rev" > ${revlastfile}
+  sync_preview=${stage_dir_pv}/${subdir}
+  echo "$(date -u -Iseconds) build finished for $branch:$subdir" | tee -a ${buildlog}
+fi
+cd "${root_dir}"
+
+
+#
 # Sync to the webspace
 #
 cd "${root_dir}"
@@ -225,11 +298,20 @@ fi
 if [ -n "$sync_blog" ]; then
   cd "$sync_blog"
   rsync -rt --links --exclude '*~' --exclude '*.sh' \
-        --exclude '*tmp' --exclude '*.org' --exclude headlines.txt \
-        . ${htdocs_blog}/
+        --exclude '*tmp' --exclude '*.org' . ${htdocs_blog}/
   any_sync=yes
 fi
 
+if [ -n "$sync_preview" ]; then
+  cd "$sync_preview"
+  rsync -rlt --exclude '*~' --exclude '*.tmp' \
+        . ${htdocs_preview}/
+  $HOME/bin/mkkudos.sh --verbose --force --test
+fi
+
+
+cd "${root_dir}"
+
 if [ "$any_sync" = yes ]; then
   $HOME/bin/mkkudos.sh --verbose --force
 fi