From 60275115857de15e3d3db2556e3fca8017a9f2fe Mon Sep 17 00:00:00 2001 From: E98Developer Date: Sun, 16 Aug 2026 06:59:04 +0200 Subject: [PATCH] =?UTF-8?q?FIX=20Deployment=20csomagol=C3=B3=20phase1=20gi?= =?UTF-8?q?t=20ikon=20=C3=A9s=20a=20commit=20t=C3=B6rzs=C3=A9re=20kiterjes?= =?UTF-8?q?ztett=20keres=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - a topbar menüpont a most bemásolt git ikont használja; a fájl ico_gitpng néven érkezett, átnevezve ico_git.png-re, hogy illeszkedjen az ico_*.png konvencióhoz, amiből a nav az útvonalat építi - a git log a törzset (%b) is elkéri, és a keresés a tárgysor mellett ebben is keres: a hash-re ritkán keres ember, az érdemi leírás viszont gyakran a törzsben van - a --shortstat sora a törzs után érkezik, ezért a parse leválasztja róla, különben a "N files changed" szöveg a törzsbe és a keresésbe is beszivárogna Co-Authored-By: Claude Opus 5 --- app/Filament/Pages/DeploymentPackage.php | 13 +++++-- app/Services/Deployment/GitRepository.php | 35 ++++++++++++------ public/images/icons/ico_git.png | Bin 0 -> 2548 bytes .../components/speed-button-nav-bar.blade.php | 2 +- .../views/layout/speedButtonNavBar.blade.php | 2 +- tests/Feature/DeploymentPackageTest.php | 21 ++++++++++- 6 files changed, 53 insertions(+), 20 deletions(-) create mode 100644 public/images/icons/ico_git.png diff --git a/app/Filament/Pages/DeploymentPackage.php b/app/Filament/Pages/DeploymentPackage.php index 8d4144a..2ab29f0 100644 --- a/app/Filament/Pages/DeploymentPackage.php +++ b/app/Filament/Pages/DeploymentPackage.php @@ -99,8 +99,8 @@ public function form(Schema $form): Schema ->live(), TextInput::make('search') ->label('Keresés') - ->placeholder('hash, üzenet vagy szerző') - ->helperText('A betöltött listán belül szűr.') + ->placeholder('pl. árlista, migráció, szerző') + ->helperText('A commit üzenetében (a törzsben is), a szerzőben és a hashben keres, a betöltött listán belül.') ->live(debounce: 400), ]), ]) @@ -143,7 +143,7 @@ public function target(): ?array } /** - * @return array + * @return array */ #[Computed] public function commits(): array @@ -168,9 +168,14 @@ public function commits(): array return $commits; } + $needle = mb_strtolower($search); + return array_values(array_filter( $commits, - fn (array $commit): bool => str_contains(mb_strtolower($commit['subject'].' '.$commit['author'].' '.$commit['hash']), mb_strtolower($search)), + fn (array $commit): bool => str_contains( + mb_strtolower(implode(' ', [$commit['subject'], $commit['body'], $commit['author'], $commit['hash']])), + $needle, + ), )); } diff --git a/app/Services/Deployment/GitRepository.php b/app/Services/Deployment/GitRepository.php index 8e13031..4d84b2f 100644 --- a/app/Services/Deployment/GitRepository.php +++ b/app/Services/Deployment/GitRepository.php @@ -73,17 +73,20 @@ public function branches(): array /** * Commitlista egy referenciáról, legfrissebbtől visszafelé. * - * A --shortstat miatt minden commit után megjelenik a "N files changed" sor is, - * ezt az utolsó mezőből (a tárgyból) bányásszuk ki - így nem kell commitonként - * külön git hívás a fájlszámhoz. + * A törzset (%b) is elkérjük, mert a felületen erre is lehet keresni - a commit + * üzenet érdemi része nálunk gyakran a törzsben van, nem a tárgysorban. * - * @return array + * A --shortstat miatt minden commit után megjelenik a "N files changed" sor is, + * ezt az utolsó mezőből bányásszuk ki - így nem kell commitonként külön git hívás + * a fájlszámhoz. + * + * @return array */ public function commits(string $reference, int $limit): array { $this->assertReference($reference); - $format = self::RECORD_SEPARATOR.implode(self::FIELD_SEPARATOR, ['%H', '%h', '%an', '%aI', '%s']); + $format = self::RECORD_SEPARATOR.implode(self::FIELD_SEPARATOR, ['%H', '%h', '%an', '%aI', '%s', '%b']); $output = $this->run([ 'log', @@ -102,23 +105,31 @@ public function commits(string $reference, int $limit): array continue; } - $fields = explode(self::FIELD_SEPARATOR, $record, 5); + $fields = explode(self::FIELD_SEPARATOR, $record, 6); - if (count($fields) < 5) { + if (count($fields) < 6) { continue; } - [$hash, $short, $author, $date, $tail] = $fields; + [$hash, $short, $author, $date, $subject, $tail] = $fields; + + // A --shortstat sora a törzs UTÁN érkezik, ezért előbb leválasztjuk róla: + // enélkül a "3 files changed" szöveg a keresésbe és a törzsbe is beszivárogna. + $fileCount = null; + + if (preg_match('/\n\s*(\d+)\s+files?\s+changed[^\n]*\n?$/', $tail, $matches) === 1) { + $fileCount = (int) $matches[1]; + $tail = substr($tail, 0, -strlen($matches[0])); + } $commits[] = [ 'hash' => $hash, 'short' => $short, 'author' => $author, 'date' => $date, - 'subject' => trim(explode("\n", $tail, 2)[0]), - 'file_count' => preg_match('/(\d+)\s+files?\s+changed/', $tail, $matches) === 1 - ? (int) $matches[1] - : null, + 'subject' => trim($subject), + 'body' => trim($tail), + 'file_count' => $fileCount, ]; } diff --git a/public/images/icons/ico_git.png b/public/images/icons/ico_git.png new file mode 100644 index 0000000000000000000000000000000000000000..667bc5e503eeb361a8d18ffcb6984a51fcabafc1 GIT binary patch literal 2548 zcmbtWdsq`!7Qd4L5;T}7TR~U|ty^HrN))W1JSKvQpbIGSp%s=OuIv^qP<4p{Gb38@ z33Po_EfCzbf?9=&T9LwHSk7Kpp2&!#`1PAsGm>w6ocR1X(_oZ; zA9*u6b7WjI0WcHDjN#*z)IjtQ=yfJ@#yjO#q8iu@Zt`qouv#72TLchbkbJ?}_{+vR;yw~8G-#bGOgAwGxYY6{t$ zY{}}Lm+!D=W5f>4btf>&n??;Zs)a_`{Lwh*2QbHF?oV8-2s@4A$w2F#ALnB8dXS@kVT&X3Mgw_ znB-gViA%7-ZJB83wb+ygl~7Dg&TvblgKyKLD^*9J7~$^W`+fGlO(SJf^L=C#8B(@i zoE#I18vP{8J^jFOrJrPFNj&r?GU!T3&%~RqM9tuvi6zdsTnp!KNIwTwp{d;RhiZ6G z-_TN5F9KW8W_olA>Noo|6WO3FRfgqQ!7%wZN&*Vdx!3`~BB@QJxrAN%q8lR@@^q$815g7$&s?LZ_dp>qw zTHK#22#|e9Qn$F-UWBC-D(*Ml*^a~J=RuDF`&C2k0@YeHYn?-Isj^7{qFyx^=Lg|{ zuv}~7ddZ|np`Gcu#rr(~p~lID5ui+pXs!zIHeo=G+hTkUk(c>`<*RGhdJDWmzSqKv zH#t%%|KQ>J5sRV;1s-T2vCiIW{F)`xK3?Nvn%PI#GPA*|W>xE*Ndv4Rr>H3?8!f=@ zGh?vBtRR?ZCQxQF%2Wh&)M$lnqH?LKMgTP3#_nnA8G@gt4uNA#YN#x@AY|ckTT%)8 z+?^Yr399_{ZL@9N9E9#&B$qroIM>EiqIIr_iU7ONLc~+{Xbs1!BW_#{Z!YIRx6F=I zF}wD>+jKFd&j}`VM5u3L`ZX9G`)sW$AwJQJEW#7uvM?O+#IybG2j09Ksg$~?S{g3K zYBrE&%b^4A!>5-O6MfK)Pu+)idVZG0t{c6~x$86U)cCrK*6zF6_En61@!SL=~L%);V*aam0D&ZX^O$=s{o9yBA5 ziJ}bhlE;in0U`kM9OQeiHO5P`QbY2%qp7A7Q&@SdRbMyMX$fS8II^6@45|Z)M*V(%B!>h12fr&APpx zO_5WOgK3_@Y=BQZCK}tKrL+@#!U?VNEI_Tmsc}yvclcplFcV(Ljs9eW*o#m5ZCjK1vLadYyV{s2ZsaDYQ zp;;&)vGM1^Rb3ja2)O6xOp#iCW#FE%ds%m-Bx{#2gYKkAFAqynJamj zge>OW9Aaj98yuq!+Nyu8I&UT+7RT&tGQgW6H7yz*U%X_`{%{Njf%#$i6bJH#GhXP6 zIAYb#e2Nb_v<^Jf@aC%0I+x~CUeMLo>ug=h1W;l)b{Z^te{u_R2|&%y-(?$&ih%s{ zDG}7M&9cAM{@ndZ!{OPr{5v1ec@(#EnS5;I2{6P{-0_`%O{JswB?xRPviAM6LN0~; z)tv=R3o5POWE~h7O{Taig>cd(A+@H7NBTA)!2L@IeI8U?fw=1ju12w?UZr53TTCD=az z0fR>Pmtc$h-?7#R{|tlErKhV8KD!8W@if<2m40^D`(2uQ>C3Qdm(y=f)5YUl#2SzJ zqmv0MpRU{x7-b+umaS Pu|V|d*i| 'deploymentPackage', 'displayName' => 'Deployment', 'icon' => 'upload', 'link' => \App\Filament\Pages\DeploymentPackage::getUrl(), 'roles' => ['root','developer']]; + $modules[] = ['name' => 'deploymentPackage', 'displayName' => 'Deployment', 'icon' => 'git', 'link' => \App\Filament\Pages\DeploymentPackage::getUrl(), 'roles' => ['root','developer']]; } @endphp diff --git a/resources/views/layout/speedButtonNavBar.blade.php b/resources/views/layout/speedButtonNavBar.blade.php index 77c9724..12ec7c1 100644 --- a/resources/views/layout/speedButtonNavBar.blade.php +++ b/resources/views/layout/speedButtonNavBar.blade.php @@ -179,7 +179,7 @@ $Modules['deploymentPackage'] = [ 'name' => 'deploymentPackage', 'DisplayName' => 'Deployment', - 'icon' => 'upload', + 'icon' => 'git', 'link' => \App\Filament\Pages\DeploymentPackage::getUrl(), 'noAjax' => true, 'roles' => ['root', 'developer'], diff --git a/tests/Feature/DeploymentPackageTest.php b/tests/Feature/DeploymentPackageTest.php index c35fc51..dd27870 100644 --- a/tests/Feature/DeploymentPackageTest.php +++ b/tests/Feature/DeploymentPackageTest.php @@ -87,7 +87,7 @@ function deploymentTestRepository(): array File::put($path.'/database/migrations/2026_01_01_000000_teszt.php', "and($commits[0]['subject'])->toBe('harmadik commit') ->and($commits[2]['subject'])->toBe('első commit') ->and($commits[0]['hash'])->toHaveLength(40) - ->and($commits[0]['file_count'])->toBe(2); + ->and($commits[0]['file_count'])->toBe(2) + // A törzs a tárgysor nélkül jön, és nem tapad hozzá a --shortstat sora sem. + ->and($commits[1]['body'])->toBe('A törzsben említett árlista részlet.') + ->and($commits[0]['body'])->toBe(''); + + deploymentCleanup($repository['path']); +}); + +test('a keresés a commit törzsében is talál, nem csak a tárgysorban', function () { + deploymentAllowEnvironment(); + $repository = deploymentTestRepository(); + + $this->actingAs(deploymentDeveloper()); + + Livewire::test(DeploymentPackage::class) + ->set('data.search', 'árlista részlet') + ->assertSee('második commit') + ->assertDontSee('harmadik commit'); deploymentCleanup($repository['path']); });