diff --git a/.gitattributes b/.gitattributes index 14c3c35..84c7add 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ /Tests export-ignore /phpunit.xml.dist export-ignore -/.git* export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 4689c4d..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,8 +0,0 @@ -Please do not submit any Pull Requests here. They will be closed. ---- - -Please submit your PR here instead: -https://github.com/symfony/symfony - -This repository is what we call a "subtree split": a read-only subset of that main repository. -We're looking forward to your PR there! diff --git a/.github/workflows/check-subtree-split.yml b/.github/workflows/check-subtree-split.yml deleted file mode 100644 index 16be48b..0000000 --- a/.github/workflows/check-subtree-split.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Check subtree split - -on: - pull_request_target: - -jobs: - close-pull-request: - runs-on: ubuntu-latest - - steps: - - name: Close pull request - uses: actions/github-script@v6 - with: - script: | - if (context.repo.owner === "symfony") { - github.rest.issues.createComment({ - owner: "symfony", - repo: context.repo.repo, - issue_number: context.issue.number, - body: ` - Thanks for your Pull Request! We love contributions. - - However, you should instead open your PR on the main repository: - https://github.com/symfony/symfony - - This repository is what we call a "subtree split": a read-only subset of that main repository. - We're looking forward to your PR there! - ` - }); - - github.rest.pulls.update({ - owner: "symfony", - repo: context.repo.repo, - pull_number: context.issue.number, - state: "closed" - }); - } diff --git a/Command/DebugCommand.php b/Command/DebugCommand.php index 0da8024..d0c2723 100644 --- a/Command/DebugCommand.php +++ b/Command/DebugCommand.php @@ -15,6 +15,7 @@ use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Completion\CompletionInput; use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -80,21 +81,23 @@ protected function execute(InputInterface $input, OutputInterface $output): int return 1; } - $envFiles = $this->getEnvFiles(); - $availableFiles = array_filter($envFiles, fn (string $file) => is_file($this->getFilePath($file))); + $filePath = $_SERVER['SYMFONY_DOTENV_PATH'] ?? $this->projectDirectory.\DIRECTORY_SEPARATOR.'.env'; - if (\in_array('.env.local.php', $availableFiles, true)) { - $io->warning('Due to existing dump file (.env.local.php) all other dotenv files are skipped.'); + $envFiles = $this->getEnvFiles($filePath); + $availableFiles = array_filter($envFiles, 'is_file'); + + if (\in_array(sprintf('%s.local.php', $filePath), $availableFiles, true)) { + $io->warning(sprintf('Due to existing dump file (%s.local.php) all other dotenv files are skipped.', $this->getRelativeName($filePath))); } - if (is_file($this->getFilePath('.env')) && is_file($this->getFilePath('.env.dist'))) { - $io->warning('The file .env.dist gets skipped due to the existence of .env.'); + if (is_file($filePath) && is_file(sprintf('%s.dist', $filePath))) { + $io->warning(sprintf('The file %s.dist gets skipped due to the existence of %1$s.', $this->getRelativeName($filePath))); } $io->section('Scanned Files (in descending priority)'); - $io->listing(array_map(static fn (string $envFile) => \in_array($envFile, $availableFiles, true) - ? sprintf('✓ %s', $envFile) - : sprintf('⨯ %s', $envFile), $envFiles)); + $io->listing(array_map(fn (string $envFile) => \in_array($envFile, $availableFiles, true) + ? sprintf('✓ %s', $this->getRelativeName($envFile)) + : sprintf('⨯ %s', $this->getRelativeName($envFile)), $envFiles)); $nameFilter = $input->getArgument('filter'); $variables = $this->getVariables($availableFiles, $nameFilter); @@ -103,8 +106,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($variables || null === $nameFilter) { $io->table( - array_merge(['Variable', 'Value'], $availableFiles), - $this->getVariables($availableFiles, $nameFilter) + array_merge(['Variable', 'Value'], array_map($this->getRelativeName(...), $availableFiles)), + $variables ); $io->comment('Note that values might be different between web and CLI.'); @@ -124,75 +127,84 @@ public function complete(CompletionInput $input, CompletionSuggestions $suggesti private function getVariables(array $envFiles, ?string $nameFilter): array { - $vars = $this->getAvailableVars(); - - $output = []; + $variables = []; $fileValues = []; - foreach ($vars as $var) { + $dotenvVars = array_flip(explode(',', $_SERVER['SYMFONY_DOTENV_VARS'] ?? '')); + + foreach ($envFiles as $envFile) { + $fileValues[$envFile] = $this->loadValues($envFile); + $variables += $fileValues[$envFile]; + } + + foreach ($variables as $var => $varDetails) { if (null !== $nameFilter && 0 !== stripos($var, $nameFilter)) { + unset($variables[$var]); continue; } - $realValue = $_SERVER[$var]; - $varDetails = [$var, $realValue]; - foreach ($envFiles as $envFile) { - $values = $fileValues[$envFile] ??= $this->loadValues($envFile); + $realValue = $_SERVER[$var] ?? ''; + $varDetails = [$var, ''.OutputFormatter::escape($realValue).'']; + $varSeen = !isset($dotenvVars[$var]); - $varString = $values[$var] ?? 'n/a'; - $shortenedVar = $this->getHelper('formatter')->truncate($varString, 30); - $varDetails[] = $varString === $realValue ? ''.$shortenedVar.'' : $shortenedVar; + foreach ($envFiles as $envFile) { + if (null === $value = $fileValues[$envFile][$var] ?? null) { + $varDetails[] = 'n/a'; + continue; + } + + $shortenedValue = OutputFormatter::escape($this->getHelper('formatter')->truncate($value, 30)); + $varDetails[] = $value === $realValue && !$varSeen ? ''.$shortenedValue.'' : $shortenedValue; + $varSeen = $varSeen || $value === $realValue; } - $output[] = $varDetails; + $variables[$var] = $varDetails; } - return $output; + ksort($variables); + + return $variables; } private function getAvailableVars(): array { - $dotenvVars = $_SERVER['SYMFONY_DOTENV_VARS'] ?? ''; - - if ('' === $dotenvVars) { - return []; - } - - $vars = explode(',', $dotenvVars); - sort($vars); + $filePath = $_SERVER['SYMFONY_DOTENV_PATH'] ?? $this->projectDirectory.\DIRECTORY_SEPARATOR.'.env'; + $envFiles = $this->getEnvFiles($filePath); - return $vars; + return array_keys($this->getVariables(array_filter($envFiles, 'is_file'), null)); } - private function getEnvFiles(): array + private function getEnvFiles(string $filePath): array { $files = [ - '.env.local.php', - sprintf('.env.%s.local', $this->kernelEnvironment), - sprintf('.env.%s', $this->kernelEnvironment), + sprintf('%s.local.php', $filePath), + sprintf('%s.%s.local', $filePath, $this->kernelEnvironment), + sprintf('%s.%s', $filePath, $this->kernelEnvironment), ]; if ('test' !== $this->kernelEnvironment) { - $files[] = '.env.local'; + $files[] = sprintf('%s.local', $filePath); } - if (!is_file($this->getFilePath('.env')) && is_file($this->getFilePath('.env.dist'))) { - $files[] = '.env.dist'; + if (!is_file($filePath) && is_file(sprintf('%s.dist', $filePath))) { + $files[] = sprintf('%s.dist', $filePath); } else { - $files[] = '.env'; + $files[] = $filePath; } return $files; } - private function getFilePath(string $file): string + private function getRelativeName(string $filePath): string { - return $this->projectDirectory.\DIRECTORY_SEPARATOR.$file; + if (str_starts_with($filePath, $this->projectDirectory)) { + return substr($filePath, \strlen($this->projectDirectory) + 1); + } + + return basename($filePath); } - private function loadValues(string $file): array + private function loadValues(string $filePath): array { - $filePath = $this->getFilePath($file); - if (str_ends_with($filePath, '.php')) { return include $filePath; } diff --git a/Tests/Command/DebugCommandTest.php b/Tests/Command/DebugCommandTest.php index 22e656d..78e2b97 100644 --- a/Tests/Command/DebugCommandTest.php +++ b/Tests/Command/DebugCommandTest.php @@ -54,6 +54,9 @@ public function testEmptyDotEnvVarsList() ---------- ------- ------------ ------%S Variable Value .env.local .env%S ---------- ------- ------------ ------%S + FOO baz bar%S + TEST123 n/a true%S + ---------- ------- ------------ ------%S // Note that values might be different between web and CLI.%S %a