diff options
| author | Taras Madan <tarasmadan@google.com> | 2024-08-09 12:40:12 +0200 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2024-08-09 11:01:02 +0000 |
| commit | a9e7e9e3a26f5e19a9d96c1a27717aa83e0bdbcd (patch) | |
| tree | f21fb2bb297551db2fc545c9fc5867a93bbfcba0 /pkg/covermerger | |
| parent | a83d9288459602ce6ab098f191eb2c7a923128c5 (diff) | |
covermerger: add web-git source provider
It allows to speed up the single file calculations because we don't need git clone.
Diffstat (limited to 'pkg/covermerger')
| -rw-r--r-- | pkg/covermerger/covermerger.go | 2 | ||||
| -rw-r--r-- | pkg/covermerger/provider_monorepo.go (renamed from pkg/covermerger/monorepo.go) | 4 | ||||
| -rw-r--r-- | pkg/covermerger/provider_web.go | 65 |
3 files changed, 68 insertions, 3 deletions
diff --git a/pkg/covermerger/covermerger.go b/pkg/covermerger/covermerger.go index 602a0a263..f9faa9387 100644 --- a/pkg/covermerger/covermerger.go +++ b/pkg/covermerger/covermerger.go @@ -122,7 +122,7 @@ type Config struct { Workdir string skipRepoClone bool Base RepoBranchCommit - FileVersProvider fileVersProvider + FileVersProvider FileVersProvider } func isSchema(fields, schema []string) bool { diff --git a/pkg/covermerger/monorepo.go b/pkg/covermerger/provider_monorepo.go index 5ed67e311..21d6792e2 100644 --- a/pkg/covermerger/monorepo.go +++ b/pkg/covermerger/provider_monorepo.go @@ -12,7 +12,7 @@ import ( "github.com/google/syzkaller/sys/targets" ) -type fileVersProvider interface { +type FileVersProvider interface { GetFileVersions(c *Config, targetFilePath string, rbcs []RepoBranchCommit, ) (fileVersions, error) } @@ -77,7 +77,7 @@ func (mr *monoRepo) addRepoBranch(rbc RepoBranchCommit) error { return nil } -func MakeMonoRepo(workdir string) fileVersProvider { +func MakeMonoRepo(workdir string) FileVersProvider { rbcPath := workdir + "/repos/linux_kernels" mr := &monoRepo{ branches: map[RepoBranchCommit]struct{}{}, diff --git a/pkg/covermerger/provider_web.go b/pkg/covermerger/provider_web.go new file mode 100644 index 000000000..72933f280 --- /dev/null +++ b/pkg/covermerger/provider_web.go @@ -0,0 +1,65 @@ +// Copyright 2024 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package covermerger + +import ( + "errors" + "fmt" + "io" + "net/http" + "net/url" +) + +type webGit struct { +} + +func (mr *webGit) GetFileVersions(c *Config, targetFilePath string, rbcs []RepoBranchCommit, +) (fileVersions, error) { + res := make(fileVersions) + for _, rbc := range rbcs { + fileBytes, err := loadFile(targetFilePath, rbc.Repo, rbc.Commit) + // It is ok if some file doesn't exist. It means we have repo FS diff. + if err == errFileNotFound { + continue + } + if err != nil { + return nil, fmt.Errorf("failed to loadFile: %w", err) + } + res[rbc] = string(fileBytes) + } + return res, nil +} + +var errFileNotFound = errors.New("file not found") + +func loadFile(filePath, repo, commit string) ([]byte, error) { + uri := fmt.Sprintf("%s/plain/%s?id=%s", repo, filePath, commit) + u, err := url.Parse(uri) + if err != nil { + return nil, fmt.Errorf("failed to parse %v: %w", uri, err) + } + u.Scheme = "https" + uri = u.String() + res, err := http.Get(uri) + if err != nil { + return nil, fmt.Errorf("failed to http.Get: %w", err) + } + defer res.Body.Close() + + if res.StatusCode == 404 { + return nil, errFileNotFound + } + if res.StatusCode != 200 { + return nil, fmt.Errorf("error: status %d getting %s", res.StatusCode, uri) + } + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, fmt.Errorf("failed to io.ReadAll from body: %w", err) + } + return body, nil +} + +func MakeWebGit() FileVersProvider { + return &webGit{} +} |
