Skip to content

src/buckets.ts

55 lines · 1.3 KB · TypeScript
Raw
import { classifyPath, type IgnoreIndex } from './classify.ts'
import type { BucketDelta, FileKind } from './types.ts'

export function accumulateBuckets(
	files: Array<{
		filename: string
		additions?: number
		deletions?: number
		patch?: string
	}>,
	ignore: IgnoreIndex,
) {
	const buckets = new Map<string, BucketDelta>()
	let skippedFiles = 0
	let countedFiles = 0
	const generatedToRemember: Array<{ path: string; reason: string }> = []

	for (const file of files) {
		const classification = classifyPath(file.filename, {
			patch: file.patch,
			ignore,
		})
		if (!classification.countable) {
			skippedFiles += 1
			if (
				classification.reason === 'generated-content-marker' ||
				classification.reason.startsWith('generated')
			) {
				generatedToRemember.push({
					path: file.filename,
					reason: classification.reason,
				})
			}
			continue
		}
		countedFiles += 1
		const key = `${classification.language}\t${classification.kind}`
		const current = buckets.get(key) ?? {
			language: classification.language,
			kind: classification.kind as FileKind,
			additions: 0,
			deletions: 0,
		}
		current.additions += file.additions ?? 0
		current.deletions += file.deletions ?? 0
		buckets.set(key, current)
	}

	return {
		buckets: [...buckets.values()],
		skippedFiles,
		countedFiles,
		generatedToRemember,
	}
}