summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go207
1 files changed, 44 insertions, 163 deletions
diff --git a/main.go b/main.go
index 0f0ee1a..2bc6ad2 100644
--- a/main.go
+++ b/main.go
@@ -1,9 +1,7 @@
package main
import (
- "errors"
"os"
- "path/filepath"
"go.wit.com/dev/alexflint/arg"
"go.wit.com/lib/gui/shell"
@@ -18,7 +16,8 @@ var BUILDTIME string
var pp *arg.Parser
var forge *forgepb.Forge
-var argvRepo *gitpb.Repo
+
+var workingRepo *gitpb.Repo
func main() {
log.Info("go-clone version", VERSION, "built on", BUILDTIME)
@@ -34,73 +33,51 @@ func main() {
os.Exit(0)
}
- // load the ~/.config/forge/ config
- // this lets you configure repos you have read/write access too
+ // this package helps scan git repos
forge = forgepb.Init()
- argvRepo = forge.Repos.FindByGoPath(argv.Repo)
- if argvRepo == nil {
- log.Info("yep, need to clone", argv.Repo)
- } else {
- log.Info("already have", argv.Repo)
- if argv.Recursive {
- clone()
- recursiveClone()
- }
- autoWork()
- build()
- okExit(argv.Repo)
- }
-
- // gui is in testing
- // myGui := gui.New()
- // myGui.Default()
-
- // run 'git pull' if argv --git-pull
- if argv.Pull {
- gitPull()
- okExit("git pull")
- }
-
- // remake all the go.sum & go.mod in every repo
- // todo: make go.sum and go.mod git commit metadata
- if argv.RedoGoMod {
- // redoGoModAll()
+ var err error
+ // attempt to clone, returns *gitpb.Repo
+ workingRepo, err = clone(argv.Repo)
+ if err != nil {
+ badExit(err)
}
-
- // this works sometimes
if argv.Recursive {
- clone()
- recursiveClone()
- autoWork()
- build()
- okExit("--recursive")
+ log.Info("STARTING RECURSIVE CLONE", workingRepo.GoPath)
+ if err := recursiveClone(workingRepo); err != nil {
+ badExit(err)
+ }
}
-
- clone()
autoWork()
- if argv.Install {
- if err := forge.Install(argvRepo, nil); err == nil {
- okExit("install worked")
- } else {
+ if argv.Build {
+ if err := build(); err != nil {
badExit(err)
}
}
- if argv.Build {
- if err := forge.Build(argvRepo, nil); err == nil {
- okExit("build worked")
- argvRepo.RunEcho([]string{"ls", "-l"})
- } else {
- argvRepo.RunEcho([]string{"ls", "-l"})
+ if argv.Install {
+ // can only install binary or plugin go packages
+ if workingRepo.RepoType() == "binary" || workingRepo.RepoType() == "plugin" {
+ log.Info("install will probably fail", workingRepo.GoPath, "is", workingRepo.RepoType())
+ }
+ if err := forge.Install(workingRepo, nil); err != nil {
+ log.Warn("INSTALL FAILED", workingRepo.GoPath, err)
badExit(err)
}
}
- okExit("skipping build of " + argv.Repo)
+
+ if argv.Pull {
+ // run 'git pull' if argv --git-pull
+ gitPull()
+ }
+ okExit("")
}
func okExit(thing string) {
- log.Info(thing, "ok")
- log.Info("Finished clone on", argvRepo.GetGoPath(), "ok")
+ if thing != "" {
+ log.Info(thing, "ok")
+ }
+ log.Info("Finished clone on", workingRepo.GetGoPath(), "ok")
+ forge.ConfigSave()
os.Exit(0)
}
@@ -110,56 +87,9 @@ func badExit(err error) {
os.Exit(-1)
}
-func clone() {
- // if the user defined a repo, attempt to download it now
- if argv.Repo != "" {
- os.Setenv("REPO_AUTO_CLONE", "true")
- // pb, _ := forge.NewGoPath(argv.Repo)
- check := forge.Repos.FindByGoPath(argv.Repo)
- if check != nil {
- return
- }
- pb, err := forge.Clone(argv.Repo)
- if err != nil {
- log.Info("clone() could not download err:", err)
- badExit(err)
- }
-
- if err := pb.ValidGoSum(); err != nil {
- // update go.sum and go.mod
- if err := pb.RunStrict([]string{"go-mod-clean"}); err != nil {
- log.Info("")
- log.Info("Do you have go-mod-clean? Otherwise:")
- log.Info(" go install go.wit.com/apps/go-mod-clean@latest")
- log.Info("")
- badExit(err)
- }
- }
- if err := pb.ValidGoSum(); err != nil {
- log.Info("could not generate valid go.sum file")
- badExit(err)
- }
-
- // double check it actually downloaded
- fullgitdir := filepath.Join(forge.GetGoSrc(), argv.Repo, ".git")
- if !shell.IsDir(fullgitdir) {
- log.Info("repo cloned failed", filepath.Join(forge.GetGoSrc(), argv.Repo))
- badExit(errors.New(fullgitdir + " was not created"))
- }
- build()
- // exit unless other --argv options are set
- if !(argv.Recursive || argv.Pull || argv.RedoGoMod) {
- log.Info("repo cloned worked to", filepath.Join(forge.GetGoSrc(), argv.Repo))
- okExit(argv.Repo)
- }
- log.Info("onward and upward")
- }
-}
-
func gitPull() {
log.Info("Total repositories:", forge.Repos.Len())
log.Info("Going to run git pull in each one. TODO: use rill here")
- log.Sleep(1)
pull := []string{"git", "pull"}
var trycount, errcount int
@@ -181,75 +111,26 @@ func gitPull() {
log.Info("Total repositories:", forge.Repos.Len(), "Total attempted:", trycount, "Errors:", errcount)
}
-// really only does go.sum things
-// so not 'really' recursive
-// but that is because go.sum is supposed
-// to have everything required in it
-func recursiveClone() {
- var good int
- var bad int
- // this works sometimes
- if argv.Recursive {
- check := forge.Repos.FindByGoPath(argv.Repo)
-
- log.Info("download deps for:", check.GoPath)
- deps := check.GoDeps.SortByGoPath()
- for deps.Scan() {
- depRepo := deps.Next()
- log.Info("download:", depRepo.GoPath)
- _, err := forge.Clone(depRepo.GoPath)
- if err != nil {
- log.Info("recursiveClone() could not download", depRepo.GoPath)
- log.Info("err:", err)
- bad += 1
- } else {
- log.Info("downloaded", depRepo.GoPath)
- good += 1
- }
- }
- }
- log.Info("got", good, "repos", "failed on", bad, "repos")
-}
-
func build() error {
- forge.RillRedoGoMod()
- repos := forge.Repos.SortByGoPath()
- for repos.Scan() {
- repo := repos.Next()
- log.Info("go.work repo (hopefully):", repo.GoPath, repo.FullPath, repo.RepoType())
- }
- if argv.Install {
- if err := forge.Install(argvRepo, nil); err == nil {
- okExit("install worked")
- } else {
- badExit(err)
- }
- }
- if argv.Build {
- err := forge.Build(argvRepo, nil)
- pwd, _ := os.Getwd()
- if err == nil {
- log.Info("this totally worked", pwd)
- shell.RunEcho([]string{"ls", "-l"})
- log.Info("ran ls")
- } else {
- log.Info("this totally did not work", pwd)
- shell.RunEcho([]string{"ls", "-l"})
- log.Info("ran ls")
- }
- return err
-
+ err := forge.Build(workingRepo, nil)
+ pwd, _ := os.Getwd()
+ if err == nil {
+ log.Info("this totally worked", pwd)
+ shell.RunEcho([]string{"ls", "-l"})
+ log.Info("ran ls")
+ } else {
+ log.Info("this totally did not work", pwd)
+ shell.RunEcho([]string{"ls", "-l"})
+ log.Info("ran ls")
+ badExit(err)
}
- log.Info("skipping build")
- return nil
+ return err
}
func autoWork() {
// remake the go.work file
if argv.AutoWork {
log.Info("About to re-create", forge.GetGoSrc()+"/go.work")
- log.Info("Sleep 3. original go.work saved as go.work.last (hit ctrl-c to cancel)")
- log.Sleep(3)
shell.PathRun(forge.GetGoSrc(), []string{"mv", "go.work", "go.work.last"})
forge.MakeGoWork()
shell.PathRun(forge.GetGoSrc(), []string{"go", "work", "use"})