blob: 148360a08c7e6788033e7508e588a1ac13bf75a2 [file] [log] [blame]
package vcs
import (
"fmt"
"path/filepath"
"strings"
"testing"
"time"
"github.com/google/syzkaller/pkg/osutil"
)
const (
userEmail = `test@syzkaller.com`
userName = `Test Syzkaller`
extractFixTagsEmail = `"syzbot" <syzbot@my.mail.com>`
)
type testWriter testing.T
func (t *testWriter) Write(data []byte) (int, error) {
(*testing.T)(t).Log(string(data))
return len(data), nil
}
type TestRepo struct {
t *testing.T
Dir string
name string
Commits map[string]map[string]*Commit
repo *git
}
func (repo *TestRepo) git(args ...string) {
if _, err := osutil.RunCmd(time.Minute, repo.Dir, "git", args...); err != nil {
repo.t.Fatal(err)
}
}
func MakeTestRepo(t *testing.T, dir string) *TestRepo {
if err := osutil.MkdirAll(dir); err != nil {
t.Fatal(err)
}
ignoreCC := map[string]bool{
"stable@vger.kernel.org": true,
}
repo := &TestRepo{
t: t,
Dir: dir,
name: filepath.Base(dir),
Commits: make(map[string]map[string]*Commit),
repo: newGit(dir, ignoreCC),
}
repo.git("init")
repo.git("config", "--add", "user.email", userEmail)
repo.git("config", "--add", "user.name", userName)
return repo
}
func (repo *TestRepo) CommitFileChange(branch, change string) {
id := fmt.Sprintf("%v-%v-%v", repo.name, branch, change)
file := filepath.Join(repo.Dir, "file")
if err := osutil.WriteFile(file, []byte(id)); err != nil {
repo.t.Fatal(err)
}
repo.git("add", file)
repo.git("commit", "-m", id)
if repo.Commits[branch] == nil {
repo.Commits[branch] = make(map[string]*Commit)
}
com, err := repo.repo.HeadCommit()
if err != nil {
repo.t.Fatal(err)
}
repo.Commits[branch][change] = com
}
func (repo *TestRepo) CommitChange(description string) {
repo.git("commit", "--allow-empty", "-m", description)
}
func (repo *TestRepo) SetTag(tag string) {
repo.git("tag", tag)
}
func (repo *TestRepo) SupportsBisection() bool {
// Detect too old git binary. --no-contains appeared in git 2.13.
_, err := repo.repo.previousReleaseTags("HEAD", true)
return err == nil ||
!strings.Contains(err.Error(), "usage: git tag") &&
!strings.Contains(err.Error(), "error: unknown option")
}
func CreateTestRepo(t *testing.T, baseDir, name string) *TestRepo {
repo := MakeTestRepo(t, filepath.Join(baseDir, name))
repo.git("checkout", "-b", "master")
repo.CommitFileChange("master", "0")
for _, branch := range []string{"branch1", "branch2"} {
repo.git("checkout", "-b", branch, "master")
repo.CommitFileChange(branch, "0")
repo.CommitFileChange(branch, "1")
}
repo.git("checkout", "master")
repo.CommitFileChange("master", "1")
return repo
}
func CloneTestRepo(t *testing.T, baseDir string, name string, originRepo *TestRepo) *TestRepo {
dir := filepath.Join(baseDir, name)
if err := osutil.MkdirAll(dir); err != nil {
t.Fatal(err)
}
ignoreCC := map[string]bool{
"stable@vger.kernel.org": true,
}
repo := &TestRepo{
t: t,
Dir: dir,
name: filepath.Base(dir),
Commits: make(map[string]map[string]*Commit),
repo: newGit(dir, ignoreCC),
}
repo.git("clone", originRepo.Dir, repo.Dir)
return repo
}