무엇이·왜·어떻게 바뀌었나 — 그리고 바뀐 수집 시퀀스
아래 ›(또는 점) 클릭으로 넘기기누락 점검 스크립트는 이렇게 비교했다:
go.mod의 module 라인(= declared module path).go.mod를 봐서 진짜 module path로 저장해야 한다..git)·subpath·declared-diff가 "누락"으로 보임ai_ci — Foo/Bar와 foo/bar가 한 행으로 합쳐져 덮어쓰기| 항목 | 기존 (V1) | 변경 (V2) |
|---|---|---|
| 목록 grain | index path 1개당 1행, 버전 미저장 | (path, version) 이벤트당 1행, 버전 저장 |
| 식별·중복 | LOWER 비교 (대소문자 무시) | 해시 PK + as_cs (대소문자 구분) |
| 존재 판단 | pkg.go.dev 의존 → 404면 누락 | proxy 기준 (pkg.go.dev는 metadata만) |
| 대표 키 | index path 그대로 | go.mod declared module path |
| 대소문자 모듈 | 합쳐져 손실 | gatheringdb as_cs로 보존 |
| 재수집 | 개념 약함 | RESYNC 컬럼 / GO_RESYNC_ALL |
| 패턴 | 예시 | V2 처리 |
|---|---|---|
| proxy만 있음 (pkg.go.dev 404) | codeberg.org/go-toolbox/x | proxy로 수집. @v/list 비면 @latest 한 개 |
| declared가 index에 없음 | …/juxianjinggan/src → 2024-contexts… | index path로 fetch, declared로 저장, index행 processed=6 |
alias .git | …/latex.git → …/latex | .git행은 processed=6, 비-.git이 대표 |
| subpath(하위 패키지) | …/diana/widevine → …/diana | .mod의 module root를 대표 키로 |
| 대소문자 | eduVPN vs eduvpn | 별개 모듈로 보존, proxy는 ! escape |
| 중복 index 이벤트 | 같은 path 여러 번 | 중복 제거 후 1회 판단 |
Path 받음 (버전은 목록에 안 남김)Path.lower() ↔ LOWER(PRODUCT_KEY) 비교로 있나 확인go.mod declared path 해결·alias/subpath 분기가 약함(INDEX_PATH, INDEX_VERSION) claimRESYNC=1이면 건너뛰고 재수집)go.mod fetch (없으면 @latest fallback)module 라인 → declared module path, store=declared or indexprocessed=1, 다르면 processed=6, deprecated=1proxy.golang.org (@v/list → @latest)가 존재 기준. pkg.go.dev는 metadata 보강용processed=6 의 의미 — "수집 실패"가 아니라 "이 index path는 대표 키가 아니라서 declared module path 쪽으로 저장했다"는 표시.
index path를 소문자로 비교하던 방식 →
이벤트 단위 큐 + go.mod로 진짜 module path 해결 + 대소문자 구분 저장(proxy 기준 존재 판단)으로 바꿔
누락·오저장·대소문자 손실을 없앴다.