in cmd/zoekt-test/main.go [66:166]
func compare(dir, patfile string, caseSensitive bool) error {
indexDir, err := ioutil.TempDir("", "")
if err != nil {
return err
}
defer os.RemoveAll(indexDir)
var opts build.Options
opts.SetDefaults()
opts.IndexDir = indexDir
fileContents, err := readTree(dir)
if err != nil {
return err
}
if len(fileContents) == 0 {
return fmt.Errorf("no contents")
}
builder, err := build.NewBuilder(opts)
if err != nil {
return err
}
for k, v := range fileContents {
builder.AddFile(k, v)
}
if err := builder.Finish(); err != nil {
return err
}
if !caseSensitive {
for k, v := range fileContents {
fileContents[k] = toLower(v)
}
}
f, err := os.Open(patfile)
if err != nil {
return err
}
searcher, err := shards.NewDirectorySearcher(indexDir)
if err != nil {
return err
}
scanner := bufio.NewScanner(f)
for scanner.Scan() {
t := scanner.Text()
if len(t) < 3 {
continue
}
q := &query.Substring{
Pattern: t,
CaseSensitive: caseSensitive,
}
zFiles := map[string]struct{}{}
rFiles := map[string]struct{}{}
// search engine results
var opts zoekt.SearchOptions
res, err := searcher.Search(context.Background(), q, &opts)
if err != nil {
return err
}
for _, f := range res.Files {
zFiles[f.FileName] = struct{}{}
}
// raw search
needle := []byte(t)
if !caseSensitive {
needle = toLower(needle)
}
for k, v := range fileContents {
if bytes.Contains(v, needle) {
rFiles[k] = struct{}{}
}
}
if !reflect.DeepEqual(zFiles, rFiles) {
var add, del []string
for k := range zFiles {
if _, ok := rFiles[k]; !ok {
del = append(del, k)
}
}
for k := range rFiles {
if _, ok := zFiles[k]; !ok {
add = append(add, k)
}
}
sort.Strings(add)
sort.Strings(del)
log.Printf("pattern %q, add %v, del %v", t, add, del)
}
}
return nil
}