aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/covermerger/covermerger.go2
-rw-r--r--pkg/covermerger/provider_monorepo.go (renamed from pkg/covermerger/monorepo.go)4
-rw-r--r--pkg/covermerger/provider_web.go65
-rw-r--r--tools/syz-covermerger/syz_covermerger.go14
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 {