"strings"
)
-func MainGlobalUpdate(xsanum int, args []string) int {
+func MainGlobalUpdate(unused *XSAMeta, args []string) int {
err := OpenRepos()
if err != nil {
fmt.Printf("Error opening repos: %v\n", err)
}
fmt.Printf("Getting Xen releases from treee...\n")
- versions, err := repos.XenRepos[TreeXen].GetVersions()
+ versions, err := G.repos.XenRepos[TreeXen].GetVersions()
if err != nil {
fmt.Printf("Error getting Xen releases: %v\n", err)
return 1
return 0
}
-func MainGlobalInfo(xsanum int, args []string) int {
+func MainGlobalInfo(unused *XSAMeta, args []string) int {
return 0
}
"strconv"
)
-var repos struct {
- XenRepos map[Tree]*XenRepo
- xsa Repo
-}
-
func OpenRepos() (err error) {
open := func(t Tree) (err error) {
- repos.XenRepos[t], err = XenRepoOpen(config.Tool.GetPath(t), t)
+ G.repos.XenRepos[t], err = XenRepoOpen(G.config.Tool.GetPath(t), t)
return
}
func ForEachXenRepo(f func(*XenRepo, Tree) error) error {
f2 := func(tree Tree) (err error) {
- xr := repos.XenRepos[tree]
+ xr := G.repos.XenRepos[tree]
return f(xr, tree)
}
return ForEachCodeTree(f2)
}
-func VersionsFromArgs(args []string) (vers []XenVersion) {
+func VersionsFromArgs(xsa *XSAMeta, args []string) (vers []XenVersion) {
if len(args) == 1 && args[0] == "all" {
vers = append(vers, xsa.SupportedVersions...)
} else {
return
}
-type MainFunc func(int, []string) int
+type MainFunc func(*XSAMeta, []string) int
-var config struct {
- Tool ToolConfig
- Security SecurityMeta
+// GLOBAL
+var G struct {
+ config struct {
+ Tool ToolConfig
+ Security SecurityMeta
+ }
+ repos struct {
+ XenRepos map[Tree]*XenRepo
+ xsa Repo
+ }
}
-var xsa XSAMeta
+// Reset global state each run for testing sake
+func globalReset() {
+ G.config.Tool = ToolConfig{}
+ G.config.Security = SecurityMeta{}
+ G.repos.xsa = Repo{}
+ G.repos.XenRepos = make(map[Tree]*XenRepo)
+}
-func main() {
+func XsaMain(args []string) int {
+ var xsa XSAMeta
var main MainFunc
- loadConfig := false
- loadXSA := false
- var xsanum int
- var err error
- repos.XenRepos = make(map[Tree]*XenRepo)
+ globalReset()
- args := os.Args
+ loadConfig := false
+ loadXSA := false
if len(args) < 3 {
fmt.Printf("Not enough arguments\n")
- os.Exit(1)
+ return 1
}
tgt := args[1]
cmd := args[0]
args = args[1:]
+ var err error
+ var xsanum int
if xsanum, err = strconv.Atoi(tgt); err == nil {
switch cmd {
case "new":
- main = func(xsanum int, args []string) int {
- if xsanum == 0 {
+ xsa.XSA = xsanum
+ main = func(xsa *XSAMeta, args []string) int {
+ if xsa.XSA == 0 {
fmt.Printf("Error: Need an XSA\n")
return 1
}
loadXSA = true
default:
fmt.Printf("Unknown command: %s\n", cmd)
- os.Exit(1)
+ return 1
}
} else if tgt == "repo" {
switch cmd {
case "init":
main = MainRepoInit
+ case "x":
+ main = MainRepoX
+ loadConfig = true
case "info":
loadConfig = true
main = MainRepoInfo
default:
fmt.Printf("Unknown command: %s\n", cmd)
- os.Exit(1)
+ return 1
}
} else if tgt == "global" {
switch cmd {
main = MainGlobalInfo
default:
fmt.Printf("Unknown command: %s\n", cmd)
- os.Exit(1)
+ return 1
}
}
if loadConfig {
- err := config.Tool.Load()
+ err := G.config.Tool.Load()
if err != nil {
fmt.Printf("Error finding config: %v\n", err)
- os.Exit(1)
+ return 1
}
}
if err != nil {
fmt.Printf("Loading xsa-%d metadata: %v\n",
xsanum, err)
- os.Exit(1)
+ return 1
}
}
- os.Exit(main(xsanum, args))
+ return main(&xsa, args)
+}
+
+func main() {
+ os.Exit(XsaMain(os.Args))
}
const GlobalMetaFilename = "global.meta"
func (sm *SecurityMeta) Load() (err error) {
- if config.Tool.GetPath(TreeXSA) == "" {
+ if G.config.Tool.GetPath(TreeXSA) == "" {
return fmt.Errorf("Tool config not loaded")
}
- filename := config.Tool.GetPath(TreeXSA) + "/" + GlobalMetaFilename
+ filename := G.config.Tool.GetPath(TreeXSA) + "/" + GlobalMetaFilename
b, err := ioutil.ReadFile(filename)
if err != nil {
}
func (sm *SecurityMeta) Save() (err error) {
- if config.Tool.GetPath(TreeXSA) == "" {
+ if G.config.Tool.GetPath(TreeXSA) == "" {
return fmt.Errorf("Tool config not loaded")
}
return fmt.Errorf("Marshalling config: %v", err)
}
- filename := config.Tool.GetPath(TreeXSA) + "/" + GlobalMetaFilename
+ filename := G.config.Tool.GetPath(TreeXSA) + "/" + GlobalMetaFilename
err = ioutil.WriteFile(filename, b, 0666)
if err != nil {
return fmt.Errorf("Writing config: %v", err)
}
func getXSAPath(xsanum int) string {
- return fmt.Sprintf("%s/xsa%d.meta", config.Tool.GetPath(TreeXSA), xsanum)
+ return fmt.Sprintf("%s/xsa%d.meta", G.config.Tool.GetPath(TreeXSA), xsanum)
}
func (xm *XSAMeta) Load(xsanum int) (err error) {
- if config.Tool.GetPath(TreeXSA) == "" {
+ if G.config.Tool.GetPath(TreeXSA) == "" {
return fmt.Errorf("Tool config not loaded")
}
}
func (xm *XSAMeta) Save() (err error) {
- if config.Tool.GetPath(TreeXSA) == "" {
+ if G.config.Tool.GetPath(TreeXSA) == "" {
return fmt.Errorf("Tool config not loaded")
}
//
// 'unstable' if VVV is 'master'
- xsabase := fmt.Sprintf("xsa%d", xsa.XSA)
+ xsabase := fmt.Sprintf("xsa%d", r.xsa)
if tree != TreeXen {
xsabase += "-" + tree.String()
xsabase += "-" + r.XenVersionFull.XenVersion().String()
}
- xsatgt := config.Tool.GetPath(TreeXSA) + "/" + xsabase
+ xsatgt := G.config.Tool.GetPath(TreeXSA) + "/" + xsabase
// rm -rf ../xsa.git/xsa206-unstable
// Do a full remove of $base and $base.patch just to be sure
for _, glob := range tr.Patches {
// git am
- _, err = xr.AmClean(config.Tool.GetPath(TreeXSA) + "/" + glob)
+ _, err = xr.AmClean(G.config.Tool.GetPath(TreeXSA) + "/" + glob)
if err != nil {
return fmt.Errorf("Appling am %s: %v\n", glob, err)
}
if err != nil {
return err
}
- return r.apply(repos.XenRepos[tree], tr, prefix)
+ return r.apply(G.repos.XenRepos[tree], tr, prefix)
}
func (r *Recipe) Build(prefix string) (err error) {
branch, _ := r.branchName(prefix)
- xenrepo := repos.XenRepos[TreeXen]
+ xenrepo := G.repos.XenRepos[TreeXen]
/* Always check out a temporary branch for xen */
tmpBranch := "tmp"
config += "OVMF_UPSTREAM_URL ?= file://" + mirrorpath + "ovmf.git\n"
config += "SEABIOS_UPSTREAM_URL ?= file://" + mirrorpath + "seabios.git\n"
config += "MINIOS_UPSTREAM_URL ?= file://" + mirrorpath + "mini-os.git\n"
- config += "QEMU_UPSTREAM_URL ?= file://" + repos.XenRepos[TreeQemuU].GetPath() + "\n"
- config += "QEMU_TRADITIONAL_URL ?= file://" + repos.XenRepos[TreeQemuT].GetPath() + "\n"
+ config += "QEMU_UPSTREAM_URL ?= file://" + G.repos.XenRepos[TreeQemuU].GetPath() + "\n"
+ config += "QEMU_TRADITIONAL_URL ?= file://" + G.repos.XenRepos[TreeQemuT].GetPath() + "\n"
if tr, prs := r.Recipes[TreeQemuU]; prs && tr.HasPatches() {
config += "QEMU_UPSTREAM_REVISION = origin/" + branch + "\n"
// Then attempt to clone the repositories and set them up so that push
// is disabled by default. Don't overwrite existing repositories
// unless -f is specified.
-func MainRepoInit(xsanum int, args []string) (ret int) {
+func MainRepoInit(unused *XSAMeta, args []string) (ret int) {
force := false
for len(args) > 0 {
}
fmt.Printf("Trying local config...\n")
- if err := config.Tool.Load(); err != nil {
+ if err := G.config.Tool.Load(); err != nil {
if os.IsNotExist(err) {
- config.Tool.Init()
+ G.config.Tool.Init()
} else {
fmt.Printf("Error opening config file: %v\n", err)
return 1
TreeXSA: "xsa.git",
}
setDefaultPath := func(tree Tree) (err error) {
- _, prs := config.Tool.Paths[tree]
+ _, prs := G.config.Tool.Paths[tree]
if prs {
- fmt.Printf("Already set to %s\n", config.Tool.Paths[tree])
+ fmt.Printf("Already set to %s\n", G.config.Tool.Paths[tree])
} else {
- config.Tool.Paths[tree] = defaultPath[tree]
+ G.config.Tool.Paths[tree] = defaultPath[tree]
fmt.Printf("Setting default: %s\n", defaultPath[tree])
}
return
err = xr.DisablePush()
}
- repos.XenRepos[t] = xr
+ G.repos.XenRepos[t] = xr
return
}
}
clone := func(tree Tree) (err error) {
- target := config.Tool.Paths[tree]
+ target := G.config.Tool.Paths[tree]
origin := defaultUrl[tree]
if tree == TreeXSA {
- repos.xsa, err = cloneNormal(target, origin)
+ G.repos.xsa, err = cloneNormal(target, origin)
} else {
- repos.XenRepos[tree], err = cloneXen(target, origin, tree)
+ G.repos.XenRepos[tree], err = cloneXen(target, origin, tree)
}
return
}
return 1
}
- err = config.Tool.Save()
+ err = G.config.Tool.Save()
if err != nil {
fmt.Printf("Trying to save config: %v\n", err)
return 1
}
- err = config.Tool.Save()
+ err = G.config.Tool.Save()
if err != nil {
fmt.Printf("Trying to save config: %v\n", err)
return 1
return 0
}
-func MainRepoInfo(xsanum int, args []string) (ret int) {
+func MainRepoInfo(unused *XSAMeta, args []string) (ret int) {
fmt.Printf("[Tool]\n")
- fmt.Printf("rootDir: %s\n", config.Tool.rootDir)
- fmt.Printf("XSA repo: %s\n", config.Tool.GetPath(TreeXSA))
- fmt.Printf("Xen repo: %s\n", config.Tool.GetPath(TreeXen))
- fmt.Printf("Qemu Upstream repo: %s\n", config.Tool.GetPath(TreeQemuU))
- fmt.Printf("Qemu Traditional repo: %s\n", config.Tool.GetPath(TreeQemuT))
+ fmt.Printf("rootDir: %s\n", G.config.Tool.rootDir)
+ fmt.Printf("XSA repo: %s\n", G.config.Tool.GetPath(TreeXSA))
+ fmt.Printf("Xen repo: %s\n", G.config.Tool.GetPath(TreeXen))
+ fmt.Printf("Qemu Upstream repo: %s\n", G.config.Tool.GetPath(TreeQemuU))
+ fmt.Printf("Qemu Traditional repo: %s\n", G.config.Tool.GetPath(TreeQemuT))
+ return 0
+}
+
+func MainRepoX(unused *XSAMeta, args []string) (ret int) {
+ err := OpenRepos()
+ if err != nil {
+ fmt.Printf("Error opening repos: %v\n", err)
+ return 1
+ }
+
+ versions, err := G.repos.XenRepos[TreeXen].GetVersions()
+
+ if err != nil {
+ fmt.Printf("Error getting versions: %v\n", err)
+ return 1
+ }
+
+ fmt.Printf("Versions in repo: %v\n", versions)
+
return 0
}
func test(xsa *XSAMeta, args []string, apply bool, build bool) (ret int) {
- vers := VersionsFromArgs(args)
+ vers := VersionsFromArgs(xsa, args)
for _, v := range vers {
prefix := "test"
return 0
}
-func MainTestApply(xsanum int, args []string) (ret int) {
+func MainTestApply(xsa *XSAMeta, args []string) (ret int) {
err := OpenRepos()
if err != nil {
return 1
}
- return test(&xsa, args, true, false)
+ return test(xsa, args, true, false)
}
-func MainTestBuild(xsanum int, args []string) (ret int) {
+func MainTestBuild(xsa *XSAMeta, args []string) (ret int) {
err := OpenRepos()
if err != nil {
return 1
}
- return test(&xsa, args, false, true)
+ return test(xsa, args, false, true)
}
-func MainTest(xsanum int, args []string) (ret int) {
+func MainTest(xsa *XSAMeta, args []string) (ret int) {
err := OpenRepos()
if err != nil {
return 1
}
- return test(&xsa, args, true, true)
+ return test(xsa, args, true, true)
}
"fmt"
)
-func sync(args []string, sync bool) (ret int) {
+func sync(xsa *XSAMeta, args []string, sync bool) (ret int) {
err := OpenRepos()
if err != nil {
fmt.Printf("Error initializing repos: %v\n", err)
return 1
}
- vers := VersionsFromArgs(args)
+ vers := VersionsFromArgs(xsa, args)
if !sync && len(vers) > 1 {
fmt.Printf("Error: Doesn't make sense to make more than one version\n")
return 0
}
-func MainSyncPatches(xsanum int, args []string) (ret int) {
- return sync(args, true)
+func MainSyncPatches(xsa *XSAMeta, args []string) (ret int) {
+ return sync(xsa, args, true)
}
-func MainMakePatches(xsanum int, args []string) (ret int) {
- return sync(args, false)
+func MainMakePatches(xsa *XSAMeta, args []string) (ret int) {
+ return sync(xsa, args, false)
}
-func MainSyncBranch(xsanum int, args []string) (ret int) {
- vers := VersionsFromArgs(args)
+func MainSyncBranch(xsa *XSAMeta, args []string) (ret int) {
+ vers := VersionsFromArgs(xsa, args)
for _, v := range vers {
prefix := "xsa"
}
// xsatool NNN new-recipe $FULLVERSION {xen,qemuu,qemut} [prerequisites]
-func MainNewRecipe(xsanum int, args []string) (ret int) {
+func MainNewRecipe(xsa *XSAMeta, args []string) (ret int) {
if len(args) < 2 {
fmt.Printf("Not enough argruments\n")
return 1
} else {
r = xsa.NewRecipe(fv)
fmt.Printf("Made new metadata: %v\n", *r)
- if r.xsa != xsanum {
+ if r.xsa != xsa.XSA {
fmt.Printf("xsanum didn't get set!\n")
return 1
}