about summary refs log blame commit diff stats
path: root/build/rust/init
blob: 1ea1603d2daa7d5e263585b86fa1f97f1e8842a1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16














                                                           





                                                                           































                                                                                








             


                                                                          
                                                                                                                                                                                               
                                                                                                                                                                                                                          





                                                                                           
                                                                                

                                                                 
                                                       

                                                                                                                         
                                                                                                  
 


                                                        
                                            
  
                                                                                                   






                                                                                                                                             

                                                                                   












                                                                       
                           
   


                                                  






















                                                                                        
#!/usr/bin/env sh

# shellcheck source=/dev/null
. "$(realpath "$(dirname "$0")")/shell_line_editor.sh"

replacement_file="$(mktemp)"

trap cleanup INT
trap "cleanup; remove_self" EXIT
cleanup() {
    rm "$replacement_file"
}
remove_self() {
    rm "$(realpath "$0")"
    rm "$(realpath "$(dirname "$0")")/shell_line_editor.sh"
}
require() {
    program="$1"
    if ! command -v "$program" >/dev/null; then
        echo "Please install '$program' for this init script to work." 1>&2
        exit 1
    fi
}

# Prompt the user for a specific variable.
# ## Args:
# [1]: Name of the variable to populate the answer to
# [2]: An optional description
# [3]: An optionally suggested answer
# [4]: If this is set, the user is not even asked.
prompt() {
    pr_variable_upper="$(echo "$1" | sed 's/\([a-z]\)/\U\1/')"
    pr_description="$2"
    pr_suggested_answer="$3"
    pr_ask="$4"

    if [ -n "$pr_ask" ]; then
        REPLY="$pr_suggested_answer"
    else
        printf "\033[94;1mEnter %s\033[0m" "$pr_variable_upper"
        if [ -n "$pr_description" ]; then
            printf " (\033[93;1m%s\033[0m):\n" "$pr_description"
        else
            printf ":\n"
        fi

        # LE "> " 0 " " "$pr_suggested_answer" "yes_please_produce_debug_output"
        LE "> " 0 " " "$pr_suggested_answer" ""
    fi

    pr_new_variable="$(printf '%s="%s"' "$pr_variable_upper" "$REPLY")"

    eval "$pr_new_variable"
    printf "%s\n" "$pr_new_variable" >>"$replacement_file"
}

require git

require jq
require curl

require fd
require mv
require sed
require chmod

git init

# necessary meta data
prompt APPLICATION_NAME "The name of the application" "$(basename "$PWD")"
prompt APPLICATION_NAME_STYLIZED "The stylized name of the application (for documentation)" "$(echo "$APPLICATION_NAME" | sed 's/[_-]/ /g' | sed 's/^\(\w\)/\U\1/g' | sed 's/ \(\w\)/ \U\1/g')"
prompt APPLICATION_NAME_CAPITALIZED_MAN_PART "The capitalized name of the application (for documentation also with a man section part)" "$(echo "$APPLICATION_NAME" | sed 's/_/-/g' | sed 's/\(.*\)/\U\1(1)/')" "dont_ask"
prompt APPLICATION_VERSION "The version of this program, without the prefix" "0.1.0"

prompt AUTHOR_NAME "The name of the author (or authors)" "$(git config --get user.name)"
prompt AUTHOR_EMAIL "The email of the author (or authors)" "$(git config --get user.email)"

# cog change-log variables
prompt REMOTE "The remote, this project will be pushed to" "git.vhack.eu"
prompt REPOSITORY "The path of the repository on the remote" "$APPLICATION_NAME"
prompt OWNER "The name of owner of the repository" "$AUTHOR_NAME"

# nice meta data
prompt DESCRIPTION "The description of this project" ""
prompt CURRENT_DATE "The stylized version of the current date" "$(date +'%b %Y')"
prompt YEAR "The year the work on this has begun (for copyright reasons)" "$(date +'%Y')"
prompt APPLICATION_SOURCE_CODE_REPOSITORY "The package's source code repository URL" "https://$REMOTE/$OWNER/$REPOSITORY"
prompt HOME_PAGE "The home page URL of the project" "https://$REPOSITORY.org/"
prompt BUG_URL "The URL people should report bugs to" "$APPLICATION_SOURCE_CODE_REPOSITORY/issues"

if [ -e ./lpm.toml ]; then
    # Use a different default license in latex projects.
    init_default_license="CC-BY-SA-4.0"
else
    init_default_license="AGPL-3.0-or-later"
fi
prompt SPDX_LICENSE_IDENTIFIER "THE SPDX identifer of your choosen license" "$init_default_license"

default_license_url="$(curl --silent --show-error "https://spdx.org/licenses/$SPDX_LICENSE_IDENTIFIER.json" | jq --raw-output '.seeAlso[0]')"

# Prefer possible text versions of the license
if curl --fail --silent --show-error "$default_license_url.txt" >/dev/null; then
    default_license_url="$default_license_url.txt"
fi
prompt LICENSE_URL "The url of the license" "$default_license_url"

if [ -e ./.reuse/templates/default.jinja2 ]; then
    cat <<EOF | fmt --uniform-spacing --width=75 >./.reuse/templates/default.jinja2
{% for copyright_line in copyright_lines %}
{{ copyright_line }}
{% endfor %}
{% for contributor_line in contributor_lines %}
SPDX-FileContributor: {{ contributor_line }}
{% endfor %}
{% for expression in spdx_expressions %}
SPDX-License-Identifier: {{ expression }}
{% endfor %}

This file is part of $APPLICATION_NAME_STYLIZED - $DESCRIPTION.

You should have received a copy of the License along with this program.
If not, see <$LICENSE_URL>.
<!-- vim: ft=htmldjango -->
EOF
fi

# Allow templates to add template specific prompts
[ -e init.local ] && . ./init.local

echo "$DESCRIPTION" >.git/description

while read -r var; do
    var_name="${var%=*}"
    var_value="${var#*=\"}"
    var_value="${var_value%\"}"

    fd . --hidden --type file --exec sed --in-place "s|%\bINIT_$var_name\b|$var_value|g"

    # Replace the variable in file paths
    fd "%INIT_$var_name" . --hidden | while read -r file_path; do
        new_file_path="$(echo "$file_path" | sed "s|%INIT_$var_name|$var_value|g")"
        mv "$file_path" "$new_file_path"
    done
done <"$replacement_file"

# HACK: Re-add the executable permissions to files, which the nix template has somehow
# removed <2024-04-02>
chmod +x scripts/*
chmod +x update.sh
[ -f ./build.sh ] && chmod +x build.sh

# vim: ft=sh