- 템플릿 update 는 레이아웃 변경 여부와 무관하게 캐시 버전을 올리고(실패 복원 뒤에도), 자산 주소 방식 전환 3경로도 bump 한다 - config:cache 가 컨테이너 인스턴스를 덮어 이후 terminating 재게시가 사라지던 결함을 복원 헬퍼로 차단 - custom/ 변경 감지와 게시가 같은 열거자(재귀·크기 포함)를 쓰고, 서명은 호스트별로 저장 - 캐시 버전·서명 키를 만료시키지 않는다(기본 TTL 24h 로 매일 전체 재생성되던 문제) - 관리자 > 환경설정 > 일반 「초기 화면 정적 파일」 카드: 상태 조회 + 지금 다시 만들기(확인 모달), 대시보드 알림 버튼 연결, CLI 와 같은 statusReport 소비 - sudo core:update 경로의 root 소유 잔존(설정 디렉토리·임시 폴더·로그·업그레이드 마이그레이션 산출물) 상속·정합화, ext-static 명령 root 경고와 sudo -u 힌트 - 안내·문서·트러블슈팅 4건·audit 룰 ext-cache-version-raw-read·ja 언어팩 동기
79 lines
3.0 KiB
PHP
79 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\Upgrade;
|
|
|
|
use PHPUnit\Framework\Attributes\Test;
|
|
use Tests\TestCase;
|
|
|
|
/**
|
|
* 번들 확장 업그레이드 마이그레이션의 파일 쓰기 소유권 상속 패리티 (#651 B3).
|
|
*
|
|
* 업그레이드 스텝은 sudo 코어 업데이트 안에서 root 로 실행될 수 있다. `File::put()` 으로 설정 파일을
|
|
* 쓰는 스텝 중 일부(gdpr 02·ckeditor5·pay_*)는 `inheritOwnershipFromParent` 를 부르고 일부는 부르지
|
|
* 않아 진영이 갈렸다 — 지금은 전부 기존 파일 갱신이라 inode 소유자가 보존되지만, "없으면 생성" 으로
|
|
* 바뀌는 순간 root 소유 파일이 남는다.
|
|
*
|
|
* 모집단은 **파일시스템에서 파생**한다 — 8개 파일을 열거하면 9번째 마이그레이션이 사각이 된다.
|
|
*/
|
|
class BundledUpgradeMigrationOwnershipParityTest extends TestCase
|
|
{
|
|
/**
|
|
* `File::put(` 뒤 5줄 안에 상속 호출이 없는 마이그레이션 파일을 모읍니다.
|
|
*
|
|
* @return array<int, string> 위반 파일 (base_path 상대)
|
|
*/
|
|
private function collectViolations(): array
|
|
{
|
|
$pattern = base_path('{modules,plugins}/_bundled/*/upgrades');
|
|
$violations = [];
|
|
$population = 0;
|
|
|
|
foreach (glob($pattern, GLOB_BRACE) ?: [] as $upgradesDir) {
|
|
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($upgradesDir, \FilesystemIterator::SKIP_DOTS));
|
|
|
|
/** @var \SplFileInfo $file */
|
|
foreach ($iterator as $file) {
|
|
if (! $file->isFile() || strtolower($file->getExtension()) !== 'php') {
|
|
continue;
|
|
}
|
|
|
|
$lines = file($file->getPathname(), FILE_IGNORE_NEW_LINES) ?: [];
|
|
|
|
foreach ($lines as $index => $line) {
|
|
if (! str_contains($line, 'File::put(')) {
|
|
continue;
|
|
}
|
|
|
|
$population++;
|
|
$window = implode("\n", array_slice($lines, $index, 6));
|
|
|
|
if (! str_contains($window, 'inheritOwnershipFromParent')) {
|
|
$violations[] = str_replace('\\', '/', substr($file->getPathname(), strlen(base_path()) + 1)).':'.($index + 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->assertGreaterThan(0, $population, '모집단이 비었다 — 번들 확장 upgrades 에서 File::put 을 찾지 못했다 (판정식 회귀 의심)');
|
|
|
|
return $violations;
|
|
}
|
|
|
|
/**
|
|
* 모든 `File::put(` 은 5줄 안에 `inheritOwnershipFromParent` 를 동반한다.
|
|
*
|
|
* @effects bundled_upgrade_migrations_inherit_ownership
|
|
*/
|
|
#[Test]
|
|
public function 번들_업그레이드_마이그레이션의_파일_쓰기는_전부_소유권을_상속한다(): void
|
|
{
|
|
$violations = $this->collectViolations();
|
|
|
|
$this->assertSame(
|
|
[],
|
|
$violations,
|
|
"File::put 뒤 소유권 상속이 없는 업그레이드 마이그레이션:\n - ".implode("\n - ", $violations)
|
|
);
|
|
}
|
|
}
|