#!/bin/bash -e
#
# Copyright 2014 The Kythe Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Script to sync Kythe documentation into /_docs/ for kythe.io.
#
# Usage: ./sync_docs.sh

# Make sure the user has installed the asciidoc gem, otherwise the website will
# generate successfully but it will be missing tocs, titles, and other
# attributes.
if ! gem list -i asciidoctor &> /dev/null; then
  echo "You don't have the asciidoctor gem installed."
  echo "Please run 'gem install --user asciidoctor' before executing this script."
  exit 1
fi

export SHELL=/bin/bash

DIR="$(readlink -e "$(dirname "$0")")"
cd "$DIR/../../.."

# Use the project's bazelrc so we pick up the default options that Kythe needs
# to build correctly.
bazel --bazelrc=.bazelrc build //kythe/docs/... \
    //kythe/docs:schema-overview \
    //kythe/docs/schema \
    //kythe/docs/schema:callgraph \
    //kythe/docs/schema:verifierstyle \
    //kythe/docs/schema:writing-an-indexer \
    //kythe/docs/schema:indexing-generated-code \
    //kythe/docs/schema:marked-source
# Copy the zipped asciidoc outputs into the staging directory, unpack the
# archives, then remove them. We do this to ensure the output retains the
# directory structure of the source tree.
rsync -Lr --chmod=a+w --delete "bazel-bin/kythe/docs/" "$DIR"/_docs
find "$DIR"/_docs -type f -name '*.zip' -execdir unzip -q {} ';' -delete

DOCS=($(bazel query 'kind("source file", deps(//kythe/docs/..., 1))' | \
  grep -E '\.(txt|adoc|ad)$' | \
  parallel --gnu -L1 'x() { file="$(tr : / <<<"$1")"; echo ${file#//kythe/docs/}; }; x'))

asciidoc_query() {
  bundle exec ruby -r asciidoctor -e 'puts Asciidoctor.load_file(ARGV[0]).'"$2" "$1" 2>/dev/null
}

asciidoc_attribute_presence() {
  [[ "$(asciidoc_query "$1" "attributes[\"$2\"] != nil")" == "true" ]]
}

doc_header() {
  echo "---
layout: page
title: $(asciidoc_query "$1" doctitle)
priority: $(asciidoc_query "$1" 'attributes["priority"]')
toclevels: $(asciidoc_query "$1" 'attributes["toclevels"]')"
  if asciidoc_attribute_presence "$1" toc || asciidoc_attribute_presence "$1" toc2; then
    echo "toc: true"
  fi
echo "---"
}

TMP="$(mktemp)"
trap 'rm -rf "$TMP"' EXIT ERR INT

cd "$DIR"
for doc in ${DOCS[@]}; do
  html=${doc%%.*}.html
  echo "Processing $html"
  abs_path="../../../kythe/docs/$doc"
  cp "_docs/$html" "$TMP"
  { doc_header "$abs_path";
    cat "$TMP"; } >"_docs/$html"
done

mv _docs/schema/{schema,index}.html
