diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000000..39f48d95fa8
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,15 @@
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+end_of_line = lf
+insert_final_newline = true
+
+# Matches multiple files with brace expansion notation
+# Set default charset
+[*]
+charset = utf-8
+
+# Tab indentation (no size specified)
+indent_style = tab
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000000..b4f0b6cbb44
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,23 @@
+# This file tells which files and directories should be ignored and
+# NOT downloaded when using composer to pull down a project with
+# the --prefer-dist option selected. Used to remove development
+# specific files so user has a clean download.
+
+# git files
+.gitattributes export-ignore
+# .gitignore
+
+# helper config files
+.travis.yml export-ignore
+phpdoc.dist.xml export-ignore
+
+# Misc other files
+readme.rst
+
+# They don't want all of our tests...
+tests/codeigniter/ export-ignore
+tests/travis/ export-ignore
+
+# User Guide source files and compiled files
+user_guide_src export-ignore
+user_guide export-ignore
diff --git a/.github/workflows/test-phpunit.yml b/.github/workflows/test-phpunit.yml
new file mode 100644
index 00000000000..c660b937e04
--- /dev/null
+++ b/.github/workflows/test-phpunit.yml
@@ -0,0 +1,122 @@
+name: PHPUnit
+
+on: [push, pull_request]
+
+permissions:
+ contents: read
+
+jobs:
+ tests:
+ runs-on: ubuntu-22.04
+ if: "!contains(github.event.head_commit.message, '[ci skip]')"
+ env:
+ PHP_INI_VALUES: assert.exception=1, zend.assertions=1
+
+ strategy:
+ fail-fast: false
+ matrix:
+ php: [ '8.1', '8.0', '7.4', '7.3', '7.2', '7.1', '7.0', '5.6', '5.5', '5.4']
+ DB: [ 'pdo/mysql', 'pdo/pgsql', 'pdo/sqlite', 'mysqli', 'pgsql', 'sqlite' ]
+ compiler: [ default ]
+ include:
+ - php: '8.1'
+ DB: 'pdo/mysql'
+ compiler: jit
+ - php: '8.1'
+ DB: 'pdo/pgsql'
+ compiler: jit
+ - php: '8.1'
+ DB: 'pdo/sqlite'
+ compiler: jit
+ - php: '8.1'
+ DB: 'mysqli'
+ compiler: jit
+ - php: '8.1'
+ DB: 'pgsql'
+ compiler: jit
+ - php: '8.1'
+ DB: 'sqlite'
+ compiler: jit
+ - php: '8.0'
+ DB: 'pdo/mysql'
+ compiler: jit
+ - php: '8.0'
+ DB: 'pdo/pgsql'
+ compiler: jit
+ - php: '8.0'
+ DB: 'pdo/sqlite'
+ compiler: jit
+ - php: '8.0'
+ DB: 'mysqli'
+ compiler: jit
+ - php: '8.0'
+ DB: 'pgsql'
+ compiler: jit
+ - php: '8.0'
+ DB: 'sqlite'
+ compiler: jit
+ - php: '5.6'
+ DB: 'mysql'
+ compiler: default
+ - php: '5.5'
+ DB: 'mysql'
+ compiler: default
+ - php: '5.4'
+ DB: 'mysql'
+ compiler: default
+
+ services:
+ postgres:
+ image: postgres:12
+ env:
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_DB: ci_test
+ ports:
+ - 5432:5432
+ options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3
+
+ mysql:
+ image: mysql:5.7
+ env:
+ MYSQL_ALLOW_EMPTY_PASSWORD: true
+ MYSQL_USER: travis
+ MYSQL_PASSWORD: travis
+ MYSQL_DATABASE: ci_test
+ ports:
+ - 3306:3306
+ options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Override PHP ini values for JIT compiler
+ if: matrix.compiler == 'jit'
+ run: echo "PHP_INI_VALUES::assert.exception=1, zend.assertions=1, opcache.enable=1, opcache.enable_cli=1, opcache.optimization_level=-1, opcache.jit=1255, opcache.jit_buffer_size=64M" >> $GITHUB_ENV
+
+ - name: Install PHP${{ matrix.php }} - DB ${{ matrix.DB }}
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: ${{ matrix.php }}
+ tools: composer, pecl
+ extensions: imagick, sqlite3, pgsql, mysqli, pdo, pdo_mysql, pdo_pgsql, pdo_sqlite, mbstring
+ ini-values: ${{ env.PHP_INI_VALUES }}
+ coverage: xdebug
+
+ - name: Get composer cache directory
+ id: composer-cache
+ run: echo "::set-output name=dir::$(composer config cache-files-dir)"
+ - name: Cache composer dependencies
+ uses: actions/cache@v2
+ with:
+ path: ${{ steps.composer-cache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+ restore-keys: ${{ runner.os }}-composer-
+ - name: Install composer dependencies
+ run: composer install --no-progress --prefer-dist --optimize-autoloader
+
+ - name: PHPUnit Test
+ run: |
+ php -d error_reporting=E_ALL -d zend.enable_gc=0 -d date.timezone=UTC -d mbstring.func_overload=7 -d mbstring.internal_encoding=UTF-8 vendor/bin/phpunit --coverage-text --configuration tests/travis/${{ matrix.DB }}.phpunit.xml
+ env:
+ XDEBUG_MODE: coverage
diff --git a/.gitignore b/.gitignore
index 11fb6d67c4f..323f06468b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,13 +2,31 @@
application/cache/*
!application/cache/index.html
-!application/cache/.htaccess
application/logs/*
!application/logs/index.html
-!application/logs/.htaccess
+
+!application/*/.htaccess
+
+composer.lock
+tests/mocks/database/ci_test.sqlite
user_guide_src/build/*
user_guide_src/cilexer/build/*
user_guide_src/cilexer/dist/*
-user_guide_src/cilexer/pycilexer.egg-info/*
\ No newline at end of file
+user_guide_src/cilexer/pycilexer.egg-info/*
+/vendor/
+
+# IDE Files
+#-------------------------
+/nbproject/
+.idea/*
+
+## Sublime Text cache files
+*.tmlanguage.cache
+*.tmPreferences.cache
+*.stTheme.cache
+*.sublime-workspace
+*.sublime-project
+/tests/tests/
+/tests/results/
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 62acf05e53a..00000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-language: php
-
-php:
- - 5.3
- - 5.4
-
-services:
- - mysql
- - postgresql
- - sqlite
-
-env:
- - DB=mysql
- - DB=pgsql
- - DB=sqlite
- - DB=pdo/mysql
- - DB=pdo/pgsql
- - DB=pdo/sqlite
-
-before_script:
- - curl -s http://getcomposer.org/installer | php
- - php composer.phar install
- - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'DROP DATABASE IF EXISTS ci_test;' -U postgres; fi"
- - sh -c "if [ '$DB' = 'pgsql' ] || [ '$DB' = 'pdo/pgsql' ]; then psql -c 'create database ci_test;' -U postgres; fi"
- - sh -c "if [ '$DB' = 'mysql' ] || [ '$DB' = 'pdo/mysql' ]; then mysql -e 'create database IF NOT EXISTS ci_test;'; fi"
-
-script: phpunit --coverage-text --configuration tests/travis/$DB.phpunit.xml
-
-branches:
- only:
- - develop
- - /^feature\/.+$/
\ No newline at end of file
diff --git a/application/cache/.htaccess b/application/cache/.htaccess
deleted file mode 100644
index 6c63ed4c4d2..00000000000
--- a/application/cache/.htaccess
+++ /dev/null
@@ -1,6 +0,0 @@
-
Directory access is forbidden.
- \ No newline at end of file +