aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/covermerger
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2024-08-27 15:07:35 +0200
committerTaras Madan <tarasmadan@google.com>2024-08-27 13:40:56 +0000
commita1a7b2f0375c39f024ed223545e126e1da17463b (patch)
treebfad028e59ed066730cec0e1c3f4975486a22134 /pkg/covermerger
parent9aee4e0bf82f0d67df233a41aba4397ecfc18e3a (diff)
pkg/covermerger: clone commits not branches
Closes https://github.com/google/syzkaller/issues/5213. Some commits may be detached upstream. Specifying the commits we increase the cloning probability. Tested by: go run ./tools/syz-covermerger/ -workdir ../workdir-cover-aggregation/ -repo git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git -branch master -commit 3d5f968a177d468cd13568ef901c5be84d83d32b -namespace upstream -duration 7 -date-to 2024-08-23 -file-path-prefix drivers/clk/actions
Diffstat (limited to 'pkg/covermerger')
-rw-r--r--pkg/covermerger/provider_monorepo.go54
1 files changed, 25 insertions, 29 deletions
diff --git a/pkg/covermerger/provider_monorepo.go b/pkg/covermerger/provider_monorepo.go
index 969422d9b..9f1740e51 100644
--- a/pkg/covermerger/provider_monorepo.go
+++ b/pkg/covermerger/provider_monorepo.go
@@ -18,9 +18,9 @@ type FileVersProvider interface {
}
type monoRepo struct {
- branches map[RepoBranchCommit]struct{}
- mu sync.RWMutex
- repo vcs.Repo
+ repoCommits map[RepoBranchCommit]struct{}
+ mu sync.RWMutex
+ repo vcs.Repo
}
type fileVersions map[RepoBranchCommit]string
@@ -28,11 +28,9 @@ type fileVersions map[RepoBranchCommit]string
func (mr *monoRepo) GetFileVersions(c *Config, targetFilePath string, rbcs []RepoBranchCommit,
) (fileVersions, error) {
mr.mu.RLock()
- if !mr.allRepoBranchesPresent(rbcs) {
+ if !mr.allRepoCommitsPresent(rbcs) {
mr.mu.RUnlock()
- if err := mr.cloneBranches(rbcs); err != nil {
- return nil, fmt.Errorf("failed to clone repos: %w", err)
- }
+ mr.cloneCommits(rbcs)
mr.mu.RLock()
}
defer mr.mu.RUnlock()
@@ -40,7 +38,9 @@ func (mr *monoRepo) GetFileVersions(c *Config, targetFilePath string, rbcs []Rep
for _, rbc := range rbcs {
fileBytes, err := mr.repo.Object(targetFilePath, rbc.Commit)
// It is ok if some file doesn't exist. It means we have repo FS diff.
+ // Or the upstream commit doesn't exist anymore
if err != nil {
+ log.Logf(1, "repo.Object(%s, %s) error: %s", targetFilePath, rbc.Commit, err.Error())
continue
}
res[rbc] = string(fileBytes)
@@ -48,39 +48,38 @@ func (mr *monoRepo) GetFileVersions(c *Config, targetFilePath string, rbcs []Rep
return res, nil
}
-func (mr *monoRepo) allRepoBranchesPresent(rbcs []RepoBranchCommit) bool {
+func (mr *monoRepo) allRepoCommitsPresent(rbcs []RepoBranchCommit) bool {
for _, rbc := range rbcs {
- if !mr.repoBranchPresent(rbc) {
+ if !mr.repoCommitPresent(rbc) {
return false
}
}
return true
}
-func (mr *monoRepo) repoBranchPresent(rbc RepoBranchCommit) bool {
- rbc.Commit = ""
- _, ok := mr.branches[rbc]
+func (mr *monoRepo) repoCommitPresent(rbc RepoBranchCommit) bool {
+ rbc.Branch = ""
+ _, ok := mr.repoCommits[rbc]
return ok
}
-func (mr *monoRepo) addRepoBranch(rbc RepoBranchCommit) error {
- rbc.Commit = ""
- mr.branches[rbc] = struct{}{}
- log.Logf(0, "cloning repo: %s, branch: %s", rbc.Repo, rbc.Branch)
- if rbc.Repo == "" || rbc.Branch == "" {
- panic("repo and branch are needed")
+func (mr *monoRepo) addRepoCommit(rbc RepoBranchCommit) {
+ log.Logf(0, "cloning repo: %s, branch: %s, commit %s", rbc.Repo, rbc.Branch, rbc.Commit)
+ rbc.Branch = ""
+ mr.repoCommits[rbc] = struct{}{}
+ if rbc.Repo == "" || rbc.Commit == "" {
+ panic("repo and commit are needed")
}
- if _, err := mr.repo.CheckoutBranch(rbc.Repo, rbc.Branch); err != nil {
- return fmt.Errorf("failed to CheckoutBranch(repo %s, branch %s): %w",
- rbc.Repo, rbc.Branch, err)
+ if _, err := mr.repo.CheckoutCommit(rbc.Repo, rbc.Commit); err != nil {
+ log.Logf(0, "failed to CheckoutCommit(repo %s, commit %s): %s",
+ rbc.Repo, rbc.Commit, err.Error())
}
- return nil
}
func MakeMonoRepo(workdir string) FileVersProvider {
rbcPath := workdir + "/repos/linux_kernels"
mr := &monoRepo{
- branches: map[RepoBranchCommit]struct{}{},
+ repoCommits: map[RepoBranchCommit]struct{}{},
}
var err error
if mr.repo, err = vcs.NewRepo(targets.Linux, "none", rbcPath); err != nil {
@@ -89,16 +88,13 @@ func MakeMonoRepo(workdir string) FileVersProvider {
return mr
}
-func (mr *monoRepo) cloneBranches(rbcs []RepoBranchCommit) error {
+func (mr *monoRepo) cloneCommits(rbcs []RepoBranchCommit) {
mr.mu.Lock()
defer mr.mu.Unlock()
for _, rbc := range rbcs {
- if mr.repoBranchPresent(rbc) {
+ if mr.repoCommitPresent(rbc) {
continue
}
- if err := mr.addRepoBranch(rbc); err != nil {
- return err
- }
+ mr.addRepoCommit(rbc)
}
- return nil
}