_, err = r.gitCmd("config", "rerere.enabled", "true")
return
}
+
+type Worktree struct {
+ Repo
+ BaseRepo Repo
+ WorktreeBranch string
+}
+
+func (r Repo) WorktreeAdd(basepath string, name string, ref string) (wt *Worktree, err error) {
+ path := basepath + "/" + name
+ branchname := "worktree/" + name
+
+ _, err = r.gitCmd("worktree", "add", "-b", branchname, path, ref)
+ if err != nil {
+ return
+ }
+ wt = &Worktree{
+ BaseRepo: r,
+ WorktreeBranch: branchname,
+ }
+ wt.Repo, err = GitOpen(path)
+
+ return
+}
+
+func (wt Worktree) Delete() (err error) {
+ _, err = wt.gitCmd("worktree", "remove", "--force", ".")
+ if err != nil {
+ return
+ }
+
+ _, err = wt.BaseRepo.DeleteBranch(wt.WorktreeBranch)
+
+ return
+}
TreeQemuU = "qemuu"
TreeQemuT = "qemut"
TreeXSA = "xsa"
+ // FIXME: This isn't really a tree...
+ TreeWork = "worktree"
)
var TreeListAll = []Tree{TreeXen, TreeQemuU, TreeQemuT, TreeXSA}
func TreeFromString(s string) (Tree, error) {
switch s {
- case TreeXen, TreeQemuU, TreeQemuT, TreeXSA:
+ case TreeXen, TreeQemuU, TreeQemuT, TreeXSA, TreeWork:
return Tree(s), nil
default:
return "", fmt.Errorf("Unknown tree: %s\n", s)
func (t Tree) String() string {
switch t {
- case TreeXen, TreeQemuU, TreeQemuT, TreeXSA:
+ case TreeXen, TreeQemuU, TreeQemuT, TreeXSA, TreeWork:
return string(t)
default:
return "[INVALID]"
func (r *Recipe) Build(prefix string) (err error) {
_, _, branch := r.branchName(prefix)
- xenrepo := G.repos.GetRepoNC(TreeXen)
-
- /* Always check out a temporary branch for xen */
- tmpBranch := "xsa/tmp"
+ repo := G.repos.GetRepoNC(TreeXen).Repo
// If the recipe has Xen patches, use the recipe branch name;
// otherwise, use the stable branch for that Xen version
wtbranch = XenStableBranch(r.XenVersion)
}
- err = xenrepo.MakeBranch(tmpBranch, wtbranch)
- if err != nil {
- return fmt.Errorf("Making tempbranch %s from %v for xenversion %v: %v\n",
- tmpBranch, branch, r.XenVersion, err)
+ var wt *Worktree
+
+ /* Always check out a temporary branch for xen */
+ tmpBranch := "xsa/tmp"
+
+ wtPath := G.config.Tool.GetPath(TreeWork)
+ if wtPath != "" {
+ // build-NNN-VV
+ name := fmt.Sprintf("build-%d-%v", r.xsa, r.XenVersion)
+
+ wt, err = repo.WorktreeAdd(wtPath, name, wtbranch)
+ if err != nil {
+ return
+ }
+ repo = wt.Repo
+ } else {
+ err = repo.MakeBranch(tmpBranch, wtbranch)
+ if err != nil {
+ return fmt.Errorf("Making tempbranch %s from %v for xenversion %v: %v\n",
+ tmpBranch, branch, r.XenVersion, err)
+ }
}
// Make .config file with path to repos
fmt.Printf("Writing build config file:\n%s\n", config)
- if err = config.Write(xenrepo.GetPath()); err != nil {
+ if err = config.Write(repo.GetPath()); err != nil {
return fmt.Errorf("Writing config: %v\n", err)
}
defer os.Chdir(cwd)
// Configure
- os.Chdir(xenrepo.GetPath())
+ os.Chdir(repo.GetPath())
logfile, err := os.Create("build.log")
if err != nil {
return fmt.Errorf("Building: %v\n", err)
}
- _, err = xenrepo.Checkout("master")
- if err != nil {
- return
- }
- _, err = xenrepo.DeleteBranch(tmpBranch)
- if err != nil {
- return
+ if wt != nil {
+ err = wt.Delete()
+ if err != nil {
+ return
+ }
+ } else {
+ _, err = repo.Checkout("master")
+ if err != nil {
+ return
+ }
+ _, err = repo.DeleteBranch(tmpBranch)
+ if err != nil {
+ return
+ }
}
return
proxyURL := flags.String("gitproxy", EmptyString,
"Git proxy prefix, used for building")
+
if err := flags.Parse(args); err != nil {
if err != flag.ErrHelp {
fmt.Printf("Error parsing args: %v\n", err)
return
}
+ // Only set default paths for actual git trees here; worktree
+ // must currently be set manually.
ForEachTree(setDefaultPath)
checkDir := func(target string) (clone bool, err error) {