#!/usr/bin/bash

# DESCRIPTION:
#
# Get <head sha> <path> new-line separated list of all submodules recursively for given GIT_ROOT and GIT_HEAD.
# The list is topologically sorted in reverse order. $GIT_HEAD $GIT_ROOT entry for superproject itself is
# included as well as the last record.
#
# env: GIT_ROOT, GIT_HEAD

cd "$GIT_ROOT"

function git_submodule_refs_flat {
    set -o pipefail
    ( cd "$1" && /usr/bin/git ls-tree -r "$2" | sed -En "s|160000\s+commit\s+(.+)\s+(.+)|\1 ${1%/}/\2|p" ) || exit
    set +o pipefail
}

i=0
submodule_refs=("$GIT_HEAD $GIT_ROOT")
while (( i < ${#submodule_refs[@]} )); do
    read -r head_sha path <<< "${submodule_refs[$i]}"
    add_str="$(git_submodule_refs_flat "$path" "$head_sha")" || exit
    if [ -n "$add_str" ]; then
        mapfile -t add_arr <<< "$add_str"
        submodule_refs=("${submodule_refs[@]}" "${add_arr[@]}")
    fi
    i=$((i + 1))
done

n=${#submodule_refs[*]}
for (( i = n-1; i >= 0; i-- )); do
    echo "${submodule_refs[i]}"
done
