)
func MainGlobalUpdate(unused *XSAMeta, args []string) int {
- err := OpenRepos()
+ xr, err := G.repos.GetRepo(TreeXen)
if err != nil {
- fmt.Printf("Error opening repos: %v\n", err)
+ fmt.Printf("Error opening xen repo: %v\n", err)
return 1
}
}
fmt.Printf("Getting Xen releases from tree...\n")
- versions, err := G.repos.XenRepos[TreeXen].GetVersions()
+ versions, err := xr.GetVersions()
if err != nil {
fmt.Printf("Error getting Xen releases: %v\n", err)
return 1
"strings"
)
-func OpenRepos() (err error) {
- open := func(t Tree) (err error) {
- G.repos.XenRepos[t], err = XenRepoOpen(G.config.Tool.GetPath(t), t)
- return
- }
-
- err = ForEachCodeTree(open)
+type GlobalRepos struct {
+ codeRepos map[Tree]*XenRepo
+}
- G.repos.xsa, err = GitOpen(G.config.Tool.GetPath(TreeXSA))
+func (repos *GlobalRepos) GetRepo(t Tree) (xr *XenRepo, err error) {
+ if repos.codeRepos == nil {
+ repos.codeRepos = make(map[Tree]*XenRepo)
+ }
+ xr = repos.codeRepos[t]
+ if xr == nil {
+ xr, err = XenRepoOpen(G.config.Tool.GetPath(t), t)
+ if err != nil {
+ return
+ }
+ repos.codeRepos[t] = xr
+ }
+ return
+}
+// "No-check" version of above function, for when you "know" it will succeed
+func (repos *GlobalRepos) GetRepoNC(t Tree) (xr *XenRepo) {
+ xr, _ = repos.GetRepo(t)
return
}
func ForEachXenRepo(f func(*XenRepo, Tree) error) error {
- f2 := func(tree Tree) (err error) {
- xr := G.repos.XenRepos[tree]
+ f2 := func(tree Tree) (error) {
+ xr, err := G.repos.GetRepo(tree)
+
+ if err != nil {
+ return err
+ }
return f(xr, tree)
}
Tool ToolConfig
Security SecurityMeta
}
- repos struct {
- XenRepos map[Tree]*XenRepo
- xsa Repo
- }
+ repos GlobalRepos
test struct {
topdir string
}
func globalReset() {
G.config.Tool = ToolConfig{}
G.config.Security = SecurityMeta{}
- G.repos.xsa = Repo{}
- G.repos.XenRepos = make(map[Tree]*XenRepo)
// Don't reset 'test' data
}
loadConfig := true
loadGlobal := false
loadXSA := false
+ checkXSARepos := true
tgt := args[1]
cmd := args[2]
case "init":
main = MainInit
loadGlobal = true
+ checkXSARepos = false
case "sync-patches":
main = MainSyncPatches
case "backport":
main = MainResetBase
case "set-patches":
main = MainSetPatches
+ checkXSARepos = false
default:
fmt.Printf("Unknown command: %s\n", cmd)
return 1
fmt.Printf("Error finding config: %v\n", err)
return 1
}
-
- if err := OpenRepos(); err != nil {
- fmt.Printf("Error opening repos: %v\n", err)
- return 1
- }
}
if loadGlobal {
xsanum, err)
return 1
}
+ if checkXSARepos {
+ err = xsa.OpenRepos()
+ if err != nil {
+ fmt.Printf("Error opening repos: %v\n", err)
+ return 1
+ }
+ }
}
return main(&xsa, args)
dirty bool
}
+func (m *XSAMeta) OpenRepos() (err error) {
+ for _, t := range m.Trees {
+ _, err = G.repos.GetRepo(t)
+ if err != nil {
+ return
+ }
+ }
+ return
+}
+
func (m *XSAMeta) GetRecipe(v XenVersion) *Recipe {
return m.Recipes[v]
}
}
makePatches := func(tree Tree) (err error) {
- xr := G.repos.XenRepos[tree]
+ xr := G.repos.GetRepoNC(tree)
branchHash, err := xr.ParseRef(branch)
if err != nil {
return
}
- xr := G.repos.XenRepos[tree]
+ xr := G.repos.GetRepoNC(tree)
if !xr.VerifyRef(branch) {
return ErrorMissingBranch(branch)
return
}
- xr := G.repos.XenRepos[tree]
+ xr := G.repos.GetRepoNC(tree)
_, baseline, branch := r.branchName(prefix)
return
}
- xr := G.repos.XenRepos[tree]
+ xr := G.repos.GetRepoNC(tree)
stable, baseline, _ := r.branchName(prefix)
_, toBase, toBranch := BranchName(prefix, r.xsa, to)
backport := func(tree Tree) (err error) {
- xr := G.repos.XenRepos[tree]
+ xr := G.repos.GetRepoNC(tree)
// git checkout -b xsa/NNN/$to xsa/NNN/$from
if err = xr.MakeBranch(toBranch, fromBranch); err != nil {
func (r *Recipe) Build(prefix string) (err error) {
_, _, branch := r.branchName(prefix)
- xenrepo := G.repos.XenRepos[TreeXen]
+ xenrepo := G.repos.GetRepoNC(TreeXen)
/* Always check out a temporary branch for xen */
tmpBranch := "xsa/tmp"
gitURLXSARepoConfig := func(configSpec string, tree Tree) {
if tr, prs := r.Recipes[tree]; prs && tr.HasPatches() {
config.AddRepoPathAndRevision(configSpec,
- "file://"+G.repos.XenRepos[tree].GetPath(),
+ "file://"+G.repos.GetRepoNC(tree).GetPath(),
branch)
} else {
config.AddRepoCachedURL(configSpec, tree.RepoName())
err = xr.ConfigEnableRerere()
}
- G.repos.XenRepos[t] = xr
-
return
}
origin := defaultUrl[tree]
if tree == TreeXSA {
- G.repos.xsa, err = cloneNormal(target, origin)
+ _, err = cloneNormal(target, origin)
} else {
- G.repos.XenRepos[tree], err = cloneXen(target, origin, tree)
+ _, err = cloneXen(target, origin, tree)
}
return
}
}
func MainRepoX(unused *XSAMeta, args []string) (ret int) {
- versions, err := G.repos.XenRepos[TreeXen].GetVersions()
+ var versions []XenVersionFull
+
+ xr, err := G.repos.GetRepo(TreeXen)
+
+ if err == nil {
+ versions, err = xr.GetVersions()
+ }
if err != nil {
fmt.Printf("Error getting versions: %v\n", err)
G.config.Tool.rootDir)
return false
}
- // Most repos are open after `repo init`, but xsa.git may not
- // be if it wasn't cloned.
- if err := OpenRepos(); err != nil {
- st.Errorf("Opening repos: %v\n", err)
- return false
- }
if TestFlags.MirrorDir != EmptyString &&
G.config.Tool.Cache.MirrorDir != TestFlags.MirrorDir {
return false
}
- // Most repos are open after `repo init`, but xsa.git may not
- // be if it wasn't cloned.
- if err := OpenRepos(); err != nil {
- st.Errorf("Opening repos: %v\n", err)
- return false
- }
-
updateBranches := func(t Tree) (err error) {
var r *Repo
if t == TreeXSA {
- r = &G.repos.xsa
+ r = &Repo{}
+ *r, err = GitOpen(G.config.Tool.GetPath(TreeXSA))
+ if err != nil {
+ return err
+ }
} else {
- xr, prs := G.repos.XenRepos[t]
- if !prs {
- err = fmt.Errorf("Not present: %s\n", t)
- return
+ xr, err := G.repos.GetRepo(t)
+ if err != nil {
+ err = fmt.Errorf("Couldn't open %s: %v\n", t, err)
+ return err
}
r = &xr.Repo
}
"4.8": "4.8.0",
"4.7": "4.7.2",
}
- r := G.repos.XenRepos[TreeXen]
+ r, err := G.repos.GetRepo(TreeXen)
+ if err != nil {
+ st.Errorf("Error opening Xen repo: %v\n", err)
+ }
versions, err := r.GetVersions()
if err != nil {
st.Errorf("Error getting Xen releases: %v\n", err)
// git am $PATH/xsa206-master/*.patch
- out, err := G.repos.XenRepos[TreeXen].Am("../testdata/xsa206-unstable/*.patch")
+ xr, err := G.repos.GetRepo(TreeXen)
+ if err != nil {
+ st.Errorf("Error opening xen tree: %v\n", err)
+ }
+ out, err := xr.Am("../testdata/xsa206-unstable/*.patch")
if err != nil {
st.Errorf("Error importing example patches: %v %s\n", err, string(out))
return
// - How many patches had been applied? (0)
// Fake things up:
- xr := G.repos.XenRepos[TreeXen]
+ xr, _ := G.repos.GetRepo(TreeXen)
// - git rebase --abort
if _, err := xr.RebaseAbort(); err != nil {
return fmt.Errorf("Error aborting rebase: %v\n", err)
if err = xr.MakeBranch(branch, baseline); err != nil {
return fmt.Errorf("Error fixing up rebase: %v\n", err)
}
- _, err = G.repos.XenRepos[TreeXen].AmClean("../testdata/xsa206-"+
- v.String()+"/*.patch")
+ _, err = xr.AmClean("../testdata/xsa206-"+v.String()+"/*.patch")
if err != nil {
return fmt.Errorf("Error importing example patches: %v\n", err)
}
xsa.Trees = append(xsa.Trees, tree)
}
+ if err := xsa.OpenRepos(); err != nil {
+ fmt.Printf("Cannot open repos: %v\n", err)
+ return 1
+ }
+
xsa.Recipes = make(map[XenVersion]*Recipe)
for v := range sm.Versions {
for _, t := range xsa.Trees {
var err error
- xr := G.repos.XenRepos[t]
+ xr := G.repos.GetRepoNC(t)
if err = xr.MakeStableBranch(v); err != nil {
fmt.Printf("Checking out stable branch for version %v: %v\n",
// Check out "xsa/NNN/master" on all relevant trees
_, _, branch := BranchName("xsa", xsa.XSA, XenVersion("master"))
for _, t := range xsa.Trees {
- _, err := G.repos.XenRepos[t].Checkout(branch)
+ _, err := G.repos.GetRepoNC(t).Checkout(branch)
if err != nil {
fmt.Printf("Checkout out branch %s\n", branch)
return 1
// -- Re-set stableref to upstream
// -- Re-apply recipe
-
vers := VersionsFromArgs(xsa, args, false)
for _, v := range vers {
for _, t := range xsa.Trees {
var err error
- xr := G.repos.XenRepos[t]
+ xr := G.repos.GetRepoNC(t)
if err = xr.MakeStableBranch(v); err != nil {
fmt.Printf("Checking out stable branch for tree %v version %v: %v\n",
for _, t := range xsa.Trees {
var err error
- xr := G.repos.XenRepos[t]
+ xr := G.repos.GetRepoNC(t)
if err = xr.MakeStableBranch(v); err != nil {
fmt.Printf("Checking out stable branch for tree %v version %v: %v\n",