X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=Makefile;h=56cf09b2e0abdbcad70e1553bf17db4a763011a3;hb=d37348efe280f0b72807ea6f62fca63e2ad28991;hp=9635e53e56e818efb4c90285bd0004612ac8d93d;hpb=f3e89f50ecae76ddd6bf77e23b4a84bec998bd69;p=github%2Fshaarli%2FShaarli.git diff --git a/Makefile b/Makefile index 9635e53e..56cf09b2 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,21 @@ -# Shaarli, the personal, minimalist, super-fast, no-database delicious clone. -# Makefile for PHP code analysis & testing - -# Prerequisites: -# - install Composer, either: -# - from your distro's package manager; -# - from the official website (https://getcomposer.org/download/); -# - install/update test dependencies: -# $ composer install # 1st setup -# $ composer update +# The personal, minimalist, super-fast, database free, bookmarking service. +# Makefile for PHP code analysis & testing, documentation and release generation BIN = vendor/bin -PHP_SOURCE = index.php -MESS_DETECTOR_RULES = cleancode,codesize,controversial,design,naming,unusedcode +PHP_SOURCE = index.php application tests plugins +PHP_COMMA_SOURCE = index.php,application,tests,plugins + +all: static_analysis_summary check_permissions test -all: static_analysis_summary +## +# Docker test adapter +# +# Shaarli sources and vendored libraries are copied from a shared volume +# to a user-owned directory to enable running tests as a non-root user. +## +docker_%: + rsync -az /shaarli/ ~/shaarli/ + cd ~/shaarli && make $* ## # Concise status of the project @@ -21,6 +23,7 @@ all: static_analysis_summary ## static_analysis_summary: code_sniffer_source copy_paste mess_detector_summary + @echo ## # PHP_CodeSniffer @@ -32,6 +35,10 @@ static_analysis_summary: code_sniffer_source copy_paste mess_detector_summary code_sniffer: code_sniffer_full +### - errors filtered by coding standard: PEAR, PSR1, PSR2, Zend... +PHPCS_%: + @$(BIN)/phpcs $(PHP_SOURCE) --report-full --report-width=200 --standard=$* + ### - errors by Git author code_sniffer_blame: @$(BIN)/phpcs $(PHP_SOURCE) --report-gitblame @@ -62,6 +69,7 @@ copy_paste: # Detects PHP syntax errors, sorted by category # Rules documentation: http://phpmd.org/rules/index.html ## +MESS_DETECTOR_RULES = cleancode,codesize,controversial,design,naming,unusedcode mess_title: @echo "-----------------" @@ -70,11 +78,11 @@ mess_title: ### - all warnings mess_detector: mess_title - @$(BIN)/phpmd $(PHP_SOURCE) text $(MESS_DETECTOR_RULES) | sed 's_.*\/__' + @$(BIN)/phpmd $(PHP_COMMA_SOURCE) text $(MESS_DETECTOR_RULES) | sed 's_.*\/__' ### - all warnings + HTML output contains links to PHPMD's documentation mess_detector_html: - @$(BIN)/phpmd $(PHP_SOURCE) html $(MESS_DETECTOR_RULES) \ + @$(BIN)/phpmd $(PHP_COMMA_SOURCE) html $(MESS_DETECTOR_RULES) \ --reportfile phpmd.html || exit 0 ### - warnings grouped by message, sorted by descending frequency order @@ -85,20 +93,137 @@ mess_detector_grouped: mess_title ### - summary: number of warnings by rule set mess_detector_summary: mess_title @for rule in $$(echo $(MESS_DETECTOR_RULES) | tr ',' ' '); do \ - warnings=$$($(BIN)/phpmd $(PHP_SOURCE) text $$rule | wc -l); \ + warnings=$$($(BIN)/phpmd $(PHP_COMMA_SOURCE) text $$rule | wc -l); \ printf "$$warnings\t$$rule\n"; \ done; +## +# Checks source file & script permissions +## +check_permissions: + @echo "----------------------" + @echo "Check file permissions" + @echo "----------------------" + @for file in `git ls-files | grep -v docker`; do \ + if [ -x $$file ]; then \ + errors=true; \ + echo "$${file} is executable"; \ + fi \ + done; [ -z $$errors ] || false + +## +# PHPUnit +# Runs unitary and functional tests +# Generates an HTML coverage report if Xdebug is enabled +# +# See phpunit.xml for configuration +# https://phpunit.de/manual/current/en/appendixes.configuration.html +## +test: translate + @echo "-------" + @echo "PHPUNIT" + @echo "-------" + @mkdir -p sandbox coverage + @$(BIN)/phpunit --coverage-php coverage/main.cov --bootstrap tests/bootstrap.php --testsuite unit-tests + +locale_test_%: + @UT_LOCALE=$*.utf8 \ + $(BIN)/phpunit \ + --coverage-php coverage/$(firstword $(subst _, ,$*)).cov \ + --bootstrap tests/languages/bootstrap.php \ + --testsuite language-$(firstword $(subst _, ,$*)) + +all_tests: test locale_test_de_DE locale_test_en_US locale_test_fr_FR + @$(BIN)/phpcov merge --html coverage coverage + @# --text doesn't work with phpunit 4.* (v5 requires PHP 5.6) + @#$(BIN)/phpcov merge --text coverage/txt coverage + +## +# Custom release archive generation +# +# For each tagged revision, GitHub provides tar and zip archives that correspond +# to the output of git-archive +# +# These targets produce similar archives, featuring 3rd-party dependencies +# to ease deployment on shared hosting. +## +ARCHIVE_VERSION := shaarli-$$(git describe)-full +ARCHIVE_PREFIX=Shaarli/ + +release_archive: release_tar release_zip + +### download 3rd-party PHP libraries +composer_dependencies: clean + composer install --no-dev --prefer-dist + find vendor/ -name ".git" -type d -exec rm -rf {} + + +### download 3rd-party frontend libraries +frontend_dependencies: + yarn install + +### Build frontend dependencies +build_frontend: frontend_dependencies + yarn run build + +### generate a release tarball and include 3rd-party dependencies and translations +release_tar: composer_dependencies htmldoc translate build_frontend + git archive --prefix=$(ARCHIVE_PREFIX) -o $(ARCHIVE_VERSION).tar HEAD + tar rvf $(ARCHIVE_VERSION).tar --transform "s|^vendor|$(ARCHIVE_PREFIX)vendor|" vendor/ + tar rvf $(ARCHIVE_VERSION).tar --transform "s|^doc/html|$(ARCHIVE_PREFIX)doc/html|" doc/html/ + tar rvf $(ARCHIVE_VERSION).tar --transform "s|^tpl|$(ARCHIVE_PREFIX)tpl|" tpl/ + gzip $(ARCHIVE_VERSION).tar + +### generate a release zip and include 3rd-party dependencies and translations +release_zip: composer_dependencies htmldoc translate build_frontend + git archive --prefix=$(ARCHIVE_PREFIX) -o $(ARCHIVE_VERSION).zip -9 HEAD + mkdir -p $(ARCHIVE_PREFIX)/{doc,vendor} + rsync -a doc/html/ $(ARCHIVE_PREFIX)doc/html/ + zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)doc/ + rsync -a vendor/ $(ARCHIVE_PREFIX)vendor/ + zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)vendor/ + rsync -a tpl/ $(ARCHIVE_PREFIX)tpl/ + zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)tpl/ + rm -rf $(ARCHIVE_PREFIX) + ## # Targets for repository and documentation maintenance ## ### remove all unversioned files clean: - @git clean -df - -### update the local copy of the documentation -doc: clean - @rm -rf doc - @git clone https://github.com/shaarli/Shaarli.wiki.git doc - @rm -rf doc/.git + @git clean -df + @rm -rf sandbox + +### generate the AUTHORS file from Git commit information +authors: + @cp .github/mailmap .mailmap + @git shortlog -sne > AUTHORS + @rm .mailmap + +### generate Doxygen documentation +doxygen: clean + @rm -rf doxygen + @doxygen Doxyfile + +### generate HTML documentation from Markdown pages with MkDocs +htmldoc: + python3 -m venv venv/ + bash -c 'source venv/bin/activate; \ + pip install mkdocs; \ + mkdocs build --clean' + find doc/html/ -type f -exec chmod a-x '{}' \; + rm -r venv + + +### Generate Shaarli's translation compiled file (.mo) +translate: + @find inc/languages/ -name shaarli.po -execdir msgfmt shaarli.po -o shaarli.mo \; + +### Run ESLint check against Shaarli's JS files +eslint: + @yarn run eslint -c .dev/.eslintrc.js assets/vintage/js/ + @yarn run eslint -c .dev/.eslintrc.js assets/default/js/ + +### Run CSSLint check against Shaarli's SCSS files +sasslint: + @yarn run sass-lint -c .dev/.sasslintrc 'assets/default/scss/*.scss' -v -q