aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/covermerger/provider_web.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/covermerger/provider_web.go')
-rw-r--r--pkg/covermerger/provider_web.go65
1 files changed, 65 insertions, 0 deletions
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{}
+}