diff --git a/.git-hooks-matomo/pre-push b/.git-hooks-matomo/pre-push new file mode 100755 index 0000000..828c762 --- /dev/null +++ b/.git-hooks-matomo/pre-push @@ -0,0 +1,23 @@ +#!/bin/bash + +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# + + + +set -e + +ROOT_DIR="$(git rev-parse --show-toplevel)" + +for script in "$ROOT_DIR/.git-hooks-matomo/pre-push.d/"*.sh; do + [ -x "$script" ] && "$script" +done diff --git a/.git-hooks-matomo/pre-push.d/phpstan.sh b/.git-hooks-matomo/pre-push.d/phpstan.sh new file mode 100755 index 0000000..b57b53e --- /dev/null +++ b/.git-hooks-matomo/pre-push.d/phpstan.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# + + + +### Check we're running in the context of a plugin and get helpful dir variables ### + +REPO_DIR="$(git rev-parse --show-toplevel)" +echo "Running pre-commit hook in repo: $REPO_DIR" + +if [[ "$REPO_DIR" =~ /plugins/(.*) ]]; then + PLUGIN_PATH="plugins/${BASH_REMATCH[1]}/" +else + echo "Not a plugin, not running any further checks" + exit 1 +fi +MATOMO_DIR=$(echo "$REPO_DIR" | sed -E 's|/plugins/.*$||') + + + +### Figure out how to run PHPStan - ddev or not. ### + +COMMAND="" +# Use local PHP if setup +if command -v php >/dev/null 2>&1; then + if [ -f "${MATOMO_DIR}/vendor/bin/phpstan" ]; then + COMMAND="${MATOMO_DIR}/vendor/bin/phpstan" + PLUGIN_PATH='' + fi +elif command -v ddev >/dev/null 2>&1; then + # Use ddev if setup (overridding local setup) + if [ -d "$MATOMO_DIR/.ddev" ]; then + cd "$MATOMO_DIR" || exit 1 + if ddev status 2>&1 > /dev/null; then + COMMAND="ddev exec phpstan" + fi + fi +fi +# If no command, exit +if [[ -z "$COMMAND" ]]; then + echo "No way to run phpstan found." + exit 1 +fi + + + +# Basic setup +cd "$REPO_DIR" +STATUS=0 + + +PHPSTAN_BASE_CONFIG=phpstan.neon +if [[ -f "$PHPSTAN_BASE_CONFIG" ]]; then + echo "Running PHPstan at a base level on all plugin files" + $COMMAND analyse -c ${PLUGIN_PATH}/${PHPSTAN_BASE_CONFIG} || STATUS=1 +fi + +exit $STATUS diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml new file mode 100644 index 0000000..9ebffbc --- /dev/null +++ b/.github/workflows/phpstan.yml @@ -0,0 +1,85 @@ +name: PHPStan check + +on: pull_request + +permissions: + actions: read + checks: read + contents: read + deployments: none + issues: read + packages: none + pull-requests: read + repository-projects: none + security-events: none + statuses: read + +env: + PLUGIN_NAME: CustomVariables + DEPENDENT_PLUGINS: + +jobs: + phpstan: + name: PHPStan + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + lfs: false + persist-credentials: false + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.2' + + - name: Check out github-action-tests repository + uses: actions/checkout@v4 + with: + repository: matomo-org/github-action-tests + ref: main + path: github-action-tests + + - name: checkout matomo for plugin builds + shell: bash + run: ${{ github.workspace }}/github-action-tests/scripts/bash/checkout_matomo.sh + env: + PLUGIN_NAME: ${{ env.PLUGIN_NAME }} + WORKSPACE: ${{ github.workspace }} + ACTION_PATH: ${{ github.workspace }}/github-action-tests + MATOMO_TEST_TARGET: maximum_supported_matomo + + - name: prepare setup + shell: bash + run: | + cd ${{ github.workspace }}/matomo + echo -e "composer install" + composer install --ignore-platform-reqs + + - name: checkout additional plugins + if: ${{ env.DEPENDENT_PLUGINS != '' }} + shell: bash + working-directory: ${{ github.workspace }}/matomo + run: ${{ github.workspace }}/github-action-tests/scripts/bash/checkout_dependent_plugins.sh + + env: + DEPENDENT_PLUGINS: ${{ env.DEPENDENT_PLUGINS }} + GITHUB_USER_TOKEN: ${{ secrets.TESTS_ACCESS_TOKEN || secrets.GITHUB_TOKEN }} + + - name: "Restore result cache" + uses: actions/cache/restore@v4 + with: + path: /tmp/phpstan # same as in phpstan.neon + key: "phpstan-result-cache-${{ github.run_id }}" + restore-keys: | + phpstan-result-cache- + + - name: PHPStan whole repo + id: phpstan-all + run: cd ${{ github.workspace }}/matomo && composer run phpstan -- -vvv -c plugins/${{ env.PLUGIN_NAME }}/phpstan.neon + + - name: "Save result cache" + uses: actions/cache/save@v4 + if: ${{ !cancelled() }} + with: + path: /tmp/phpstan # same as in phpstan.neon + key: "phpstan-result-cache-${{ github.run_id }}" diff --git a/API.php b/API.php index 525814e..443299f 100644 --- a/API.php +++ b/API.php @@ -169,9 +169,9 @@ public function getUsagesOfSlots($idSite) 'page' => array_fill(1, $numVars, array()), ); - /** @var DataTable $customVarUsages */ $today = StaticContainer::get('CustomVariables.today'); $date = '2008-12-12,' . $today; + /** @var DataTable $customVarUsages */ $customVarUsages = Request::processRequest( 'CustomVariables.getCustomVariables', array('idSite' => $idSite, 'period' => 'range', 'date' => $date, diff --git a/RecordBuilders/CustomVariables.php b/RecordBuilders/CustomVariables.php index 890cc09..2f92270 100644 --- a/RecordBuilders/CustomVariables.php +++ b/RecordBuilders/CustomVariables.php @@ -96,6 +96,7 @@ protected function aggregateCustomVariable(DataTable $record, array &$metadata, $query = $logAggregator->queryActionsByDimension($dimensions, $where, $additionalSelects); $this->aggregateFromActions($record, $metadata, $metadataFlat, $query, $keyField, $valueField); + // @phpstan-ignore-next-line Ternary operator condition is always true. $query = version_compare(Version::VERSION, '5.2.0-b6', '>=') ? $logAggregator->queryConversionsByDimension($dimensions, $where, [], [], false, false, true) : $logAggregator->queryConversionsByDimension($dimensions, $where); diff --git a/Reports/GetCustomVariables.php b/Reports/GetCustomVariables.php index 0f01ce2..b4e6a8c 100644 --- a/Reports/GetCustomVariables.php +++ b/Reports/GetCustomVariables.php @@ -20,8 +20,8 @@ class GetCustomVariables extends Base protected function init() { parent::init(); - $this->dimension = new CustomVariableName(); - $this->name = Piwik::translate('CustomVariables_CustomVariables'); + $this->dimension = new CustomVariableName(); + $this->name = Piwik::translate('CustomVariables_CustomVariables'); $this->documentation = Piwik::translate( 'CustomVariables_CustomVariablesReportDocumentation', array('
', '', '') @@ -29,7 +29,7 @@ protected function init() $this->actionToLoadSubTables = 'getCustomVariablesValuesFromNameId'; $this->order = 10; - $this->subcategoryId = 'CustomVariables_CustomVariables'; + $this->subcategoryId = 'CustomVariables_CustomVariables'; $this->hasGoalMetrics = true; } @@ -38,7 +38,7 @@ public function configureView(ViewDataTable $view) $view->config->columns_to_display = array('label', 'nb_actions', 'nb_visits'); $view->config->addTranslation('label', Piwik::translate('CustomVariables_ColumnCustomVariableName')); $view->requestConfig->filter_sort_column = 'nb_actions'; - $view->requestConfig->filter_sort_order = 'desc'; + $view->requestConfig->filter_sort_order = 'desc'; $that = $this; $view->config->filters[] = function (DataTable $table) use ($view, $that) { @@ -71,9 +71,7 @@ public function getFooterMessageExplanationMissingMetrics() // no footer message for subtables $out = ''; Piwik::postEvent('Template.afterCustomVariablesReport', array(&$out)); - if (!empty($message)) { - $message .= $out; - } + $message .= $out; } return $message; diff --git a/Tracker/CustomVariablesRequestProcessor.php b/Tracker/CustomVariablesRequestProcessor.php index e7752eb..2c7f056 100644 --- a/Tracker/CustomVariablesRequestProcessor.php +++ b/Tracker/CustomVariablesRequestProcessor.php @@ -46,6 +46,7 @@ public function processRequestParams(VisitProperties $visitProperties, Request $ } $request->setMetadata('CustomVariables', 'visitCustomVariables', $visitorCustomVariables); + return false; } public function onNewVisit(VisitProperties $visitProperties, Request $request) @@ -71,7 +72,7 @@ public function afterRequestProcessed(VisitProperties $visitProperties, Request $action = $request->getMetadata('Actions', 'action'); if (empty($action) || !($action instanceof Action)) { - return; + return false; } $customVariables = self::getCustomVariablesInPageScope($request); @@ -84,6 +85,7 @@ public function afterRequestProcessed(VisitProperties $visitProperties, Request $action->setCustomField($field, $value); } } + return false; } public static function getCustomVariablesInVisitScope(Request $request) diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..b2a4e2a --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,21 @@ +parameters: + level: 4 + phpVersion: 70200 + tmpDir: /tmp/phpstan/CustomVariables/main + paths: + - . + excludePaths: + - tests/* + - github-action-tests + bootstrapFiles: + - ../../bootstrap-phpstan.php + universalObjectCratesClasses: + - Piwik\Config + - Piwik\View + - Piwik\ViewDataTable\Config + scanDirectories: + # ../../ does not actually seem to give us anything + # that ../plugins/ does not, but including it for + # completeness. It does not seem to slow down performance. + - . +