overtrue / phplint

:bug: A tool that can speed up linting of php files by running several lint processes at once.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[9.0.0] Enhance Cache support for Windows platform

knallcharge opened this issue · comments

New Issue

Diagnose

Using version 9.0.0 via composer, upgraded from 5.5.
Running on Windows with XAMPP.

Summary

When starting phplint, I get the error:
"Cache key "C:\full\path(...)\Some.php" contains reserved characters "{}()/@:"."
where the cache key is the complete path to the first file being checked.

Expected behaviour

phplint should not issue an error and cache results (as in v5.5).

Actual behaviour

phplint issues an error when using cache.
Using the --no-cache-flag runs fine.

Did you check Open-Source Code ? if answer is yes, please specify URL of repository

No, I was checking a private project which is not available to the public.

As it seems you are checking files on Windows, could you at least specify directories tree with command tree /A on windows prompt

I'm only checking src and tests with phplint, this is the src-folder with "tree /A"

+---Command
+---Controller
+---Core
+---Datatables
+---Entity
+---Exception
+---Form
|   \---Extension
+---Repository
+---Security
+---Service
+---Twig
\---Util

and this is tests

+---Controller
+---Entity
+---Form
+---Repository
\---Service

There are no special characters on your directories, probably it's one of the files you are checking that have special char.

Could you identify it, when you it with the progress (printer by default) output ?

Don't forget to specify verbose level max -vvv that will gave us a backtrace of last steps executed too !

Thanks for getting back! This is the command I'm now executing:
vendor\bin\phplint -c build\phplint.yml --progress=printer -vvv
My phplint.yml is this:

path:
    - src
    - tests
jobs: 10
cache: build/phplint.cache
extensions:
    - php

The output I'm getting from the above command is this:

phplint 9.0.0 by overtrue and contributors.

Runtime       : PHP 8.1.10
Configuration : C:\xampp\htdocs_my-project\my-project\build\phplint.yml

┌──────────────────┬───────────────────────┬─────────┐
│ Name             │ Value                 │ Help    │
├──────────────────┼───────────────────────┼─────────┤
│ path             │ ["src","tests"]       │ command │
├──────────────────┼───────────────────────┼─────────┤
│ configuration    │ "build\\phplint.yml"  │ command │
│ no-configuration │ false                 │ command │
│ exclude          │ []                    │ command │
│ extensions       │ ["php"]               │ command │
│ jobs             │ 10                    │ command │
│ no-cache         │ false                 │ command │
│ cache            │ "build/phplint.cache" │ command │
│ no-progress      │ false                 │ command │
│ progress         │ "printer"             │ command │
│ log-json         │ null                  │ command │
│ log-junit        │ null                  │ command │
│ warning          │ false                 │ command │
│ memory-limit     │ "4G"                  │ command │
│ ignore-exit-code │ false                 │ command │
└──────────────────┴───────────────────────┴─────────┘


In CacheItem.php line 139:

  [Symfony\Component\Cache\Exception\InvalidArgumentException]
  Cache key "C:\xampp\htdocs_my-project\my-project\src\Command\CheckCommand.php" contains reserved characters "{}()/\@:".


Exception trace:
  at C:\xampp\htdocs_my-project\my-project\vendor\symfony\cache\CacheItem.php:139
 Symfony\Component\Cache\CacheItem::validateKey() at C:\xampp\htdocs_my-project\my-project\vendor\symfony\cache\Traits\AbstractAdapterTrait.php:345
 Symfony\Component\Cache\Adapter\AbstractAdapter->getId() at C:\xampp\htdocs_my-project\my-project\vendor\symfony\cache\Traits\AbstractAdapterTrait.php:185
 Symfony\Component\Cache\Adapter\AbstractAdapter->getItem() at C:\xampp\htdocs_my-project\my-project\vendor\symfony\cache\Adapter\TraceableAdapter.php:71
 Symfony\Component\Cache\Adapter\TraceableAdapter->getItem() at C:\xampp\htdocs_my-project\my-project\vendor\overtrue\phplint\src\Cache.php:89
 Overtrue\PHPLint\Cache->getItem() at C:\xampp\htdocs_my-project\my-project\vendor\overtrue\phplint\src\Cache.php:105
 Overtrue\PHPLint\Cache->isHit() at C:\xampp\htdocs_my-project\my-project\vendor\overtrue\phplint\src\Linter.php:100
 Overtrue\PHPLint\Linter->lintFiles() at C:\xampp\htdocs_my-project\my-project\vendor\overtrue\phplint\src\Command\LintCommand.php:96
 Overtrue\PHPLint\Command\LintCommand->execute() at C:\xampp\htdocs_my-project\my-project\vendor\symfony\console\Command\Command.php:312
 Symfony\Component\Console\Command\Command->run() at C:\xampp\htdocs_my-project\my-project\vendor\symfony\console\Application.php:1040
 Symfony\Component\Console\Application->doRunCommand() at C:\xampp\htdocs_my-project\my-project\vendor\symfony\console\Application.php:314
 Symfony\Component\Console\Application->doRun() at C:\xampp\htdocs_my-project\my-project\vendor\overtrue\phplint\src\Console\Application.php:58
 Overtrue\PHPLint\Console\Application->doRun() at C:\xampp\htdocs_my-project\my-project\vendor\symfony\console\Application.php:168
 Symfony\Component\Console\Application->run() at C:\xampp\htdocs_my-project\my-project\vendor\overtrue\phplint\src\Console\Application.php:47
 Overtrue\PHPLint\Console\Application->run() at C:\xampp\htdocs_my-project\my-project\vendor\overtrue\phplint\bin\phplint:61
 include() at C:\xampp\htdocs_my-project\my-project\vendor\bin\phplint:120

lint [--exclude EXCLUDE] [--extensions EXTENSIONS] [-j|--jobs JOBS] [-c|--configuration CONFIGURATION] [--no-configuration] [--cache CACHE] [--no-cache] [-p|--progress PROGRESS] [--no-progress] [--log-json [LOG-JSON]] [--log-junit [LOG-JUNIT]] [-w|--warning] [--memory-limit MEMORY-LIMIT] [--ignore-exit-code] [--] [<path>...]

From the exception message I'd guess that the whole path is used as the cache key which won't work because of the backslashes and the colon.

Docker is a best compromise if you've a such environment installed on your Windows platform !

Otherwise do not use cache anymore ;-)

While the filename is already "fixed" in Cache.php, line 141, may I rather suggest replacing the line
return str_replace('/', '_', $filename);
with
return str_replace(['{', '}', '(', ')', '/', '\\', '@', ':'], '_', $filename);
instead of having people use a completely different environment or disable the cache?
Doing so fixes the issue. I have opened a PR.

Good catch, but your PR is not enough for me (sorry) !

Unit tests are missing, and I prefer to avoid hardcoding values

So instead of

return str_replace(['{', '}', '(', ')', '/', '\\', '@', ':'], '_', $filename);

I'll use

return str_replace(str_split(ItemInterface::RESERVED_CHARACTERS), '_', $filename);

Bugfix release with tests are allready available, will push it in next minutes : you can close your PR

Version 9.0.2 has just been released ! Please check-out.

I used hardcoded values, because you did ;)
But of course you're right, it's much better that way, thanks for the quick fix!
9.0.2 works as expected. (Application.php still needs bumping of the version)

(Application.php still needs bumping of the version)

I know !