OverviewFilesCommitsIssuesDocsReleasesPeers

pear-git / lib / cli / commands / search.js

88 lines · javascript ref:
/**
 * 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`)
}