diff options
| -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 | ||||
| -rw-r--r-- | tools/syz-covermerger/syz_covermerger.go | 14 |
4 files changed, 81 insertions, 4 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{} +} diff --git a/tools/syz-covermerger/syz_covermerger.go b/tools/syz-covermerger/syz_covermerger.go index 2f2d820a7..d3b9de2ae 100644 --- a/tools/syz-covermerger/syz_covermerger.go +++ b/tools/syz-covermerger/syz_covermerger.go @@ -31,8 +31,20 @@ var ( flagTotalRows = flag.Int64("total-rows", 0, "[optional] source size, is used for version contol") flagToDashAPI = flag.String("to-dashapi", "", "[optional] dashapi address") flagDashboardClientName = flag.String("dashboard-client-name", "coverage-merger", "[optional]") + flagSrcProvider = flag.String("provider", "git-clone", "[optional] git-clone or web-git") ) +func makeProvider() covermerger.FileVersProvider { + switch *flagSrcProvider { + case "git-clone": + return covermerger.MakeMonoRepo(*flagWorkdir) + case "web-git": + return covermerger.MakeWebGit() + default: + panic(fmt.Sprintf("unknown provider %v", *flagSrcProvider)) + } +} + func main() { flag.Parse() config := &covermerger.Config{ @@ -43,7 +55,7 @@ func main() { Branch: *flagBranch, Commit: *flagCommit, }, - FileVersProvider: covermerger.MakeMonoRepo(*flagWorkdir), + FileVersProvider: makeProvider(), } mergeResult, err := covermerger.MergeCSVData(config, os.Stdin) if err != nil { |
