/**
* pgh search commands
*
* Subcommands: repo, code
*/
import { table, jsonOut, log, error } from '../output.js'
export async function searchCommand (client, sub, args, flags) {
switch (sub) {
case 'repo':
case 'repos':
return searchRepo(client, args.join(' '), flags)
case 'code':
return searchCode(client, args.join(' '), flags)
default:
searchHelp()
}
}
async function searchRepo (client, query, flags) {
if (!query) error('Usage: pgh search repo <query>')
const params = new URLSearchParams({ q: query })
if (flags.limit) params.set('limit', flags.limit)
const data = await client.get(`/api/repos/search?${params}`)
if (flags.json) {
jsonOut(data)
return
}
if (!data.repos || data.repos.length === 0) {
log(`No repos matching "${query}"`)
return
}
table(data.repos, [
{ key: 'name', label: 'NAME', width: 30 },
{ key: 'commits', label: 'COMMITS' },
{ key: 'category', label: 'CATEGORY' },
{ key: 'relevance', label: 'RELEVANCE' }
])
}
async function searchCode (client, query, flags) {
if (!query) error('Usage: pgh search code <query>')
const params = new URLSearchParams({ q: query })
if (flags.repo) params.set('repo', flags.repo)
if (flags.limit) params.set('limit', flags.limit)
const data = await client.get(`/api/search/code?${params}`)
if (flags.json) {
jsonOut(data)
return
}
if (!data.results || data.results.length === 0) {
log(`No code matches for "${query}"`)
return
}
for (const result of data.results) {
log(`\n${result.repo}:`)
for (const match of result.matches) {
log(` ${match.file}:${match.line} ${match.text}`)
}
}
log(`\n${data.totalMatches} matches across ${data.results.length} repo(s)`)
}
export function searchHelp () {
log(`Usage: pgh search <subcommand> <query> [flags]
Subcommands:
repo <query> Search repositories
code <query> Search code across repos
Flags:
--repo <name> Filter code search to repo
--limit <n> Max results
--json Output as JSON`)
}