func main() { var g regexp.Grep g.AddFlags() g.Stdout = os.Stdout g.Stderr = os.Stderr flag.Usage = usage flag.Parse() args := flag.Args() if len(args) == 0 { flag.Usage() } pat := "(?m)" + args[0] if *iflag { pat = "(?i)" + pat } re, err := regexp.Compile(pat) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } g.Regexp = re if len(args) == 1 { g.Reader(os.Stdin, "stdin") } else { for _, arg := range args[1:] { g.File(arg) } } if !g.Match { os.Exit(1) } }
func (r *Regexp) Compile() (*regexp.Regexp, error) { if r.Expr == "" { return nil, errors.New("Empty search regexp provided.") } expr := r.Expr if r.CaseSensitive { expr = "(?i)" + expr } return regexp.Compile(expr) }
func main() { var g regexp.Grep g.AddFlags() g.Stdout = os.Stdout g.Stderr = os.Stderr flag.Usage = usage flag.Parse() args := flag.Args() if len(args) == 0 { flag.Usage() } if *cpuProfile != "" { f, err := os.Create(*cpuProfile) if err != nil { log.Fatal(err) } defer f.Close() pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } pat := "(?m)" + args[0] if *iflag { pat = "(?i)" + pat } re, err := regexp.Compile(pat) if err != nil { log.Fatal(err) } g.Regexp = re if len(args) == 1 { g.Reader(os.Stdin, "<standard input>") } else { for _, arg := range args[1:] { g.File(arg) } } if !g.Match { os.Exit(1) } }
func main() { var g regexp.Grep g.AddFlags() g.Stdout = os.Stdout g.Stderr = os.Stderr flag.Usage = usage flag.Parse() args := flag.Args() if len(args) == 0 { flag.Usage() } pat := "(?m)" + strings.Join(args, ".*") if *iflag { pat = "(?i)" + pat } re, err := regexp.Compile(pat) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } g.Regexp = re walker := fs.Walk(".") for walker.Step() { if walker.Stat().IsDir() { if strings.Contains(walker.Path(), ".git") { walker.SkipDir() } continue } g.File(walker.Path()) } if err := walker.Err(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } if !g.Match { os.Exit(1) } }
// Handles requests to /index by compiling the q= parameter into a regular // expression (codesearch/regexp), searching the index for it and returning the // list of matching filenames in a JSON array. // TODO: This doesn’t handle file name regular expressions at all yet. // TODO: errors aren’t properly signaled to the requester func (s *server) Files(ctx context.Context, in *proto.FilesRequest) (*proto.FilesReply, error) { if *cpuProfile != "" { f, err := os.Create(*cpuProfile) if err != nil { log.Fatal(err) } defer f.Close() pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } re, err := regexp.Compile(in.Query) if err != nil { return nil, fmt.Errorf("regexp.Compile: %s\n", err) } query := index.RegexpQuery(re.Syntax) log.Printf("[%s] query: text = %s, regexp = %s\n", s.id, in.Query, query) return &proto.FilesReply{ Path: s.doPostingQuery(query), }, nil }
func Main() { g := regexp.Grep{ Stdout: os.Stdout, Stderr: os.Stderr, } g.AddFlags() flag.Usage = usage flag.Parse() args := flag.Args() if len(args) != 1 { usage() } if *cpuProfile != "" { f, err := os.Create(*cpuProfile) if err != nil { log.Fatal(err) } defer f.Close() pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } pat := "(?m)" + args[0] if *iFlag { pat = "(?i)" + pat } re, err := regexp.Compile(pat) if err != nil { log.Fatal(err) } g.Regexp = re var fre *regexp.Regexp if *fFlag != "" { fre, err = regexp.Compile(*fFlag) if err != nil { log.Fatal(err) } } q := index.RegexpQuery(re.Syntax) if *verboseFlag { log.Printf("query: %s\n", q) } ix := index.Open(index.File()) ix.Verbose = *verboseFlag var post []uint32 if *bruteFlag { post = ix.PostingQuery(&index.Query{Op: index.QAll}) } else { post = ix.PostingQuery(q) } if *verboseFlag { log.Printf("post query identified %d possible files\n", len(post)) } if fre != nil { fnames := make([]uint32, 0, len(post)) for _, fileid := range post { name := ix.Name(fileid) if fre.MatchString(name, true, true) < 0 { continue } fnames = append(fnames, fileid) } if *verboseFlag { log.Printf("filename regexp matched %d files\n", len(fnames)) } post = fnames } for _, fileid := range post { name := ix.Name(fileid) g.File(name) } matches = g.Match }