#!/bin/bash set -e if [[ -a ".env" ]]; then source .env fi function help-table() { CMD_WIDTH=10 OPT_WIDTH=6 DESC_WIDTH=40 COLUMN="| %-${CMD_WIDTH}s | %-${OPT_WIDTH}s | %-${DESC_WIDTH}s |\n" printf "$COLUMN" "Command" "Option" "Description" echo "|$(printf '%*s' $((CMD_WIDTH + 2)) '' | tr ' ' '-')|$(printf '%*s' $((OPT_WIDTH + 2)) '' | tr ' ' '-')|$(printf '%*s' $((DESC_WIDTH + 2)) '' | tr ' ' '-')|" printf "$COLUMN" "all" "" "Run all tasks." printf "$COLUMN" "install" "" "Setup the local environment." printf "$COLUMN" "lint" "" "Run pre-commit." printf "$COLUMN" "build" "" "Build python packages with whool." printf "$COLUMN" "publish" "" "Publish python packages to PyPi." printf "$COLUMN" "docs" "" "Update index.html." } function help() { echo if [ -n "$1" ]; then help-table | grep -i "$1" | column -t -s'|' else echo "task [options]" echo echo "commands:" echo help-table fi echo } if [ -d "$HOME/taskfile.build/bin" ]; then for file in "$HOME/taskfile.build/bin/"*; do if [ -f "$file" ]; then source "$file" fi done fi function install() { echo "Setup venv and install python dependencies" uv venv env source env/bin/activate uv pip install pre-commit git+https://github.com/OCA/maintainer-tools } function lint() { source env/bin/activate echo "Run pre-commit" pre-commit run --all-files --show-diff-on-failure --color=always } build() { source env/bin/activate ROOT_DIR="$(pwd)" METAPACKAGE_DIR="$ROOT_DIR/setup/_metapackage" PUBLISH_DIR="$ROOT_DIR/dist" mkdir -p "$PUBLISH_DIR" rm -rf "$PUBLISH_DIR"/* SERVER_NAME="$(basename "$ROOT_DIR")" METAPACKAGE_NAME="odoo-apps-$(echo "$SERVER_NAME" | sed 's/_/-/g')" oca-gen-metapackage "$METAPACKAGE_NAME" ADDONS=() mapfile -t ADDONS < <(find . -maxdepth 2 -type f -name "pyproject.toml" | xargs dirname | sed 's|^\./||') for ADDON in "${ADDONS[@]}"; do cd "$ROOT_DIR/$ADDON" echo "Building $ADDON" uv build cp dist/*.whl "$PUBLISH_DIR/" cp dist/*.tar.gz "$PUBLISH_DIR/" cd "$ROOT_DIR" done echo "Installing local wheels for metapackage resolution..." uv pip install "$PUBLISH_DIR"/*.whl 2>/dev/null || true cd "$METAPACKAGE_DIR" echo "Building $METAPACKAGE_NAME" uv build cp dist/*.whl "$PUBLISH_DIR/" cp dist/*.tar.gz "$PUBLISH_DIR/" ls "$PUBLISH_DIR/" } publish() { source env/bin/activate ROOT_DIR="$(pwd)" PUBLISH_DIR="$ROOT_DIR/dist" set +e echo "Publishing from $PUBLISH_DIR to PyPI..." for WHEEL in "$PUBLISH_DIR"/*.whl; do if [ ! -f "$WHEEL" ]; then continue fi echo "Publishing: $WHEEL" uv publish "$WHEEL" --username "__token__" --password "$PYPI_TOKEN" if [ $? -ne 0 ]; then echo "Failed to publish $WHEEL." fi done echo "All wheels published successfully." } function docs() { source env/bin/activate echo "Update index.html for all modules" for MODULE in ./*; do if [ -f "$MODULE/README.rst" ]; then cd "$MODULE" || exit rst2html5 README.rst static/description/index.html cd .. || exit fi done # Find marker in readme and clear content after echo "Clear modules table in README.md" MARKER="## Available modules" sed -i "/$MARKER/Q" "README.md" echo "$MARKER" >> "README.md" echo "" >> "README.md" echo "| Module | Summary |" >> "README.md" echo "| --- | --- |" >> "README.md" MANIFEST_FILES="./*/__manifest__.py" for MANIFEST_FILE in $MANIFEST_FILES; do MODULE_DIR=$(dirname "$MANIFEST_FILE") MODULE_NAME=$(basename "$MODULE_DIR") echo "Add summary of $MODULE_NAME to readme file." SUMMARY=$(grep 'summary' "$MANIFEST_FILE" -A 1 | tail -1) echo "| [$MODULE_NAME]($MODULE_NAME) | $SUMMARY |" >> "README.md" done } if declare -f "$1" > /dev/null; then "$1" "${@:2}" else case "$1" in all) install lint docs ;; *) echo "Unknown command: $1" help task exit 1 ;; esac fi