(args []string)
| 30 | ` |
| 31 | |
| 32 | func query(args []string) error { |
| 33 | fset := flag.NewFlagSet("query", flag.ExitOnError) |
| 34 | fset.Usage = usage(fset, queryHelp) |
| 35 | var target string |
| 36 | fset.StringVar(&target, "target", "codesearch.debian.net:443", "gRPC target address") |
| 37 | var insecure bool |
| 38 | fset.BoolVar(&insecure, "insecure", false, "skip TLS certificate verification") |
| 39 | var grpcEnableLog bool |
| 40 | fset.BoolVar(&grpcEnableLog, "grpclog", false, "enable gRPC verbose logging for debugging") |
| 41 | var apikey string |
| 42 | fset.StringVar(&apikey, "apikey", |
| 43 | // API key for codesearch.debian.net for subject |
| 44 | // “program!github.com/Debian/dcs/cmd/dcs”: |
| 45 | "MTU5OTI5NzQzN3xDU1d4UE0yZllVUk9TVXRfdmxicEhIdUxiU3YzTkxGRjZNRl90WUc4bUg1OVdqNU9CM3RQaXFsa0xaRGdZRlZPSWNCZG1QNGZ3ZUNEcXp2SGdocVlEc1dkQmxRSUh0dmZoM0xKazRrPXx5ED9o0r-7uawKvV_K0Fb4QdbHsTV1qfY0XYFrl_904g==", |
| 46 | "Debian Code Search API key to use, see https://codesearch.debian.net/apikeys/ for more details. Please get an API key if you are doing automated queries.") |
| 47 | if err := fset.Parse(args); err != nil { |
| 48 | return err |
| 49 | } |
| 50 | if fset.NArg() < 1 { |
| 51 | return fmt.Errorf("Usage: query <search term(s)>") |
| 52 | } |
| 53 | log.Printf("dialing %s", target) |
| 54 | |
| 55 | if grpcEnableLog { |
| 56 | grpclog.SetLoggerV2(grpclog.NewLoggerV2WithVerbosity(os.Stderr, os.Stderr, os.Stderr, 2)) |
| 57 | } |
| 58 | |
| 59 | creds := credentials.NewTLS(&tls.Config{ |
| 60 | InsecureSkipVerify: insecure, |
| 61 | }) |
| 62 | conn, err := grpc.Dial(target, |
| 63 | grpc.WithTransportCredentials(creds), |
| 64 | grpc.WithBlock()) |
| 65 | if err != nil { |
| 66 | return err |
| 67 | } |
| 68 | log.Printf("sending Search query") |
| 69 | dcs := dcspb.NewDCSClient(conn) |
| 70 | stream, err := dcs.Search(context.Background(), &dcspb.SearchRequest{ |
| 71 | Query: strings.Join(fset.Args(), " "), |
| 72 | Apikey: apikey, |
| 73 | }) |
| 74 | if err != nil { |
| 75 | return err |
| 76 | } |
| 77 | for { |
| 78 | event, err := stream.Recv() |
| 79 | if err == io.EOF { |
| 80 | break |
| 81 | } |
| 82 | if err != nil { |
| 83 | return err |
| 84 | } |
| 85 | switch ev := event.Data.(type) { |
| 86 | case *dcspb.Event_Progress: |
| 87 | log.Printf("progress: %v of %v files searched (%.2f%%)", |
| 88 | ev.Progress.FilesProcessed, |
| 89 | ev.Progress.FilesTotal, |
no test coverage detected