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')) {