#!/bin/bash -ex

# Copyright 2016 Hewlett Packard Enterprise Development Company, L.P.
#
# 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.

# This script is intended to be run as a periodic proposal bot job
# in OpenStack infrastructure, though you can run it as a one-off.
#
# In order to function correctly, the environment in which the
# script runs must have
#   * a writable doc/source directory relative to the current
#     working directory
#   AND ( (
#   * git
#   * all git repos meant to be searched for plugins cloned and
#     at the desired level of up-to-datedness
#   * the environment variable git_dir pointing to the location
#   * of said git repositories
#   ) OR (
#   * network access to the review.openstack.org Gerrit API
#     working directory
#   * network access to https://git.openstack.org/cgit
#   ))
#
# If a file named data/devstack-plugins-registry.header or
# data/devstack-plugins-registry.footer is found relative to the
# current working directory, it will be prepended or appended to
# the generated reStructuredText plugins table respectively.

# Print the title underline for a RST table.  Argument is the length
# of the first column, second column is assumed to be "URL"
function title_underline {
    local len=$1
    while [[ $len -gt 0 ]]; do
        printf "="
        len=$(( len - 1))
    done
    printf " ===\n"
}

(
declare -A plugins

if [[ -r data/devstack-plugins-registry.header ]]; then
    cat data/devstack-plugins-registry.header
fi

sorted_plugins=$(python tools/generate-devstack-plugins-list.py)

# find the length of the name column & pad
name_col_len=$(echo "${sorted_plugins}" | wc -L)
name_col_len=$(( name_col_len + 2 ))

# ====================== ===
# Plugin Name            URL
# ====================== ===
# foobar                 `https://... <https://...>`__
# ...

printf "\n\n"
title_underline ${name_col_len}
printf "%-${name_col_len}s %s\n" "Plugin Name" "URL"
title_underline ${name_col_len}

for plugin in ${sorted_plugins}; do
    giturl="https://git.openstack.org/openstack/${plugin}"
    gitlink="https://git.openstack.org/cgit/openstack/${plugin}"
    printf "%-${name_col_len}s %s\n" "${plugin}" "\`${giturl} <${gitlink}>\`__"
done

title_underline ${name_col_len}

printf "\n\n"

if [[ -r data/devstack-plugins-registry.footer ]]; then
    cat data/devstack-plugins-registry.footer
fi
) > doc/source/plugin-registry.rst

if [[ -n ${1} ]]; then
    cp doc/source/plugin-registry.rst ${1}/doc/source/plugin-registry.rst
fi
