From ab267ec1bd8104d63c8a58e64fb9c2018f5a5d99 Mon Sep 17 00:00:00 2001 From: Michael Vasseur Date: Sun, 23 Jun 2024 16:31:31 +0200 Subject: [PATCH] Put lib/vendor close to the webapp This simplifies a couple of things. The Makefile targets are now moved to the webapp folder which also make the process easier to read IMO. The option to set the libvendor dir with configure has now also been removed as it lead to issues and we can't think of good usecases for them. Also moved the phpstan files to the webapp folder as we only test code from within that folder which simplifies the config. Also removed some unrelated unused MySQL debugging and refactored the code for the composer test after fixing the tests. --- .github/jobs/baseinstall.sh | 5 +- .github/jobs/composer_setup.sh | 40 +------------ .github/jobs/configure-checks/all.bats | 5 -- .github/jobs/webstandard.sh | 4 +- .github/workflows/codeql-analysis.yml | 4 +- .github/workflows/phpstan.yml | 3 +- Makefile | 59 +++++++------------ README.md | 2 +- configure.ac | 3 - etc/domserver-static.php.in | 20 +++---- gitlab/base.sh | 7 ++- gitlab/ci/template.yml | 4 +- gitlab/unit-tests.sh | 2 +- lib/Makefile | 12 ---- paths.mk.in | 5 +- webapp/Makefile | 47 +++++++++++++-- webapp/bin/console | 4 +- webapp/bin/phpunit | 10 ++-- composer.json => webapp/composer.json | 12 +--- composer.lock => webapp/composer.lock | 0 webapp/config/autoload.php.in | 4 +- webapp/config/static.yaml.in | 2 +- phpstan.dist.neon => webapp/phpstan.dist.neon | 18 +++--- webapp/public/css/bootstrap.min.css | 2 +- webapp/public/css/bootstrap.min.css.map | 2 +- .../public/css/dataTables.bootstrap5.min.css | 2 +- webapp/public/css/fontawesome-all.min.css | 2 +- webapp/public/css/nv.d3.min.css | 2 +- webapp/public/css/nv.d3.min.css.map | 2 +- .../css/select2-bootstrap-5-theme.min.css | 2 +- webapp/public/css/select2.min.css | 2 +- webapp/public/flags | 2 +- webapp/public/index.php | 2 +- webapp/public/js/FileSaver.min.js | 2 +- webapp/public/js/FileSaver.min.js.map | 2 +- webapp/public/js/bootstrap.bundle.min.js | 2 +- webapp/public/js/bootstrap.bundle.min.js.map | 2 +- webapp/public/js/d3.min.js | 2 +- webapp/public/js/dataTables.bootstrap5.min.js | 2 +- webapp/public/js/dataTables.min.js | 2 +- webapp/public/js/jquery.min.js | 2 +- webapp/public/js/nv.d3.min.js | 2 +- webapp/public/js/nv.d3.min.js.map | 2 +- webapp/public/js/select2.min.js | 2 +- webapp/public/webfonts | 2 +- webapp/src/Service/DOMJudgeService.php | 2 +- webapp/tests/bootstrap.php | 2 +- 47 files changed, 139 insertions(+), 181 deletions(-) rename composer.json => webapp/composer.json (94%) rename composer.lock => webapp/composer.lock (100%) rename phpstan.dist.neon => webapp/phpstan.dist.neon (67%) diff --git a/.github/jobs/baseinstall.sh b/.github/jobs/baseinstall.sh index 99848d183b..55fdf0ccf2 100755 --- a/.github/jobs/baseinstall.sh +++ b/.github/jobs/baseinstall.sh @@ -12,7 +12,9 @@ export PHPVERSION section_start "Run composer" export APP_ENV="dev" +cd webapp composer install --no-scripts |tee "$ARTIFACTS"/composer_out.txt +cd .. section_end section_start "Set simple admin password" @@ -58,9 +60,6 @@ section_end section_start "Install DOMjudge database" /opt/domjudge/domserver/bin/dj_setup_database -uroot -proot bare-install -#>> "$ARTIFACTS"/mysql.txt -# We don't have -o pipefail so the `tee` eats away the potential error. -#cat "$ARTIFACTS"/mysql.txt section_end section_start "Show PHP config" diff --git a/.github/jobs/composer_setup.sh b/.github/jobs/composer_setup.sh index 3ab90b3a13..5e5213e42b 100755 --- a/.github/jobs/composer_setup.sh +++ b/.github/jobs/composer_setup.sh @@ -2,44 +2,7 @@ set -eux -# Store artifacts/logs -export ARTIFACTS="/tmp/artifacts" -mkdir -p "$ARTIFACTS" - -# Functions to annotate the Github actions logs -trace_on () { - set -x -} - -trace_off () { - { - set +x - } 2>/dev/null -} - -section_start_internal () { - echo "::group::$1" - trace_on -} - -section_end_internal () { - echo "::endgroup::" - trace_on -} - -section_start () { - if [ "$#" -ne 1 ]; then - echo "Only 1 argument is needed for GHA, 2 was needed for GitLab." - exit 1 - fi - trace_off - section_start_internal "$1" -} - -section_end () { - trace_off - section_end_internal -} +. .github/jobs/ci_settings.sh section_start "Configure PHP" PHPVERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION."\n";') @@ -48,5 +11,6 @@ echo "$PHPVERSION" | tee -a "$ARTIFACTS"/phpversion.txt section_end section_start "Run composer" +cd webapp composer install --no-scripts 2>&1 | tee -a "$ARTIFACTS/composer_log.txt" section_end diff --git a/.github/jobs/configure-checks/all.bats b/.github/jobs/configure-checks/all.bats index 6536f6778f..630773158c 100755 --- a/.github/jobs/configure-checks/all.bats +++ b/.github/jobs/configure-checks/all.bats @@ -231,7 +231,6 @@ compile_assertions_finished () { assert_line " - bin..............: /opt/domjudge/domserver/bin" assert_line " - etc..............: /opt/domjudge/domserver/etc" assert_line " - lib..............: /opt/domjudge/domserver/lib" - assert_line " - libvendor........: /opt/domjudge/domserver/lib/vendor" assert_line " - log..............: /opt/domjudge/domserver/log" assert_line " - run..............: /opt/domjudge/domserver/run" assert_line " - sql..............: /opt/domjudge/domserver/sql" @@ -257,7 +256,6 @@ compile_assertions_finished () { refute_line " * documentation.......: /opt/domjudge/doc" refute_line " * domserver...........: /opt/domjudge/domserver" refute_line " - bin..............: /opt/domjudge/domserver/bin" - refute_line " - libvendor........: /opt/domjudge/domserver/lib/vendor" refute_line " - tmp..............: /opt/domjudge/domserver/tmp" refute_line " - example_problems.: /opt/domjudge/domserver/example_problems" refute_line " * judgehost...........: /opt/domjudge/judgehost" @@ -269,7 +267,6 @@ compile_assertions_finished () { assert_line " * prefix..............: /tmp" assert_line " * documentation.......: /tmp/doc" assert_line " * domserver...........: /tmp/domserver" - assert_line " - libvendor........: /tmp/domserver/lib/vendor" assert_line " * judgehost...........: /tmp/judgehost" assert_line " - judge............: /tmp/judgehost/judgings" } @@ -291,7 +288,6 @@ compile_assertions_finished () { assert_line " - bin..............: /usr/local/bin" assert_line " - etc..............: /usr/local/etc/domjudge" assert_line " - lib..............: /usr/local/lib/domjudge" - assert_line " - libvendor........: /usr/local/lib/domjudge/vendor" assert_line " - log..............: /usr/local/var/log/domjudge" assert_line " - run..............: /usr/local/var/run/domjudge" assert_line " - sql..............: /usr/local/share/domjudge/sql" @@ -319,7 +315,6 @@ compile_assertions_finished () { assert_line " - bin..............: /usr/local/bin" assert_line " - etc..............: /usr/local/etc/domjudge" assert_line " - lib..............: /usr/local/lib/domjudge" - assert_line " - libvendor........: /usr/local/lib/domjudge/vendor" assert_line " - log..............: /usr/local/var/log/domjudge" assert_line " - run..............: /usr/local/var/run/domjudge" assert_line " - sql..............: /usr/local/share/domjudge/sql" diff --git a/.github/jobs/webstandard.sh b/.github/jobs/webstandard.sh index 5056930e9a..69f2191dd2 100755 --- a/.github/jobs/webstandard.sh +++ b/.github/jobs/webstandard.sh @@ -109,7 +109,7 @@ if [ "$TEST" = "w3cval" ]; then unzip -q vnu.linux.zip section_end - FLTR='--filterpattern .*autocomplete.*|.*style.*|.*role=tab.*|.*descendant.*|.*Stray.*|.*attribute.*|.*Forbidden.*|.*stream.*' + FLTR='--filterpattern .*autocomplete.*|.*style.*|.*role=tab.*|.*descendant.*|.*Stray.*|.*attribute.*|.*Forbidden.*|.*stream.*|.*obsolete.*' for typ in html css svg do section_start "Analyse with $typ" @@ -133,7 +133,7 @@ else else STAN="-s $TEST" FLTR0="-E '#DataTables_Table_0 > tbody > tr > td > a','#menuDefault > a','#filter-card > div > div > div > span > span:nth-child(1) > span > ul > li > input',.problem-badge" - FLTR1="'html > body > div > div > div > div > div > div > table > tbody > tr > td > a > span'" + FLTR1="'html > body > div > div > div > div > div > div > table > tbody > tr > td > a > span','html > body > div > div > div > div > div > div > form > div > div > div > label'" FLTR="$FLTR0,$FLTR1" fi chown -R domjudge:domjudge "$DIR" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index fa9dc43c80..645826c186 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,9 @@ jobs: - name: Install composer files if: ${{ contains(env.COMPILED, matrix.language) }} - run: composer install --no-scripts + run: | + cd webapp + composer install --no-scripts - name: Configure Makefile if: ${{ contains(env.COMPILED, matrix.language) }} diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 775c3b2f8f..b5772ef711 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -18,9 +18,10 @@ jobs: run: .github/jobs/composer_setup.sh - uses: php-actions/phpstan@v3 with: - configuration: phpstan.dist.neon + configuration: webapp/phpstan.dist.neon path: webapp/src webapp/tests php_extensions: gd intl mysqli pcntl zip + autoload_file: webapp/vendor/autoload.php - uses: actions/upload-artifact@v4 if: always() with: diff --git a/Makefile b/Makefile index 1f8bea7047..f08ee4030d 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,8 @@ export TOPDIR = $(shell pwd) REC_TARGETS=build domserver install-domserver judgehost install-judgehost \ - docs install-docs inplace-install inplace-uninstall + docs install-docs inplace-install inplace-uninstall maintainer-conf \ + composer-dependencies composer-dependencies-dev # Global Makefile definitions include $(TOPDIR)/Makefile.global @@ -64,21 +65,6 @@ ifneq "$(JUDGEHOST_BUILD_ENABLED)" "yes" @exit 1 endif -# Install PHP dependencies -composer-dependencies: -ifeq (, $(shell command -v composer 2> /dev/null)) - $(error "'composer' command not found in $(PATH), install it via your package manager or https://getcomposer.org/download/") -endif -# We use --no-scripts here because at this point the autoload.php file is -# not generated yet, which is needed to run the post-install scripts. - composer $(subst 1,-q,$(QUIET)) install --prefer-dist -o -a --no-scripts --no-plugins - -composer-dependencies-dev: - composer $(subst 1,-q,$(QUIET)) install --prefer-dist --no-scripts --no-plugins - -composer-dump-autoload-dev: - composer $(subst 1,-q,$(QUIET)) dump-autoload - # Generate documentation for distribution. Remove this dependency from # dist above for quicker building from git sources. distdocs: @@ -94,19 +80,23 @@ build-scripts: $(MAKE) -C sql build-scripts # List of SUBDIRS for recursive targets: -build: SUBDIRS= lib misc-tools -domserver: SUBDIRS=etc lib sql misc-tools webapp -install-domserver: SUBDIRS=etc lib sql misc-tools webapp example_problems -judgehost: SUBDIRS=etc judge misc-tools -install-judgehost: SUBDIRS=etc lib judge misc-tools -docs: SUBDIRS= doc -install-docs: SUBDIRS= doc -inplace-install: SUBDIRS= doc misc-tools -inplace-uninstall: SUBDIRS= doc misc-tools -dist: SUBDIRS= lib sql misc-tools -clean: SUBDIRS=etc doc lib sql judge misc-tools webapp -distclean: SUBDIRS=etc doc lib sql judge misc-tools webapp -maintainer-clean: SUBDIRS=etc doc lib sql judge misc-tools webapp +build: SUBDIRS= lib misc-tools +domserver: SUBDIRS=etc sql misc-tools webapp +install-domserver: SUBDIRS=etc lib sql misc-tools webapp example_problems +judgehost: SUBDIRS=etc judge misc-tools +install-judgehost: SUBDIRS=etc lib judge misc-tools +docs: SUBDIRS= doc +install-docs: SUBDIRS= doc +maintainer-conf: SUBDIRS= webapp +maintainer-install: SUBDIRS= webapp +inplace-install: SUBDIRS= doc misc-tools webapp +inplace-uninstall: SUBDIRS= doc misc-tools +dist: SUBDIRS= lib sql misc-tools +clean: SUBDIRS=etc doc lib sql judge misc-tools webapp +distclean: SUBDIRS=etc doc lib sql judge misc-tools webapp +maintainer-clean: SUBDIRS=etc doc lib sql judge misc-tools webapp +composer-dependencies: SUBDIRS= webapp +composer-dependencies-dev: SUBDIRS= webapp domserver-create-dirs: $(INSTALL_DIR) $(addprefix $(DESTDIR),$(domserver_dirs)) @@ -187,7 +177,7 @@ paths.mk: @exit 1 # Configure for running in source tree, not meant for normal use: -maintainer-conf: inplace-conf-common composer-dependencies-dev webapp/.env.local +maintainer-conf: inplace-conf-common composer-dependencies-dev inplace-conf: inplace-conf-common composer-dependencies inplace-conf-common: dist ./configure $(subst 1,-q,$(QUIET)) --prefix=$(CURDIR) \ @@ -205,13 +195,6 @@ inplace-conf-common: dist --with-baseurl='http://localhost/domjudge/' \ $(CONFIGURE_FLAGS) -# Run Symfony in dev mode (for maintainer-mode): -webapp/.env.local: - @echo "Creating file '$@'..." - @echo "# This file was automatically created by 'make maintainer-conf' to run" > $@ - @echo "# the DOMjudge Symfony application in developer mode. Adjust as needed." >> $@ - @echo "APP_ENV=dev" >> $@ - # Install the system in place: don't really copy stuff, but create # symlinks where necessary to let it work from the source tree. # This stuff is a hack! @@ -233,8 +216,6 @@ inplace-install-l: # because judgehost-create-dirs sets wrong permissions: $(MKDIR_P) $(domserver_tmpdir) chmod a+rwx $(domserver_tmpdir) -# Make sure we're running from a clean state: - composer auto-scripts @echo "" @echo "========== Maintainer Install Completed ==========" @echo "" diff --git a/README.md b/README.md index d754d04975..e86c74860d 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ The M4 autoconf macros are licensed under all-permissive and GPL3+ licences; see the respective files under m4/ for details. The DOMjudge tarball ships external library dependencies in the -lib/vendor directory. These are covered by their individual licenses +webapp/vendor directory. These are covered by their individual licenses as specified in the file composer.lock. Contact diff --git a/configure.ac b/configure.ac index 1f7705f0a4..4ad0dd743d 100644 --- a/configure.ac +++ b/configure.ac @@ -170,7 +170,6 @@ if test "x$FHS_ENABLED" = xyes ; then AC_SUBST(domserver_webappdir, $datadir/${PACKAGE_TARNAME}/webapp) AC_SUBST(domserver_sqldir, $datadir/${PACKAGE_TARNAME}/sql) AC_SUBST(domserver_libdir, $libdir/${PACKAGE_TARNAME}) - AC_SUBST(domserver_libvendordir, $libdir/${PACKAGE_TARNAME}/vendor) AC_SUBST(domserver_logdir, $localstatedir/log/${PACKAGE_TARNAME}) AC_SUBST(domserver_rundir, $localstatedir/run/${PACKAGE_TARNAME}) AC_SUBST(domserver_tmpdir, /tmp) @@ -222,7 +221,6 @@ AX_PATH(domserver_etcdir, [$domserver_root/etc]) AX_PATH(domserver_webappdir, [$domserver_root/webapp]) AX_PATH(domserver_sqldir, [$domserver_root/sql]) AX_PATH(domserver_libdir, [$domserver_root/lib]) -AX_PATH(domserver_libvendordir, [$domserver_root/lib/vendor]) AX_PATH(domserver_logdir, [$domserver_root/log]) AX_PATH(domserver_rundir, [$domserver_root/run]) AX_PATH(domserver_tmpdir, [$domserver_root/tmp]) @@ -382,7 +380,6 @@ echo " * domserver...........: AX_VAR_EXPAND($domserver_root)" echo " - bin..............: AX_VAR_EXPAND($domserver_bindir)" echo " - etc..............: AX_VAR_EXPAND($domserver_etcdir)" echo " - lib..............: AX_VAR_EXPAND($domserver_libdir)" -echo " - libvendor........: AX_VAR_EXPAND($domserver_libvendordir)" echo " - log..............: AX_VAR_EXPAND($domserver_logdir)" echo " - run..............: AX_VAR_EXPAND($domserver_rundir)" echo " - sql..............: AX_VAR_EXPAND($domserver_sqldir)" diff --git a/etc/domserver-static.php.in b/etc/domserver-static.php.in index 4181309167..68967266b4 100644 --- a/etc/domserver-static.php.in +++ b/etc/domserver-static.php.in @@ -7,14 +7,14 @@ define('DOMJUDGE_VERSION', '@DOMJUDGE_VERSION@'); -define('BINDIR', '@domserver_bindir@'); -define('ETCDIR', '@domserver_etcdir@'); -define('WEBAPPDIR', '@domserver_webappdir@'); -define('LIBDIR', '@domserver_libdir@'); -define('SQLDIR', '@domserver_sqldir@'); -define('LIBVENDORDIR','@domserver_libvendordir@'); -define('LOGDIR', '@domserver_logdir@'); -define('RUNDIR', '@domserver_rundir@'); -define('TMPDIR', '@domserver_tmpdir@'); +define('BINDIR', '@domserver_bindir@'); +define('ETCDIR', '@domserver_etcdir@'); +define('WEBAPPDIR', '@domserver_webappdir@'); +define('LIBDIR', '@domserver_libdir@'); +define('SQLDIR', '@domserver_sqldir@'); +define('VENDORDIR', '@domserver_webappdir@/vendor'); +define('LOGDIR', '@domserver_logdir@'); +define('RUNDIR', '@domserver_rundir@'); +define('TMPDIR', '@domserver_tmpdir@'); -define('BASEURL', '@BASEURL@'); +define('BASEURL', '@BASEURL@'); diff --git a/gitlab/base.sh b/gitlab/base.sh index 00cdfb3576..a07f026d5b 100755 --- a/gitlab/base.sh +++ b/gitlab/base.sh @@ -48,21 +48,24 @@ parameters: domjudge.webappdir: /webapp domjudge.libdir: /lib domjudge.sqldir: /sql - domjudge.libvendordir: /lib/vendor + domjudge.vendordir: /webapp/vendor domjudge.logdir: /output/log domjudge.rundir: /output/run domjudge.tmpdir: /output/tmp domjudge.baseurl: http://localhost/domjudge EOF +# Composer steps +cd webapp # install check if the cache might be dirty set +e -composer install --no-scripts || rm -rf lib/vendor +composer install --no-scripts || rm -rf vendor set -e # install all php dependencies composer install --no-scripts echo -e "\033[0m" +cd $DIR # configure, make and install (but skip documentation) make configure diff --git a/gitlab/ci/template.yml b/gitlab/ci/template.yml index 311a71d6e6..ef9270b500 100644 --- a/gitlab/ci/template.yml +++ b/gitlab/ci/template.yml @@ -27,9 +27,9 @@ .cached_vendor: extends: [.clean_ordering] cache: - key: libvendor-260522 + key: webappvendor-20240623 paths: - - lib/vendor/ + - webapp/vendor/ .mysql_job: script: diff --git a/gitlab/unit-tests.sh b/gitlab/unit-tests.sh index ccdcb8dabf..26bdd761ec 100755 --- a/gitlab/unit-tests.sh +++ b/gitlab/unit-tests.sh @@ -20,7 +20,7 @@ echo "UPDATE user SET teamid = 1 WHERE userid = 1;" | mysql domjudge_test cp webapp/.env.test /opt/domjudge/domserver/webapp/ # We also need the composer.json for PHPunit to detect the correct directory. -cp composer.json /opt/domjudge/domserver/ +cp webapp/composer.json /opt/domjudge/domserver/webapp/ cd /opt/domjudge/domserver diff --git a/lib/Makefile b/lib/Makefile index 24cd0f82de..397308c400 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -15,21 +15,9 @@ $(OBJECTS): %$(OBJEXT): %.c %.h clean-l: rm -f $(OBJECTS) -# Change baseDir in composer autogenerated files -define fix_composer_paths - for file in autoload_psr4.php autoload_classmap.php autoload_files.php autoload_namespaces.php ; do \ - sed -i "s#^\$$baseDir = .*#\$$baseDir = dirname('$(domserver_webappdir)');#" $(1)/composer/$$file ; \ - done - sed -i "s#__DIR__ \. '/\.\./\.\./\.\.' \. '/webapp#'$(domserver_webappdir)#" $(1)/composer/autoload_static.php -endef - install-domserver: $(INSTALL_DATA) -t $(DESTDIR)$(domserver_libdir) *.php $(INSTALL_PROG) -t $(DESTDIR)$(domserver_libdir) alert - for i in vendor/* ; do \ - $(call install_tree,$(DESTDIR)$(domserver_libvendordir),$$i) ; \ - done - $(call fix_composer_paths,$(DESTDIR)$(domserver_libvendordir)) install-judgehost: $(INSTALL_DATA) -t $(DESTDIR)$(judgehost_libdir) *.php *.sh diff --git a/paths.mk.in b/paths.mk.in index a4f89b12f1..be51100deb 100644 --- a/paths.mk.in +++ b/paths.mk.in @@ -86,7 +86,6 @@ domserver_etcdir = @domserver_etcdir@ domserver_webappdir = @domserver_webappdir@ domserver_sqldir = @domserver_sqldir@ domserver_libdir = @domserver_libdir@ -domserver_libvendordir = @domserver_libvendordir@ domserver_logdir = @domserver_logdir@ domserver_rundir = @domserver_rundir@ domserver_tmpdir = @domserver_tmpdir@ @@ -111,8 +110,7 @@ systemd_unitdir = @systemd_unitdir@ # The tmpdir's are not in these lists, since they would otherwise get # their permissions overwritten in FHS install mode. domserver_dirs = $(domserver_bindir) $(domserver_etcdir) \ - $(domserver_libdir) $(domserver_libvendordir) \ - $(domserver_logdir) $(domserver_rundir) \ + $(domserver_libdir) $(domserver_logdir) $(domserver_rundir) \ $(addprefix $(domserver_webappdir)/public/images/,affiliations countries teams) \ $(domserver_exampleprobdir) $(domserver_databasedumpdir) @@ -137,7 +135,6 @@ define substconfigvars -e 's,@domserver_webappdir[@],@domserver_webappdir@,g' \ -e 's,@domserver_sqldir[@],@domserver_sqldir@,g' \ -e 's,@domserver_libdir[@],@domserver_libdir@,g' \ - -e 's,@domserver_libvendordir[@],@domserver_libvendordir@,g' \ -e 's,@domserver_logdir[@],@domserver_logdir@,g' \ -e 's,@domserver_rundir[@],@domserver_rundir@,g' \ -e 's,@domserver_tmpdir[@],@domserver_tmpdir@,g' \ diff --git a/webapp/Makefile b/webapp/Makefile index 37f9f6829f..e5a2393266 100644 --- a/webapp/Makefile +++ b/webapp/Makefile @@ -9,21 +9,39 @@ include $(TOPDIR)/Makefile.global # Subdirectories to recurse into for REC_TARGETS SUBDIRS = config +maintainer-conf: .env.local + +# Run Symfony in dev mode (for maintainer-mode): +.env.local: + @echo "Creating file '$@'..." + @echo "# This file was automatically created by 'make maintainer-conf' to run" > $@ + @echo "# the DOMjudge Symfony application in developer mode. Adjust as needed." >> $@ + @echo "APP_ENV=dev" >> $@ + +# Dump autoload dependencies (including plugins) +# This is needed since symfony/runtime is a Composer plugin that runs while dumping +# the autoload file +composer-dump-autoload: + composer $(subst 1,-q,$(QUIET)) dump-autoload -o -a + +composer-dump-autoload-dev: + composer $(subst 1,-q,$(QUIET)) dump-autoload + copy-bundle-assets: # We can not use bin/console here, as when using a fakeroot, # the include paths are broken. We just copy in the data we need -rm -rf public/bundles/nelmioapidoc mkdir -p public/bundles/nelmioapidoc - cp -R ../lib/vendor/nelmio/api-doc-bundle/public/* public/bundles/nelmioapidoc/ + cp -R ../webapp/vendor/nelmio/api-doc-bundle/public/* public/bundles/nelmioapidoc/ clean-l: -rm -rf public/bundles/nelmioapidoc -install-domserver: +install-domserver: composer-dump-autoload # This must be done first to install with the rest. $(MAKE) copy-bundle-assets $(INSTALL_DIR) $(DESTDIR)$(domserver_webappdir); - for d in bin config migrations public resources src templates tests ; do \ + for d in bin config migrations public resources src templates tests vendor; do \ $(call install_tree,$(DESTDIR)$(domserver_webappdir),$$d) ; \ done # Change webapp/public/doc symlink @@ -32,14 +50,33 @@ install-domserver: # Now change all relative symlinks in webapp/public to their correct paths for link in $$(find $(DESTDIR)$(domserver_webappdir)/public/$$dir -maxdepth 2 -type l); do \ target=$$(readlink $$link) ; \ - if echo $${target} | grep -q '\.\./\.\./lib/vendor' ; then \ + if echo $${target} | grep -q '\.\./\.\./webapp/vendor' ; then \ rm $$link ; \ - realtarget=$(domserver_libvendordir)$$(echo $${target} | sed 's!^.*\.\./\.\./lib/vendor!!') ; \ + realtarget=$(domserver_webappdir)/vendor$$(echo $${target} | sed 's!^.*\.\./\.\./webapp/vendor!!') ; \ ln -s $$realtarget $$link ; \ fi \ done $(INSTALL_DATA) -t $(DESTDIR)$(domserver_webappdir) phpunit.xml.dist .env +inplace-install: composer-autoclean composer-dump-autoload +maintainer-install: composer-dump-autoload-dev + +# Install PHP dependencies +composer-dependencies: +ifeq (, $(shell command -v composer 2> /dev/null)) + $(error "'composer' command not found in $(PATH), install it via your package manager or https://getcomposer.org/download/") +endif +# We use --no-scripts here because at this point the autoload.php file is +# not generated yet, which is needed to run the post-install scripts. + composer $(subst 1,-q,$(QUIET)) install --prefer-dist -o -a --no-scripts --no-plugins + +composer-dependencies-dev: + composer $(subst 1,-q,$(QUIET)) install --prefer-dist --no-scripts --no-plugins + +composer-autoclean: + # Make sure we're running from a clean state: + composer auto-scripts + maintainer-clean-l: -for d in cache log ; do \ for t in dev prod ; do \ diff --git a/webapp/bin/console b/webapp/bin/console index 87a4a429ed..9c5528985c 100755 --- a/webapp/bin/console +++ b/webapp/bin/console @@ -4,11 +4,11 @@ use App\Kernel; use Symfony\Bundle\FrameworkBundle\Console\Application; -if (!is_file(dirname(__DIR__, 2) . '/lib/vendor/autoload_runtime.php')) { +if (!is_file(dirname(__DIR__, 2) . '/webapp/vendor/autoload_runtime.php')) { throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".'); } -require_once dirname(__DIR__, 2) . '/lib/vendor/autoload_runtime.php'; +require_once dirname(__DIR__, 2) . '/webapp/vendor/autoload_runtime.php'; require_once dirname(__DIR__) . '/config/load_db_secrets.php'; set_time_limit(0); diff --git a/webapp/bin/phpunit b/webapp/bin/phpunit index ebac76f857..5c0103facc 100755 --- a/webapp/bin/phpunit +++ b/webapp/bin/phpunit @@ -5,20 +5,20 @@ if (!ini_get('date.timezone')) { ini_set('date.timezone', 'UTC'); } -if (is_file(dirname(__DIR__, 2) . '/lib/vendor/phpunit/phpunit/phpunit')) { +if (is_file(dirname(__DIR__, 2) . '/webapp/vendor/phpunit/phpunit/phpunit')) { if (PHP_VERSION_ID >= 80000) { - require dirname(__DIR__, 2) . '/lib/vendor/phpunit/phpunit/phpunit'; + require dirname(__DIR__, 2) . '/webapp/vendor/phpunit/phpunit/phpunit'; } else { - define('PHPUNIT_COMPOSER_INSTALL', dirname(__DIR__, 2) . '/lib/vendor/autoload.php'); + define('PHPUNIT_COMPOSER_INSTALL', dirname(__DIR__, 2) . '/webapp/vendor/autoload.php'); require PHPUNIT_COMPOSER_INSTALL; PHPUnit\TextUI\Command::main(); } } else { if (!is_file(dirname(__DIR__, - 2) . '/lib/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) { + 2) . '/webapp/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) { echo "Unable to find the `simple-phpunit.php` script in `vendor/symfony/phpunit-bridge/bin/`.\n"; exit(1); } - require dirname(__DIR__, 2) . '/lib/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php'; + require dirname(__DIR__, 2) . '/webapp/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php'; } diff --git a/composer.json b/webapp/composer.json similarity index 94% rename from composer.json rename to webapp/composer.json index 1c0bdebf8f..124580fc0a 100644 --- a/composer.json +++ b/webapp/composer.json @@ -125,15 +125,15 @@ }, "autoload": { "psr-4": { - "App\\": "webapp/src/" + "App\\": "src/" }, "files": [ - "webapp/resources/functions.php" + "resources/functions.php" ] }, "autoload-dev": { "psr-4": { - "App\\Tests\\": "webapp/tests/" + "App\\Tests\\": "tests/" } }, "config": { @@ -144,8 +144,6 @@ "platform": { "php": "8.1.0" }, - "vendor-dir": "lib/vendor", - "component-dir": "lib/vendor/components", "allow-plugins": { "composer/package-versions-deprecated": true, "symfony/flex": true, @@ -178,12 +176,8 @@ }, "extra": { "symfony": { - "root-dir": "webapp/", "allow-contrib": true, "require": "6.4.*" - }, - "runtime": { - "dotenv_path": "webapp/.env" } } } diff --git a/composer.lock b/webapp/composer.lock similarity index 100% rename from composer.lock rename to webapp/composer.lock diff --git a/webapp/config/autoload.php.in b/webapp/config/autoload.php.in index 5e3601f839..30aaf65bc6 100644 --- a/webapp/config/autoload.php.in +++ b/webapp/config/autoload.php.in @@ -12,8 +12,8 @@ use Doctrine\Common\Annotations\AnnotationRegistry; use Composer\Autoload\ClassLoader; // Load the static domserver file if we don't have the constants from it yet -if (!defined('LIBVENDORDIR')) { +if (!defined('VENDORDIR')) { require('@domserver_etcdir@/domserver-static.php'); } -return require LIBVENDORDIR.'/autoload.php'; +return require VENDORDIR.'/autoload.php'; diff --git a/webapp/config/static.yaml.in b/webapp/config/static.yaml.in index 26983977e6..0a5057aa37 100644 --- a/webapp/config/static.yaml.in +++ b/webapp/config/static.yaml.in @@ -7,7 +7,7 @@ parameters: domjudge.webappdir: @domserver_webappdir@ domjudge.libdir: @domserver_libdir@ domjudge.sqldir: @domserver_sqldir@ - domjudge.libvendordir: @domserver_libvendordir@ + domjudge.vendordir: @domserver_webappdir@/vendor domjudge.logdir: @domserver_logdir@ domjudge.rundir: @domserver_rundir@ domjudge.tmpdir: @domserver_tmpdir@ diff --git a/phpstan.dist.neon b/webapp/phpstan.dist.neon similarity index 67% rename from phpstan.dist.neon rename to webapp/phpstan.dist.neon index 531ebea2c1..52c70905c5 100644 --- a/phpstan.dist.neon +++ b/webapp/phpstan.dist.neon @@ -1,25 +1,25 @@ parameters: level: 6 paths: - - webapp/src - - webapp/tests + - src + - tests excludePaths: - - webapp/src/Utils/Adminer.php + - src/Utils/Adminer.php ignoreErrors: - message: '#Method .* return type has no value type specified in iterable type array#' - path: webapp/tests + path: tests - message: '#Method .* has parameter .* with no value type specified in iterable type array#' - path: webapp/tests + path: tests - message: '#Property .* type has no value type specified in iterable type array#' - path: webapp/tests + path: tests - message: '#PHPDoc tag @var for variable .* has no value type specified in iterable type array#' - path: webapp/tests + path: tests - message: "#Method .* return type has no value type specified in iterable type array#" - path: webapp/src/DataFixtures/Test + path: src/DataFixtures/Test includes: - - lib/vendor/phpstan/phpstan-doctrine/extension.neon + - vendor/phpstan/phpstan-doctrine/extension.neon diff --git a/webapp/public/css/bootstrap.min.css b/webapp/public/css/bootstrap.min.css index d380a3793c..fa68530566 120000 --- a/webapp/public/css/bootstrap.min.css +++ b/webapp/public/css/bootstrap.min.css @@ -1 +1 @@ -../../../lib/vendor/twbs/bootstrap/dist/css/bootstrap.min.css \ No newline at end of file +../../../webapp/vendor/twbs/bootstrap/dist/css/bootstrap.min.css \ No newline at end of file diff --git a/webapp/public/css/bootstrap.min.css.map b/webapp/public/css/bootstrap.min.css.map index cef2026e83..3d87f0fe07 120000 --- a/webapp/public/css/bootstrap.min.css.map +++ b/webapp/public/css/bootstrap.min.css.map @@ -1 +1 @@ -../../../lib/vendor/twbs/bootstrap/dist/css/bootstrap.min.css.map \ No newline at end of file +../../../webapp/vendor/twbs/bootstrap/dist/css/bootstrap.min.css.map \ No newline at end of file diff --git a/webapp/public/css/dataTables.bootstrap5.min.css b/webapp/public/css/dataTables.bootstrap5.min.css index ed9929d74d..77167b8859 120000 --- a/webapp/public/css/dataTables.bootstrap5.min.css +++ b/webapp/public/css/dataTables.bootstrap5.min.css @@ -1 +1 @@ -../../../lib/vendor/datatables.net/datatables.net-bs5/css/dataTables.bootstrap5.min.css \ No newline at end of file +../../../webapp/vendor/datatables.net/datatables.net-bs5/css/dataTables.bootstrap5.min.css \ No newline at end of file diff --git a/webapp/public/css/fontawesome-all.min.css b/webapp/public/css/fontawesome-all.min.css index d07e91bcd3..ffde6faef1 120000 --- a/webapp/public/css/fontawesome-all.min.css +++ b/webapp/public/css/fontawesome-all.min.css @@ -1 +1 @@ -../../../lib/vendor/fortawesome/font-awesome/css/all.min.css \ No newline at end of file +../../../webapp/vendor/fortawesome/font-awesome/css/all.min.css \ No newline at end of file diff --git a/webapp/public/css/nv.d3.min.css b/webapp/public/css/nv.d3.min.css index 51a5208376..56d338a6bc 120000 --- a/webapp/public/css/nv.d3.min.css +++ b/webapp/public/css/nv.d3.min.css @@ -1 +1 @@ -../../../lib/vendor/novus/nvd3/build/nv.d3.min.css \ No newline at end of file +../../../webapp/vendor/novus/nvd3/build/nv.d3.min.css \ No newline at end of file diff --git a/webapp/public/css/nv.d3.min.css.map b/webapp/public/css/nv.d3.min.css.map index 3a322fb470..fa5cbf0a6d 120000 --- a/webapp/public/css/nv.d3.min.css.map +++ b/webapp/public/css/nv.d3.min.css.map @@ -1 +1 @@ -../../../lib/vendor/novus/nvd3/build/nv.d3.min.css.map \ No newline at end of file +../../../webapp/vendor/novus/nvd3/build/nv.d3.min.css.map \ No newline at end of file diff --git a/webapp/public/css/select2-bootstrap-5-theme.min.css b/webapp/public/css/select2-bootstrap-5-theme.min.css index 407fb9f5f9..fc2433cf4b 120000 --- a/webapp/public/css/select2-bootstrap-5-theme.min.css +++ b/webapp/public/css/select2-bootstrap-5-theme.min.css @@ -1 +1 @@ -../../../lib/vendor/apalfrey/select2-bootstrap-5-theme/dist/select2-bootstrap-5-theme.min.css \ No newline at end of file +../../../webapp/vendor/apalfrey/select2-bootstrap-5-theme/dist/select2-bootstrap-5-theme.min.css \ No newline at end of file diff --git a/webapp/public/css/select2.min.css b/webapp/public/css/select2.min.css index 2eda641b12..01a4127a40 120000 --- a/webapp/public/css/select2.min.css +++ b/webapp/public/css/select2.min.css @@ -1 +1 @@ -../../../lib/vendor/select2/select2/dist/css/select2.min.css \ No newline at end of file +../../../webapp/vendor/select2/select2/dist/css/select2.min.css \ No newline at end of file diff --git a/webapp/public/flags b/webapp/public/flags index 1dde7d80c9..be0ef4207a 120000 --- a/webapp/public/flags +++ b/webapp/public/flags @@ -1 +1 @@ -../../lib/vendor/components/flag-icon-css/flags \ No newline at end of file +../../webapp/vendor/components/flag-icon-css/flags \ No newline at end of file diff --git a/webapp/public/index.php b/webapp/public/index.php index dccc8f0ae8..dcf7df44c9 100644 --- a/webapp/public/index.php +++ b/webapp/public/index.php @@ -2,7 +2,7 @@ use App\Kernel; -require_once dirname(__DIR__, 2) . '/lib/vendor/autoload_runtime.php'; +require_once dirname(__DIR__, 2) . '/webapp/vendor/autoload_runtime.php'; require_once dirname(__DIR__) . '/config/load_db_secrets.php'; return function (array $context) { diff --git a/webapp/public/js/FileSaver.min.js b/webapp/public/js/FileSaver.min.js index db9159a068..bd8e875fc5 120000 --- a/webapp/public/js/FileSaver.min.js +++ b/webapp/public/js/FileSaver.min.js @@ -1 +1 @@ -../../../lib/vendor/eligrey/filesaver/dist/FileSaver.min.js \ No newline at end of file +../../../webapp/vendor/eligrey/filesaver/dist/FileSaver.min.js \ No newline at end of file diff --git a/webapp/public/js/FileSaver.min.js.map b/webapp/public/js/FileSaver.min.js.map index 587c5cbaa6..1243f31bd8 120000 --- a/webapp/public/js/FileSaver.min.js.map +++ b/webapp/public/js/FileSaver.min.js.map @@ -1 +1 @@ -../../../lib/vendor/eligrey/filesaver/dist/FileSaver.min.js.map \ No newline at end of file +../../../webapp/vendor/eligrey/filesaver/dist/FileSaver.min.js.map \ No newline at end of file diff --git a/webapp/public/js/bootstrap.bundle.min.js b/webapp/public/js/bootstrap.bundle.min.js index a0994828bc..032894a5a4 120000 --- a/webapp/public/js/bootstrap.bundle.min.js +++ b/webapp/public/js/bootstrap.bundle.min.js @@ -1 +1 @@ -../../../lib/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.min.js \ No newline at end of file +../../../webapp/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.min.js \ No newline at end of file diff --git a/webapp/public/js/bootstrap.bundle.min.js.map b/webapp/public/js/bootstrap.bundle.min.js.map index 5f0e462a2e..575d003312 120000 --- a/webapp/public/js/bootstrap.bundle.min.js.map +++ b/webapp/public/js/bootstrap.bundle.min.js.map @@ -1 +1 @@ -../../../lib/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.min.js.map \ No newline at end of file +../../../webapp/vendor/twbs/bootstrap/dist/js/bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/webapp/public/js/d3.min.js b/webapp/public/js/d3.min.js index 9fb1b29cbc..2a889b43df 120000 --- a/webapp/public/js/d3.min.js +++ b/webapp/public/js/d3.min.js @@ -1 +1 @@ -../../../lib/vendor/mbostock/d3/d3.min.js \ No newline at end of file +../../../webapp/vendor/mbostock/d3/d3.min.js \ No newline at end of file diff --git a/webapp/public/js/dataTables.bootstrap5.min.js b/webapp/public/js/dataTables.bootstrap5.min.js index 9f856d06ea..e615d225ce 120000 --- a/webapp/public/js/dataTables.bootstrap5.min.js +++ b/webapp/public/js/dataTables.bootstrap5.min.js @@ -1 +1 @@ -../../../lib/vendor/datatables.net/datatables.net-bs5/js/dataTables.bootstrap5.min.js \ No newline at end of file +../../../webapp/vendor/datatables.net/datatables.net-bs5/js/dataTables.bootstrap5.min.js \ No newline at end of file diff --git a/webapp/public/js/dataTables.min.js b/webapp/public/js/dataTables.min.js index 4f945df306..1431e0ad14 120000 --- a/webapp/public/js/dataTables.min.js +++ b/webapp/public/js/dataTables.min.js @@ -1 +1 @@ -../../../lib/vendor/datatables.net/datatables.net/js/dataTables.min.js \ No newline at end of file +../../../webapp/vendor/datatables.net/datatables.net/js/dataTables.min.js \ No newline at end of file diff --git a/webapp/public/js/jquery.min.js b/webapp/public/js/jquery.min.js index 6afb7f5993..c205f23afa 120000 --- a/webapp/public/js/jquery.min.js +++ b/webapp/public/js/jquery.min.js @@ -1 +1 @@ -../../../lib/vendor/components/jquery/jquery.min.js \ No newline at end of file +../../../webapp/vendor/components/jquery/jquery.min.js \ No newline at end of file diff --git a/webapp/public/js/nv.d3.min.js b/webapp/public/js/nv.d3.min.js index ab7aa7313e..c56dd4d8cb 120000 --- a/webapp/public/js/nv.d3.min.js +++ b/webapp/public/js/nv.d3.min.js @@ -1 +1 @@ -../../../lib/vendor/novus/nvd3/build/nv.d3.min.js \ No newline at end of file +../../../webapp/vendor/novus/nvd3/build/nv.d3.min.js \ No newline at end of file diff --git a/webapp/public/js/nv.d3.min.js.map b/webapp/public/js/nv.d3.min.js.map index 6c57c82185..d110759e78 120000 --- a/webapp/public/js/nv.d3.min.js.map +++ b/webapp/public/js/nv.d3.min.js.map @@ -1 +1 @@ -../../../lib/vendor/novus/nvd3/build/nv.d3.min.js.map \ No newline at end of file +../../../webapp/vendor/novus/nvd3/build/nv.d3.min.js.map \ No newline at end of file diff --git a/webapp/public/js/select2.min.js b/webapp/public/js/select2.min.js index f71b2857a3..3bc026821c 120000 --- a/webapp/public/js/select2.min.js +++ b/webapp/public/js/select2.min.js @@ -1 +1 @@ -../../../lib/vendor/select2/select2/dist/js/select2.min.js \ No newline at end of file +../../../webapp/vendor/select2/select2/dist/js/select2.min.js \ No newline at end of file diff --git a/webapp/public/webfonts b/webapp/public/webfonts index 3478e1aff4..da8b175676 120000 --- a/webapp/public/webfonts +++ b/webapp/public/webfonts @@ -1 +1 @@ -../../lib/vendor/fortawesome/font-awesome/webfonts \ No newline at end of file +../../webapp/vendor/fortawesome/font-awesome/webfonts \ No newline at end of file diff --git a/webapp/src/Service/DOMJudgeService.php b/webapp/src/Service/DOMJudgeService.php index b94369c220..33dde946e6 100644 --- a/webapp/src/Service/DOMJudgeService.php +++ b/webapp/src/Service/DOMJudgeService.php @@ -96,7 +96,7 @@ public function __construct( protected readonly Environment $twig, #[Autowire('%kernel.project_dir%')] protected string $projectDir, - #[Autowire('%domjudge.libvendordir%')] + #[Autowire('%domjudge.vendordir%')] protected string $vendorDir, ) {} diff --git a/webapp/tests/bootstrap.php b/webapp/tests/bootstrap.php index 0b7f3aa422..38b58c63af 100644 --- a/webapp/tests/bootstrap.php +++ b/webapp/tests/bootstrap.php @@ -2,7 +2,7 @@ use Symfony\Component\Dotenv\Dotenv; -require dirname(__DIR__, 2) . '/lib/vendor/autoload.php'; +require dirname(__DIR__, 2) . '/webapp/vendor/autoload.php'; require dirname(__DIR__) . '/config/load_db_secrets.php'; if (file_exists(dirname(__DIR__) . '/config/bootstrap.php')) {