| // Copyright 2018 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 vcs |
| |
| import ( |
| "fmt" |
| "os" |
| "path/filepath" |
| |
| "github.com/google/syzkaller/pkg/osutil" |
| ) |
| |
| type fuchsia struct { |
| vm string |
| dir string |
| zircon *git |
| } |
| |
| func newFuchsia(vm, dir string) *fuchsia { |
| return &fuchsia{ |
| vm: vm, |
| dir: dir, |
| zircon: newGit(filepath.Join(dir, "zircon"), nil), |
| } |
| } |
| |
| func (ctx *fuchsia) Poll(repo, branch string) (*Commit, error) { |
| if repo != "https://fuchsia.googlesource.com" || branch != "master" { |
| // fuchsia ecosystem is hard-tailored to the main repo. |
| return nil, fmt.Errorf("fuchsia: can only check out https://fuchsia.googlesource.com/master") |
| } |
| if _, err := runSandboxed(ctx.dir, "./.jiri_root/bin/jiri", "update"); err != nil { |
| if err := ctx.initRepo(); err != nil { |
| return nil, err |
| } |
| } |
| return ctx.zircon.HeadCommit() |
| } |
| |
| func (ctx *fuchsia) initRepo() error { |
| if err := os.RemoveAll(ctx.dir); err != nil { |
| return fmt.Errorf("failed to remove repo dir: %v", err) |
| } |
| tmpDir := ctx.dir + ".tmp" |
| if err := osutil.MkdirAll(tmpDir); err != nil { |
| return fmt.Errorf("failed to create repo dir: %v", err) |
| } |
| defer os.RemoveAll(tmpDir) |
| if err := osutil.SandboxChown(tmpDir); err != nil { |
| return err |
| } |
| cmd := "curl -s 'https://fuchsia.googlesource.com/fuchsia/+/master/scripts/bootstrap?format=TEXT' |" + |
| "base64 --decode | bash" |
| if _, err := runSandboxed(tmpDir, "bash", "-c", cmd); err != nil { |
| return err |
| } |
| return osutil.Rename(filepath.Join(tmpDir, "fuchsia"), ctx.dir) |
| } |
| |
| func (ctx *fuchsia) CheckoutBranch(repo, branch string) (*Commit, error) { |
| return nil, fmt.Errorf("not implemented for fuchsia") |
| } |
| |
| func (ctx *fuchsia) CheckoutCommit(repo, commit string) (*Commit, error) { |
| return nil, fmt.Errorf("not implemented for fuchsia") |
| } |
| |
| func (ctx *fuchsia) SwitchCommit(commit string) (*Commit, error) { |
| return nil, fmt.Errorf("not implemented for fuchsia") |
| } |
| |
| func (ctx *fuchsia) HeadCommit() (*Commit, error) { |
| return nil, fmt.Errorf("not implemented for fuchsia") |
| } |
| |
| func (ctx *fuchsia) GetCommitByTitle(title string) (*Commit, error) { |
| return ctx.zircon.GetCommitByTitle(title) |
| } |
| |
| func (ctx *fuchsia) GetCommitsByTitles(titles []string) ([]*Commit, []string, error) { |
| return ctx.zircon.GetCommitsByTitles(titles) |
| } |
| |
| func (ctx *fuchsia) ListRecentCommits(baseCommit string) ([]string, error) { |
| return ctx.zircon.ListRecentCommits(baseCommit) |
| } |
| |
| func (ctx *fuchsia) ExtractFixTagsFromCommits(baseCommit, email string) ([]*Commit, error) { |
| return ctx.zircon.ExtractFixTagsFromCommits(baseCommit, email) |
| } |