fork of https://github.com/sourcegraph/zoekt
0

Configure Feed

Select the types of activity you want to include in your feed.

Merge remote-tracking branch 'gerrit/master'

Change-Id: I71a647f5b1efda651e9927f0b3904275c3603cd4

+241 -25
+9 -8
cmd/flags.go
··· 38 38 } 39 39 40 40 var ( 41 - sizeMax = flag.Int("file_limit", 128*1024, "maximum file size") 42 - trigramMax = flag.Int("max_trigram_count", 20000, "maximum number of trigrams per document") 43 - shardLimit = flag.Int("shard_limit", 100<<20, "maximum corpus size for a shard") 44 - parallelism = flag.Int("parallelism", 4, "maximum number of parallel indexing processes.") 45 - indexDir = flag.String("index", build.DefaultDir, "directory for search indices") 46 - version = flag.Bool("version", false, "Print version number") 41 + sizeMax = flag.Int("file_limit", 2<<20, "maximum file size") 42 + trigramMax = flag.Int("max_trigram_count", 20000, "maximum number of trigrams per document") 43 + shardLimit = flag.Int("shard_limit", 100<<20, "maximum corpus size for a shard") 44 + parallelism = flag.Int("parallelism", 4, "maximum number of parallel indexing processes.") 45 + indexDir = flag.String("index", build.DefaultDir, "directory for search indices") 46 + version = flag.Bool("version", false, "Print version number") 47 + ctags = flag.Bool("require_ctags", false, "If set, ctags calls must succeed.") 48 + largeFiles = largeFilesFlag{} 49 + 47 50 disableCTags = flag.Bool("disable_ctags", false, "If set, ctags will not be called.") 48 - ctags = flag.Bool("require_ctags", false, "If set, ctags calls must succeed.") 49 - largeFiles = largeFilesFlag{} 50 51 ) 51 52 52 53 func init() {
+28 -7
cmd/zoekt-archive-index/archive.go
··· 2 2 3 3 import ( 4 4 "archive/tar" 5 + "bytes" 5 6 "compress/gzip" 6 7 "fmt" 7 8 "io" ··· 57 58 return nil 58 59 } 59 60 61 + func detectContentType(r io.Reader) (string, io.Reader, error) { 62 + var buf [512]byte 63 + n, err := io.ReadFull(r, buf[:]) 64 + if err != nil && err != io.ErrUnexpectedEOF { 65 + return "", nil, err 66 + } 67 + 68 + ct := http.DetectContentType(buf[:n]) 69 + 70 + // Return a new reader which merges in the read bytes 71 + return ct, io.MultiReader(bytes.NewReader(buf[:n]), r), nil 72 + } 73 + 60 74 // openArchive opens the tar at the URL or filepath u. Also supported is tgz 61 75 // files over http. 62 76 // ··· 93 107 } 94 108 closer = resp.Body 95 109 r = body 96 - if resp.Header.Get("Content-Type") == "application/x-gzip" { 97 - r, err = gzip.NewReader(r) 98 - if err != nil { 99 - resp.Body.Close() 100 - return nil, err 101 - } 102 - } 103 110 } else if u == "-" { 104 111 r = os.Stdin 105 112 } else { ··· 109 116 } 110 117 closer = f 111 118 r = f 119 + } 120 + 121 + ct, r, err := detectContentType(r) 122 + if err != nil { 123 + return nil, err 124 + } 125 + if ct == "application/x-gzip" { 126 + r, err = gzip.NewReader(r) 127 + if err != nil { 128 + if closer != nil { 129 + _ = closer.Close() 130 + } 131 + return nil, err 132 + } 112 133 } 113 134 114 135 return &tarArchive{
+23 -2
cmd/zoekt-archive-index/e2e_test.go
··· 2 2 3 3 import ( 4 4 "archive/tar" 5 + "compress/gzip" 5 6 "context" 6 7 "fmt" 7 8 "io" ··· 16 17 "github.com/google/zoekt/shards" 17 18 ) 18 19 19 - func writeArchive(w io.Writer, files map[string]string) error { 20 + func writeArchive(w io.Writer, format string, files map[string]string) (err error) { 21 + if format == "tgz" { 22 + gw := gzip.NewWriter(w) 23 + defer func() { 24 + err2 := gw.Close() 25 + if err == nil { 26 + err = err2 27 + } 28 + }() 29 + w = gw 30 + format = "tar" 31 + } 32 + 20 33 tw := tar.NewWriter(w) 21 34 22 35 for name, body := range files { ··· 45 58 // -incremental=true option changing the options between indexes and ensuring 46 59 // the results change as expected. 47 60 func TestIndexIncrementally(t *testing.T) { 61 + for _, format := range []string{"tar", "tgz"} { 62 + t.Run(format, func(t *testing.T) { 63 + testIndexIncrementally(t, format) 64 + }) 65 + } 66 + } 67 + 68 + func testIndexIncrementally(t *testing.T, format string) { 48 69 indexdir, err := ioutil.TempDir("", "TestIndexArg-index") 49 70 if err != nil { 50 71 t.Fatalf("TempDir: %v", err) ··· 64 85 files["F"+s] = strings.Repeat("a", fileSize) 65 86 } 66 87 67 - err = writeArchive(archive, files) 88 + err = writeArchive(archive, format, files) 68 89 if err != nil { 69 90 t.Fatalf("unable to create archive %v", err) 70 91 }
+52 -7
ctags/json.go
··· 32 32 type ctagsProcess struct { 33 33 cmd *exec.Cmd 34 34 in io.WriteCloser 35 - out *bufio.Scanner 35 + out *scanner 36 36 outPipe io.ReadCloser 37 37 } 38 38 ··· 63 63 proc := ctagsProcess{ 64 64 cmd: cmd, 65 65 in: in, 66 - out: bufio.NewScanner(out), 66 + out: &scanner{r: bufio.NewReaderSize(out, 4096)}, 67 67 outPipe: out, 68 68 } 69 69 initialBuffer := make([]byte, bufio.MaxScanTokenSize) ··· 90 90 91 91 func (p *ctagsProcess) read(rep *reply) error { 92 92 if !p.out.Scan() { 93 - // Some errors (eg. token too long) do not kill the 94 - // parser. We would deadlock if we waited for the 95 - // process to exit. 93 + // Some errors do not kill the parser. We would deadlock if we waited 94 + // for the process to exit. 96 95 err := p.out.Err() 97 96 p.Close() 98 97 return err 99 98 } 100 99 if debug { 101 - log.Printf("read %s", p.out.Text()) 100 + log.Printf("read %q", p.out.Bytes()) 102 101 } 103 102 104 103 if l := len(p.out.Bytes()); l > bufio.MaxScanTokenSize { ··· 114 113 115 114 err := json.Unmarshal(p.out.Bytes(), rep) 116 115 if err != nil { 117 - return fmt.Errorf("unmarshal(%s): %v", p.out.Text(), err) 116 + return fmt.Errorf("unmarshal(%q): %v", p.out.Bytes(), err) 118 117 } 119 118 return nil 120 119 } ··· 202 201 } 203 202 204 203 return es, nil 204 + } 205 + 206 + // scanner is like bufio.Scanner but skips long lines instead of returning 207 + // bufio.ErrTooLong. 208 + // 209 + // Additionally it will skip empty lines. 210 + type scanner struct { 211 + r *bufio.Reader 212 + line []byte 213 + err error 214 + } 215 + 216 + func (s *scanner) Scan() bool { 217 + if s.err != nil { 218 + return false 219 + } 220 + 221 + var ( 222 + err error 223 + line []byte 224 + ) 225 + 226 + for err == nil && len(line) == 0 { 227 + line, err = s.r.ReadSlice('\n') 228 + for err == bufio.ErrBufferFull { 229 + // make line empty so we ignore it 230 + line = nil 231 + _, err = s.r.ReadSlice('\n') 232 + } 233 + line = bytes.TrimSuffix(line, []byte{'\n'}) 234 + line = bytes.TrimSuffix(line, []byte{'\r'}) 235 + } 236 + 237 + s.line, s.err = line, err 238 + return len(line) > 0 239 + } 240 + 241 + func (s *scanner) Bytes() []byte { 242 + return s.line 243 + } 244 + 245 + func (s *scanner) Err() error { 246 + if s.err == io.EOF { 247 + return nil 248 + } 249 + return s.err 205 250 } 206 251 207 252 type Parser interface {
+37
ctags/json_test.go
··· 15 15 package ctags 16 16 17 17 import ( 18 + "bufio" 18 19 "os/exec" 19 20 "reflect" 21 + "strings" 20 22 "testing" 23 + 24 + "github.com/google/go-cmp/cmp" 21 25 ) 22 26 23 27 func TestJSON(t *testing.T) { ··· 112 116 } 113 117 } 114 118 } 119 + 120 + func TestScanner(t *testing.T) { 121 + size := 20 122 + 123 + input := strings.Join([]string{ 124 + "aaaaaaaaa", 125 + strings.Repeat("B", 3*size+3), 126 + strings.Repeat("C", size) + strings.Repeat("D", size+1), 127 + "", 128 + strings.Repeat("e", size-1), 129 + "f\r", 130 + "gg", 131 + }, "\n") 132 + want := []string{ 133 + "aaaaaaaaa", 134 + strings.Repeat("e", size-1), 135 + "f", 136 + "gg", 137 + } 138 + 139 + var got []string 140 + r := &scanner{r: bufio.NewReaderSize(strings.NewReader(input), size)} 141 + for r.Scan() { 142 + got = append(got, string(r.Bytes())) 143 + } 144 + if err := r.Err(); err != nil { 145 + t.Fatal(err) 146 + } 147 + 148 + if !cmp.Equal(got, want) { 149 + t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got)) 150 + } 151 + }
+28
gitindex/clone.go
··· 21 21 "os/exec" 22 22 "path/filepath" 23 23 "sort" 24 + 25 + git "gopkg.in/src-d/go-git.v4" 26 + "gopkg.in/src-d/go-git.v4/config" 24 27 ) 25 28 26 29 // CloneRepo clones one repository, adding the given config ··· 64 67 return "", err 65 68 } 66 69 70 + if err := setFetch(repoDest, "origin", "+refs/heads/*:refs/heads/*"); err != nil { 71 + log.Printf("addFetch: %v", err) 72 + } 67 73 return repoDest, nil 68 74 } 75 + 76 + func setFetch(repoDir, remote, refspec string) error { 77 + repo, err := git.PlainOpen(repoDir) 78 + if err != nil { 79 + return err 80 + } 81 + 82 + cfg, err := repo.Config() 83 + if err != nil { 84 + return err 85 + } 86 + 87 + rm := cfg.Remotes[remote] 88 + if rm != nil { 89 + rm.Fetch = []config.RefSpec{config.RefSpec(refspec)} 90 + } 91 + if err := repo.Storer.SetConfig(cfg); err != nil { 92 + return err 93 + } 94 + 95 + return nil 96 + }
+63
gitindex/clone_test.go
··· 1 + // Copyright 2019 Google Inc. All rights reserved. 2 + // 3 + // Licensed under the Apache License, Version 2.0 (the "License"); 4 + // you may not use this file except in compliance with the License. 5 + // You may obtain a copy of the License at 6 + // 7 + // http://www.apache.org/licenses/LICENSE-2.0 8 + // 9 + // Unless required by applicable law or agreed to in writing, software 10 + // distributed under the License is distributed on an "AS IS" BASIS, 11 + // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 + // See the License for the specific language governing permissions and 13 + // limitations under the License. 14 + 15 + package gitindex 16 + 17 + import ( 18 + "io/ioutil" 19 + "os" 20 + "os/exec" 21 + "testing" 22 + 23 + git "gopkg.in/src-d/go-git.v4" 24 + ) 25 + 26 + func TestSetRemote(t *testing.T) { 27 + dir, err := ioutil.TempDir("", "") 28 + if err != nil { 29 + t.Fatal(err) 30 + } 31 + defer os.RemoveAll(dir) 32 + script := `mkdir orig 33 + cd orig 34 + git init 35 + cd .. 36 + git clone orig/.git clone.git 37 + ` 38 + 39 + cmd := exec.Command("/bin/sh", "-euxc", script) 40 + cmd.Dir = dir 41 + 42 + if out, err := cmd.CombinedOutput(); err != nil { 43 + t.Fatalf("execution error: %v, output %s", err, out) 44 + } 45 + 46 + r := dir + "/clone.git" 47 + if err := setFetch(r, "origin", "+refs/heads/*:refs/heads/*"); err != nil { 48 + t.Fatalf("addFetch: %v", err) 49 + } 50 + 51 + repo, err := git.PlainOpen(r) 52 + if err != nil { 53 + t.Fatal("PlainOpen", err) 54 + } 55 + 56 + rm, err := repo.Remote("origin") 57 + if err != nil { 58 + t.Fatal("Remote", err) 59 + } 60 + if got, want := rm.Config().Fetch[0].String(), "+refs/heads/*:refs/heads/*"; got != want { 61 + t.Fatalf("got %q want %q", got, want) 62 + } 63 + }
+1 -1
toc.go
··· 39 39 // 6: Include '#' into the LineFragment template 40 40 // 7: Record skip reasons in the index. 41 41 // 8: Record source path in the index. 42 - // 9: Store ctags metadata 42 + // 9: Store ctags metadata & bump default max file size 43 43 const FeatureVersion = 9 44 44 45 45 func init() {