mime-todo-cli/lib/tracker.ts
Tiara Rodney 932d4ad420
init
2026-03-15 03:02:41 +01:00

99 lines
2.6 KiB
TypeScript

// Module and tracker part parsers
// application/modules — defines the repo's logical module structure
// application/bugzilla — maps modules to Bugzilla products/components
export interface Module {
name: string
path?: string
}
export interface BugzillaTrackerMapping {
module: string // references a module name
product: string // Bugzilla product
component: string // Bugzilla component
}
export interface BugzillaTracker {
url: string
mappings: BugzillaTrackerMapping[]
}
export function parseModules(text: string): Module[] {
const lines = text.split(/\r?\n/)
const modules: Module[] = []
let current: Partial<Module> | null = null
for (const line of lines) {
// Skip the "Modules:" header
if (/^\s*Modules:\s*$/.test(line)) continue
// Start of module entry
if (/^\s*-\s*(Name:.*)?$/.test(line)) {
if (current?.name) {
modules.push(current as Module)
}
current = {}
const match = line.match(/^\s*-\s*Name:\s*(.*)$/)
if (match) current.name = match[1]
continue
}
const kv = line.match(/^\s+([A-Za-z][A-Za-z0-9]*):\s*(.*)$/)
if (kv && current) {
if (kv[1] === "Name") current.name = kv[2]
else if (kv[1] === "Path") current.path = kv[2]
}
}
if (current?.name) {
modules.push(current as Module)
}
return modules
}
export function parseBugzillaTracker(text: string): BugzillaTracker {
const lines = text.split(/\r?\n/)
const tracker: Partial<BugzillaTracker> = {}
const mappings: BugzillaTrackerMapping[] = []
let inMappings = false
let current: Partial<BugzillaTrackerMapping> | null = null
for (const line of lines) {
if (!inMappings) {
if (line.startsWith("URL:")) {
tracker.url = line.slice("URL:".length).trim()
} else if (line.startsWith("Mappings:")) {
inMappings = true
}
continue
}
if (/^\s*-\s*(Module:.*)?$/.test(line)) {
if (current?.module && current?.product && current?.component) {
mappings.push(current as BugzillaTrackerMapping)
}
current = {}
const match = line.match(/^\s*-\s*Module:\s*(.*)$/)
if (match) current.module = match[1]
continue
}
const kv = line.match(/^\s+([A-Za-z][A-Za-z0-9]*):\s*(.*)$/)
if (kv && current) {
if (kv[1] === "Module") current.module = kv[2]
else if (kv[1] === "Product") current.product = kv[2]
else if (kv[1] === "Component") current.component = kv[2]
}
}
if (current?.module && current?.product && current?.component) {
mappings.push(current as BugzillaTrackerMapping)
}
tracker.mappings = mappings
return tracker as BugzillaTracker
}