From 6b87705b7779f5eaaad155f6b51e6376c03f3ab2 Mon Sep 17 00:00:00 2001 From: Aditya Tripathi Date: Sat, 21 Feb 2026 20:27:28 +0000 Subject: [PATCH] fix: coderabbit changes + compose improvements --- .../Project/New/GithubPrivateRepository.php | 8 ++++++ .../New/GithubPrivateRepositoryDeployKey.php | 8 ++++++ .../Project/New/PublicGitRepository.php | 12 ++++++++- app/Services/RepositoryDetector.php | 19 +++++++++----- app/Traits/HasRepositoryDetection.php | 26 +++++++++++++++++-- ...ub-private-repository-deploy-key.blade.php | 8 ++++++ .../new/github-private-repository.blade.php | 8 ++++++ .../new/partials/env-import-modal.blade.php | 2 +- .../new/public-git-repository.blade.php | 8 ++++++ tests/Unit/RepositoryDetectorTest.php | 25 ++++++++++++++++++ 10 files changed, 114 insertions(+), 10 deletions(-) diff --git a/app/Livewire/Project/New/GithubPrivateRepository.php b/app/Livewire/Project/New/GithubPrivateRepository.php index 964cdbe06..c85e52214 100644 --- a/app/Livewire/Project/New/GithubPrivateRepository.php +++ b/app/Livewire/Project/New/GithubPrivateRepository.php @@ -242,9 +242,17 @@ class GithubPrivateRepository extends Component $application_init['health_check_enabled'] = false; } if ($this->build_pack === 'dockerfile' && $this->selectedDockerfile) { + if (! empty($this->detectedDockerfiles) && ! in_array($this->selectedDockerfile, $this->detectedDockerfiles, true)) { + $this->selectedDockerfile = $this->detectedDockerfiles[0]; + } $application_init['dockerfile_location'] = $this->selectedDockerfile; } if ($this->build_pack === 'dockercompose') { + if (! empty($this->detectedDockerComposeFiles) && $this->selectedDockerComposeFile + && ! in_array($this->selectedDockerComposeFile, $this->detectedDockerComposeFiles, true)) { + $this->selectedDockerComposeFile = $this->detectedDockerComposeFiles[0]; + $this->docker_compose_location = '/'.$this->selectedDockerComposeFile; + } $application_init['docker_compose_location'] = $this->docker_compose_location; } diff --git a/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php b/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php index d5656e27c..e8f07538b 100644 --- a/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php +++ b/app/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php @@ -219,9 +219,17 @@ class GithubPrivateRepositoryDeployKey extends Component $application_init['health_check_enabled'] = false; } if ($this->build_pack === 'dockerfile' && $this->selectedDockerfile) { + if (! empty($this->detectedDockerfiles) && ! in_array($this->selectedDockerfile, $this->detectedDockerfiles, true)) { + $this->selectedDockerfile = $this->detectedDockerfiles[0]; + } $application_init['dockerfile_location'] = $this->selectedDockerfile; } if ($this->build_pack === 'dockercompose') { + if (! empty($this->detectedDockerComposeFiles) && $this->selectedDockerComposeFile + && ! in_array($this->selectedDockerComposeFile, $this->detectedDockerComposeFiles, true)) { + $this->selectedDockerComposeFile = $this->detectedDockerComposeFiles[0]; + $this->docker_compose_location = '/'.$this->selectedDockerComposeFile; + } $application_init['docker_compose_location'] = $this->docker_compose_location; $application_init['base_directory'] = $this->base_directory; } diff --git a/app/Livewire/Project/New/PublicGitRepository.php b/app/Livewire/Project/New/PublicGitRepository.php index 4cad3ebf3..3c9410405 100644 --- a/app/Livewire/Project/New/PublicGitRepository.php +++ b/app/Livewire/Project/New/PublicGitRepository.php @@ -204,7 +204,9 @@ class PublicGitRepository extends Component $this->detectRepository(); } } catch (\Throwable $e) { - return handleError($e, $this); + // Both main and master failed — still run detection + // with clone fallback to the repo's default branch + $this->detectRepository(); } } else { return handleError($e, $this); @@ -396,9 +398,17 @@ class PublicGitRepository extends Component $application_init['health_check_enabled'] = false; } if ($this->build_pack === 'dockerfile' && $this->selectedDockerfile) { + if (! empty($this->detectedDockerfiles) && ! in_array($this->selectedDockerfile, $this->detectedDockerfiles, true)) { + $this->selectedDockerfile = $this->detectedDockerfiles[0]; + } $application_init['dockerfile_location'] = $this->selectedDockerfile; } if ($this->build_pack === 'dockercompose') { + if (! empty($this->detectedDockerComposeFiles) && $this->selectedDockerComposeFile + && ! in_array($this->selectedDockerComposeFile, $this->detectedDockerComposeFiles, true)) { + $this->selectedDockerComposeFile = $this->detectedDockerComposeFiles[0]; + $this->docker_compose_location = '/'.$this->selectedDockerComposeFile; + } $application_init['docker_compose_location'] = $this->docker_compose_location; $application_init['base_directory'] = $this->base_directory; } diff --git a/app/Services/RepositoryDetector.php b/app/Services/RepositoryDetector.php index fdb96411d..91b5de4f5 100644 --- a/app/Services/RepositoryDetector.php +++ b/app/Services/RepositoryDetector.php @@ -30,6 +30,11 @@ class RepositoryDetector ->first(); if (! $server) { + Log::debug('Repository detection skipped: server not found', [ + 'serverId' => $this->serverId, + 'teamId' => $this->teamId, + ]); + return RepositoryDetectionResult::none(); } @@ -48,13 +53,16 @@ class RepositoryDetector $workDir = escapeshellarg("{$tempDir}{$cdBase}"); $envPattern = self::ENV_FILE_PATTERN; + $escapedTempDir = escapeshellarg($tempDir); + $commands = collect([ - 'rm -rf -- '.escapeshellarg($tempDir), - 'git clone --depth 1 -b '.escapeshellarg($this->branch).' '.escapeshellarg($this->repositoryUrl).' '.escapeshellarg($tempDir).' >/dev/null 2>&1', + 'rm -rf -- '.$escapedTempDir, + "trap 'rm -rf -- {$escapedTempDir}' EXIT", + 'git clone --depth 1 -b '.escapeshellarg($this->branch).' '.escapeshellarg($this->repositoryUrl).' '.escapeshellarg($tempDir).' >/dev/null 2>&1 || git clone --depth 1 '.escapeshellarg($this->repositoryUrl).' '.escapeshellarg($tempDir).' >/dev/null 2>&1', "cd {$workDir}", // Collect file lists into shell variables - 'df_list=$(git ls-files | grep -i \'dockerfile\' || true)', - 'compose_list=$(git ls-files | grep -iE \'^(docker-compose\.(yml|yaml)|compose\.(yml|yaml))$\' || true)', + 'df_list=$(git ls-files | grep -iE \'(^|/)Dockerfile(\.[a-zA-Z0-9_-]+)?$\' || true)', + 'compose_list=$(git ls-files | grep -iE \'(^|/)(docker-compose\.(yml|yaml)|compose\.(yml|yaml))$\' || true)', 'env_list=$(git ls-files | grep -iE \''.$envPattern.'\' || true)', // Build env file contents as a JSON object (uses jq to safely encode file content) 'env_json=\'{}\'', @@ -79,7 +87,6 @@ class RepositoryDetector ' --argjson envFiles "$env_json" \\', ' --argjson dockerfilePorts "$port_json" \\', ' \'$ARGS.named\'', - 'rm -rf -- '.escapeshellarg($tempDir), ]); try { @@ -111,7 +118,7 @@ class RepositoryDetector $dockerfilePorts = []; foreach ($data['dockerfilePorts'] ?? [] as $file => $port) { - $dockerfilePorts[$file] = is_int($port) ? $port : null; + $dockerfilePorts[$file] = is_numeric($port) ? (int) $port : null; } return new RepositoryDetectionResult( diff --git a/app/Traits/HasRepositoryDetection.php b/app/Traits/HasRepositoryDetection.php index d4d8775e6..53078bd05 100644 --- a/app/Traits/HasRepositoryDetection.php +++ b/app/Traits/HasRepositoryDetection.php @@ -14,6 +14,8 @@ trait HasRepositoryDetection public ?string $selectedDockerfile = null; + public ?string $selectedDockerComposeFile = null; + public ?int $detectedPort = null; public array $dockerfilePorts = []; @@ -49,8 +51,9 @@ trait HasRepositoryDetection } } - if ($result->hasDockerCompose() && count($result->dockerComposeFiles) === 1) { - $this->docker_compose_location = '/'.$result->dockerComposeFiles[0]; + if ($result->hasDockerCompose()) { + $this->selectedDockerComposeFile = $result->dockerComposeFiles[0]; + $this->docker_compose_location = '/'.$this->selectedDockerComposeFile; } if ($result->hasEnvFiles()) { @@ -68,12 +71,31 @@ trait HasRepositoryDetection public function updatedSelectedDockerfile(): void { + if ($this->selectedDockerfile && ! in_array($this->selectedDockerfile, $this->detectedDockerfiles, true)) { + $this->selectedDockerfile = $this->detectedDockerfiles[0] ?? null; + } + if ($this->selectedDockerfile && isset($this->dockerfilePorts[$this->selectedDockerfile])) { $port = $this->dockerfilePorts[$this->selectedDockerfile]; if ($port) { $this->port = $port; $this->detectedPort = $port; + } else { + $this->detectedPort = null; } + } else { + $this->detectedPort = null; + } + } + + public function updatedSelectedDockerComposeFile(): void + { + if ($this->selectedDockerComposeFile && ! in_array($this->selectedDockerComposeFile, $this->detectedDockerComposeFiles, true)) { + $this->selectedDockerComposeFile = $this->detectedDockerComposeFiles[0] ?? null; + } + + if ($this->selectedDockerComposeFile) { + $this->docker_compose_location = '/'.$this->selectedDockerComposeFile; } } diff --git a/resources/views/livewire/project/new/github-private-repository-deploy-key.blade.php b/resources/views/livewire/project/new/github-private-repository-deploy-key.blade.php index cf32f17b8..04a3f8995 100644 --- a/resources/views/livewire/project/new/github-private-repository-deploy-key.blade.php +++ b/resources/views/livewire/project/new/github-private-repository-deploy-key.blade.php @@ -115,6 +115,14 @@ @endif @if ($build_pack === 'dockercompose') + @if (count($detectedDockerComposeFiles) > 1) + + @foreach ($detectedDockerComposeFiles as $cf) + + @endforeach + + @endif
+ @foreach ($detectedDockerComposeFiles as $cf) + + @endforeach + + @endif
+ wire:model="envExampleVars.{{ $key }}" />
@endforeach
diff --git a/resources/views/livewire/project/new/public-git-repository.blade.php b/resources/views/livewire/project/new/public-git-repository.blade.php index 1a84241ab..5e4cccd1e 100644 --- a/resources/views/livewire/project/new/public-git-repository.blade.php +++ b/resources/views/livewire/project/new/public-git-repository.blade.php @@ -99,6 +99,14 @@ @endif @if ($build_pack === 'dockercompose') + @if (count($detectedDockerComposeFiles) > 1) + + @foreach ($detectedDockerComposeFiles as $cf) + + @endforeach + + @endif