# DJB 커스텀 소스 납품본 수집 발주사 납품용으로, 기준 시점 이후 **신규로 추가된 커스텀 소스 파일**만 모아 디렉터리 구조를 유지한 채 한곳에 복사하고 `MANIFEST.csv` / `SUMMARY.md` / zip 을 만든다. ## 파일 | 파일 | 용도 | |---|---| | `export-custom.sh` | macOS / Linux 실행 스크립트 | | `export-custom.ps1` | Windows PowerShell 실행 스크립트 (실제 로직) | | `export-custom.bat` | Windows cmd 래퍼 — 인자를 `.ps1` 로 그대로 전달 | | `modules.conf` | 대상 모듈 / 소스 경로 / 수집 확장자 | | `export-filter.rules` | 포함·제외 규칙 (`.gitignore` 유사 문법) | | `filelist.txt` | 마지막으로 뽑은 수집 대상 목록 (검토용, 재생성 가능) | | `filelist-no-djb-marker.txt` | 그중 `djb` / `custom` 마커가 **없는** 파일 — 업그레이드 유입분 검토 대상 | ## 수집 방식 1. 모듈별로 **컷오프 날짜 직전의 마지막 커밋**을 base 로 잡는다. `git rev-list -1 --before= HEAD` 컷오프 이전 커밋이 아예 없으면 저장소 전체를 신규로 본다. 2. `git diff --name-only --diff-filter=A -M HEAD -- <소스경로>` 로 **신규 추가(A)** 파일만 뽑는다. `-M` 이라 단순 rename 은 신규로 잡히지 않는다. 3. `modules.conf` 의 확장자 allowlist 로 거른다. (확장자 없는 파일은 제외) 4. `export-filter.rules` 로 포함·제외를 최종 결정한다. 5. 남은 파일을 `/src/<모듈>/<원래 경로>` 로 복사한다. ## 사용법 ```bash # macOS / Linux ./export-custom.sh --dry-run > filelist.txt # 목록만 뽑기 (로그는 stderr) ./export-custom.sh --show-excluded # 규칙에 걸려 빠진 목록 + 걸린 규칙 ./export-custom.sh # 실제 수집 ./export-custom.sh --zip # 수집 + zip ./export-custom.sh -c 2026-05-01 -m eapim-portal ``` ```powershell # Windows .\export-custom.ps1 -DryRun > filelist.txt .\export-custom.ps1 -ShowExcluded .\export-custom.ps1 -Zip .\export-custom.ps1 -Cutoff 2026-05-01 -Module eapim-portal,eapim-admin # cmd 에서 export-custom.bat -DryRun > filelist.txt ``` ### 주요 옵션 | sh | ps1 | 설명 | |---|---|---| | `-c, --cutoff` | `-Cutoff` | 기준 날짜 (기본 `2026-05-01`) | | `-r, --root` | `-Root` | 저장소 루트. 미지정 시 스크립트 위치 기준 자동 탐지 | | `-o, --out` | `-Out` | 출력 디렉터리 (기본 `/build/djb-custom-export`) | | `-m, --module` | `-Module` | 특정 모듈만 | | `--zip` | `-Zip` | zip 생성 | | `--include-untracked` | `-IncludeUntracked` | 미커밋 신규 파일도 포함 | | `--dry-run` | `-DryRun` | 복사 없이 목록만 | | `--show-excluded` | `-ShowExcluded` | 규칙에 걸려 빠진 목록 | ## `export-filter.rules` 문법 `.gitignore` 와 비슷하되 더 단순하다. - 한 줄에 패턴 하나. `#` 주석, 빈 줄 무시 - 기본은 **모두 포함**. 패턴에 걸리면 제외 - `!` 로 시작하면 예외(다시 포함) - **뒤에 오는 규칙이 앞 규칙을 덮는다** — 순서가 중요하다 - 패턴에 `/` 가 있으면 `<모듈>/<경로>` 전체와 매칭, 없으면 파일명만 매칭 - `/` 로 끝나면 그 디렉터리 하위 전체 - `*` 는 `/` 도 포함해 매칭한다 (단순 glob, `**` 없음) 매칭 대상 경로 예: ``` eapim-portal/src/main/java/com/eactive/apim/portal/djb/webhook/WebhookService.java eapim-admin/WebContent/jsp/onl/apim/webhook/webhookList.jsp ``` 규칙 파일은 세 구역으로 나뉜다. 1. **업그레이드 유입분 제외** — `filelist-no-djb-marker.txt` 를 검토하며 채운다 2. **`!*djb*` 예외** — djb 마커가 붙은 파일은 커스텀이므로 되살린다 3. **무조건 제외** — 빌드 산출물·서드파티. 2)보다 뒤에 있어 최종 승리한다 ## 신규지만 커스텀이 아닌 파일 걸러내기 신규 파일이라도 제품 업그레이드로 딸려 온 것일 수 있다. 판별 순서: ```bash # 1) 전체 목록 ./export-custom.sh --dry-run > filelist.txt # 2) djb / custom 마커가 없는 것 = 검토 대상 grep -vi djb filelist.txt | grep -v '/custom/' > filelist-no-djb-marker.txt # 3) 검토 후 업그레이드 유입분을 export-filter.rules 의 1) 구역에 추가 # 4) 반영 확인 ./export-custom.sh --show-excluded ``` ## 주의 - 컷오프 이전 커밋이 없으면 base 가 **빈 트리**가 되어 저장소 전체가 신규로 잡힌다. `SUMMARY.md` 의 base 컬럼에 `(컷오프 이전 커밋 없음 …)` 으로 표시된다. - 모듈에 컷오프 직전 커밋이 드문드문 있으면 base 가 컷오프보다 훨씬 이전으로 잡힐 수 있다. 실행 로그의 `base:` 날짜를 항상 확인할 것. - 추가된 뒤 삭제·이동된 파일은 현재 트리에 없으므로 건너뛰고, 건수를 `SUMMARY.md` 에 남긴다.