#!/usr/bin/python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#

import os

from generate import *
from shutil import copyfile

def gen_interop_test_docs(release, source_dir, output_dir):
  # Copy QUICKSTART.md into the output directory
  copyfile("%s/QUICKSTART.md"%(source_dir), "%s/QUICKSTART.md"%(output_dir))
  # Generate docbook output
  build_dir = make_temp_dir()
  source_file = "{}/docs/users-guide.txt".format(source_dir)
  output_file = "{}/users-guide.html.in".format(output_dir)
  call(["asciidoc", "--doctype", "book", "--no-header-footer", "--out-file", output_file, source_file])

release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
source_dir = checkout_dir or fetch_source("interop-test", source_release)

gen_interop_test_docs(release, source_dir, release_dir)

notice("Docs generated")
