liberapay.com/Makefile
2025-04-05 17:24:36 +02:00

197 lines
7.0 KiB
Makefile

python := "$(shell { command -v python3.12 || command -v python3 || command -v python || echo false; } 2>/dev/null)"
# Set the relative path to installed binaries under the project virtualenv.
# NOTE: Creating a virtualenv on Windows places binaries in the 'Scripts' directory.
bin_dir := $(shell $(python) -c 'import sys; print("Scripts" if sys.platform == "win32" else "bin")')
env := env
env_bin := $(env)/$(bin_dir)
env_py := $(env_bin)/$(shell basename $(python))
pip := $(env_py) -m pip --disable-pip-version-check
with_local_env := $(env_py) cli/run.py -e defaults.env,local.env -s PYTHONPATH=.
with_tests_env := $(env_py) cli/run.py -e defaults.env,tests/test.env,tests/local.env -s PYTHONPATH=.
py_test := $(with_tests_env) $(env_py) -m pytest -Wd $$PYTEST_ARGS
echo:
@echo $($(var))
$(env): Makefile requirements*.txt
@if [ "$(python)" = "false" ]; then \
echo "Unable to find a 'python' executable. Please make sure that Python is installed."; \
exit 1; \
fi;
@$(python) cli/check-python-version.py
$(python) -m venv --upgrade-deps $(env)
$(pip) install wheel
$(pip) install --require-hashes -r requirements_base.txt
$(pip) install -r requirements_tests.txt
@touch $(env)
rehash-requirements:
$(pip) install hashin
f=requirements_base.txt; \
sed -E -e '/^ *#/d' -e '/^ +--hash/d' -e 's/(; .+)?\\$$//' $$f | xargs $(env_bin)/hashin -r $$f;
clean:
rm -rf $(env) *.egg *.egg-info
find . -name \*.pyc -delete
schema: $(env)
$(with_local_env) ./recreate-schema.sh
schema-diff: test-schema
eb ssh liberapay -c 'pg_dump -sO' | sed -e '/^INFO: /d' >prod.sql
$(with_tests_env) sh -c 'pg_dump -sO "$$DATABASE_URL"' >local.sql
sed -E -e '/^--/d' -e '/^\s*$$/d' -e '/^SET /d' -e 's/\bpg_catalog\.//g' -i prod.sql local.sql
diff -uw prod.sql local.sql
rm prod.sql local.sql
data: $(env)
$(with_local_env) $(env_py) -m liberapay.utils.fake_data
db-migrations: sql/migrations.sql
$(with_local_env) $(env_py) liberapay/models/__init__.py
run: $(env)
@$(MAKE) --no-print-directory db-migrations || true
PATH=$(env_bin):$$PATH $(with_local_env) $(env_py) app.py
py: $(env)
$(with_local_env) -s RUN_CRON_JOBS=no $(env_py) -i $${main-liberapay/main.py}
shell: py
test-shell: $(env)
$(with_tests_env) $(env_py) -i $${main-liberapay/main.py}
test-schema: $(env)
$(with_tests_env) ./recreate-schema.sh test
lint: $(env)
$(env_py) -m ruff check app.py liberapay tests
test: test-schema pytest
tests: test
pytest: $(env)
$(py_test) ./tests/py/test_$${PYTEST-*}.py
@$(MAKE) --no-print-directory lint
$(py_test) --doctest-modules liberapay
pytest-cov: $(env)
$(py_test) --cov-report html --cov liberapay ./tests/py/test_$${PYTEST-*}.py
@$(MAKE) --no-print-directory lint
$(py_test) --doctest-modules liberapay
pytest-re: $(env)
$(py_test) --lf ./tests/py/
@$(MAKE) --no-print-directory lint
pytest-i18n-browse: $(env)
@if [ -f sql/branch.sql ]; then $(MAKE) --no-print-directory test-schema; fi
LIBERAPAY_I18N_TEST=yes $(py_test) -k TestTranslations ./tests/py/
pytest-profiling: $(env)
LIBERAPAY_PROFILING=yes $(py_test) -k $${k-TestPerformance} --profile-svg ./tests/py/
update-test-deps: $(env)
$(pip) install -U -r requirements_tests.txt
_i18n_extract: $(env)
@PYTHONPATH=. $(env_bin)/pybabel extract -F .babel_extract --no-wrap -o i18n/core.pot --sort-by-file $$(\
git ls-files | \
grep -E '^(liberapay/.+\.py|.+\.(spt|html))$$' | \
python -c "import sys; print(*sorted(sys.stdin, key=lambda l: l.rsplit('/', 1)))" \
)
@$(env_py) cli/po-tools.py reflag i18n/core.pot
@for f in i18n/*/*.po; do \
$(env_bin)/pybabel update -i i18n/core.pot -l $$(basename -s '.po' "$$f") -o "$$f" --ignore-obsolete --no-fuzzy-matching --no-wrap; \
done
rm i18n/core.pot
_i18n_clean: $(env)
@for f in i18n/*/*.po; do \
echo "cleaning catalog $$f"; \
sed -E -e '/^"(POT?-[^-]+-Date|Last-Translator|X-Generator|Language|Project-Id-Version|Report-Msgid-Bugs-To): /d' \
-e 's/^("[^:]+: ) +/\1/' \
-e 's/^("Language-Team: .+? )<(.+)>\\n/\1"\n"<\2>\\n/' \
-e '/^#, python-format$$/d' \
-e 's/^#(, .+)?, python-format(, .+)?$$/#\1\2/' \
-e '/^#: /d' \
"$$f" | \
$(env_py) -c "import sys; print(sys.stdin.read().rstrip())" > "$$f.new"; \
mv "$$f.new" "$$f"; \
done
_i18n_convert: $(env)
@$(env_py) cli/convert-chinese.py
i18n_update: _i18n_rebase _i18n_pull _i18n_extract _i18n_convert _i18n_clean
@if git commit --dry-run i18n &>/dev/null; then \
git commit -m "update translation catalogs" i18n; \
fi
@echo "Running i18n browse test..."
@$(MAKE) --no-print-directory pytest-i18n-browse
@echo "All done, check that everything is okay then push to master."
_i18n_rebase:
@echo -n "Please go to https://hosted.weblate.org/projects/liberapay/#repository and click the Commit button if there are uncommitted changes, then press Enter to continue..."
@read a
_i18n_fetch:
@current_url=$$(git remote get-url weblate); \
if [ "$$current_url" = "" ]; then \
git remote add weblate "https://hosted.weblate.org/git/liberapay/core/"; \
elif [ "$$current_url" != "https://hosted.weblate.org/git/liberapay/core/" ]; then \
git remote set-url weblate "https://hosted.weblate.org/git/liberapay/core/"; \
fi
git fetch weblate
_i18n_pull: _i18n_fetch
git checkout -q master
@if git commit --dry-run i18n &>/dev/null; then \
echo "There are uncommitted changes in the i18n/ directory." && exit 1; \
fi
@if test $$(git diff HEAD i18n | wc -c) -gt 0; then \
echo "There are unstaged changes in the i18n/ directory." && exit 1; \
fi
git pull
git merge -q --no-ff --no-commit -m "merge translations" weblate/master || true
@if test $$(git diff HEAD i18n | wc -c) -gt 0; then \
$(MAKE) --no-print-directory _i18n_merge; \
fi
_i18n_merge:
git reset -q master -- i18n
@for f in i18n/*/*.po; do \
if test $$(sed -E -e '/\\n"$$/{d;d}' $$f | grep -c -E '^"' 2>/dev/null) -gt 10; then \
$(env_py) cli/po-tools.py reformat $$f; \
fi \
done
@$(MAKE) --no-print-directory _i18n_clean
@while true; do \
git add -p i18n; \
echo -n 'Are you done? (y/n) ' && read done; \
test "$$done" = 'y' && break; \
done
git merge --continue
git checkout -q HEAD -- i18n
bootstrap-upgrade:
@if [ -z "$(version)" ]; then echo "You forgot the 'version=x.x.x' argument."; exit 1; fi
wget https://github.com/twbs/bootstrap-sass/archive/v$(version).tar.gz -O bootstrap-sass-$(version).tar.gz
tar -xaf bootstrap-sass-$(version).tar.gz
rm -rf www/assets/bootstrap/{fonts,js}/*
mv bootstrap-sass-$(version)/assets/javascripts/bootstrap.min.js www/assets/bootstrap/js
mv bootstrap-sass-$(version)/assets/fonts/bootstrap/* www/assets/bootstrap/fonts
rm -rf style/bootstrap
mv bootstrap-sass-$(version)/assets/stylesheets/bootstrap style
mv style/{bootstrap/_,}variables.scss
git add style/bootstrap www/assets/bootstrap
git commit -m "upgrade Bootstrap to $(version)"
git commit -p style/variables.scss -m "merge upstream changes into variables.scss"
git checkout -q HEAD style/variables.scss
rm -rf bootstrap-sass-$(version){,.tar.gz}
stripe-bridge:
$(with_local_env) $(env_py) cli/stripe-bridge.py