import {
emptyIgnoreIndex,
parseGitignore,
parseLinguistGenerated,
type IgnoreIndex,
} from './classify.ts'
import { getRepoTextFile } from './github.ts'
import {
getRepoSettings,
getSetting,
listKnownGeneratedPaths,
setSetting,
} from './storage.ts'
export async function loadIgnoreIndex(): Promise<IgnoreIndex> {
const repo = await getRepoSettings()
const cacheKey = `ignore:${repo.owner}/${repo.repo}/${repo.branch}`
const cached = await getSetting(cacheKey)
let gitignore: string[] = []
let linguistGenerated: string[] = []
if (cached) {
try {
const parsed = JSON.parse(cached) as {
gitignore?: string[]
linguistGenerated?: string[]
}
gitignore = parsed.gitignore ?? []
linguistGenerated = parsed.linguistGenerated ?? []
} catch {
gitignore = []
linguistGenerated = []
}
} else {
const [gitignoreText, attributesText] = await Promise.all([
getRepoTextFile(repo, '.gitignore'),
getRepoTextFile(repo, '.gitattributes'),
])
gitignore = parseGitignore(gitignoreText ?? '')
linguistGenerated = parseLinguistGenerated(attributesText ?? '')
await setSetting(
cacheKey,
JSON.stringify({ gitignore, linguistGenerated, fetchedAt: new Date().toISOString() }),
)
}
const known = await listKnownGeneratedPaths()
return {
...emptyIgnoreIndex(),
gitignore: [],
linguistGenerated,
knownGeneratedPaths: new Set(known.keys()),
}
}
export async function refreshIgnoreIndex(): Promise<IgnoreIndex> {
const repo = await getRepoSettings()
await setSetting(`ignore:${repo.owner}/${repo.repo}/${repo.branch}`, '')
return loadIgnoreIndex()
}