#!/usr/bin/env bash
#
# SPDX-License-Identifier: GPL-2.0-only
#

help ()
{
    base=`basename $0`
    echo -e "Usage: $base command"
    echo "Avaliable commands:"
    echo -e "\texport <file.conf>: export and lock down the AUTOPR values from the PR service into a file for release."
    echo -e "\timport <file.conf>: import the AUTOPR values from the exported file into the PR service."
}

clean_cache()
{
    s=`bitbake -e | grep ^CACHE= | cut -f2 -d\"`
    if [ "x${s}" != "x" ]; then
        rm -rf ${s}
    fi
}

do_export ()
{
    file=$1
    [ "x${file}" == "x" ] && help && exit 1
    rm -f ${file}

    clean_cache
    bitbake -R conf/prexport.conf -p
    s=`bitbake -R conf/prexport.conf -e | grep ^PRSERV_DUMPFILE= | cut -f2 -d\"`
    if [ "x${s}" != "x" ];
    then
       [ -e $s ] && mv -f $s $file && echo "Exporting to file $file succeeded!"
       return 0
    fi
    echo "Exporting to file $file failed!"
    return 1
}

do_import ()
{
    file=$1
    [ "x${file}" == "x" ] && help && exit 1

    clean_cache
    bitbake -R conf/primport.conf -R $file -p
    ret=$?
    [ $ret -eq 0 ] && echo "Importing from file $file succeeded!" || echo "Importing from file $file failed!"
    return $ret
}

do_migrate_localcount ()
{
    df=`bitbake -R conf/migrate_localcount.conf -e | \
                grep ^LOCALCOUNT_DUMPFILE= | cut -f2 -d\"`
    if [ "x${df}" == "x" ];
    then
        echo "LOCALCOUNT_DUMPFILE is not defined!"
        return 1
    fi

    rm -rf $df
    clean_cache
    echo "Exporting LOCALCOUNT to AUTOINCs..."
    bitbake -R conf/migrate_localcount.conf -p
    [ ! $? -eq 0 ] && echo "Exporting to file $df failed!" && exit 1

    if [ -e $df ];
    then
        echo "Exporting to file $df succeeded!"
    else
        echo "Exporting to file $df failed!"
        exit 1
    fi
    
    echo "Importing generated AUTOINC entries..."
    [ -e $df ] && do_import $df

    if [ ! $? -eq 0 ]
    then
        echo "Migration from LOCALCOUNT to AUTOINCs failed!"
        return 1
    fi

    echo "Migration from LOCALCOUNT to AUTOINCs succeeded!"
    return 0
}

[ $# -eq 0 ] && help  && exit 1

case $2 in
*.conf|*.inc)
    ;;
*)
    echo ERROR: $2 must end with .conf or .inc!
    exit 1
    ;;
esac

case $1 in
export)
    do_export $2
    ;;
import)
    do_import $2
    ;;
migrate_localcount)
    do_migrate_localcount
    ;;
*)
    help
    exit 1
    ;;
esac
