summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2024-12-15 08:31:42 -0600
committerJeff Carr <[email protected]>2024-12-15 08:31:42 -0600
commit7cade75da86c346cd39ee37e85c066347cdaf274 (patch)
tree060d78d8465011293e0a574d512e35a7e32173b0
parent5f1f19d9ca4bec7b285256845d04ac76222cda13 (diff)
all sorts of updates. it didn't work before!
-rw-r--r--Makefile4
-rw-r--r--argv.go7
-rw-r--r--clone.go124
-rw-r--r--main.go207
4 files changed, 173 insertions, 169 deletions
diff --git a/Makefile b/Makefile
index 4668876..b3122f9 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
VERSION = $(shell git describe --tags)
BUILDTIME = $(shell date +%Y.%m.%d_%H%M)
-run: goimports build
+run: build
./go-clone --version
vet:
@@ -22,7 +22,7 @@ build-windows:
GOOS=windows GOARCH=amd64 GO111MODULE=off go build -v go-clone.exe \
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
-install:
+install: goimports
GO111MODULE=off go install \
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
diff --git a/argv.go b/argv.go
index 7880247..cb23077 100644
--- a/argv.go
+++ b/argv.go
@@ -13,10 +13,9 @@ type args struct {
AutoWork bool `arg:"--work" default:"false" help:"recreate the go.work file"`
DryRun bool `arg:"--dry-run" help:"show what would be run"`
Recursive bool `arg:"--recursive" default:"false" help:"resursively clone all dependencies"`
- Pull bool `arg:"--git-pull" default:"false" help:"run 'git pull' on all your repos"`
- Build bool `arg:"--build" default:"true" help:"also try to build it"`
- Install bool `arg:"--install" default:"false" help:"try to install every binary package"`
- RedoGoMod bool `arg:"--go-reset" default:"false" help:"remake all the go.sum and go.mod files"`
+ Pull bool `arg:"--git-pull" default:"false" help:"run 'git pull'"`
+ Build bool `arg:"--build" default:"true" help:"try to build it after clone"`
+ Install bool `arg:"--install" default:"false" help:"try to install it after clone"`
// Fetch bool `arg:"--git-fetch" default:"false" help:"run 'git fetch' on all your repos"`
}
diff --git a/clone.go b/clone.go
new file mode 100644
index 0000000..164e354
--- /dev/null
+++ b/clone.go
@@ -0,0 +1,124 @@
+package main
+
+import (
+ "errors"
+ "os"
+ "path/filepath"
+
+ "go.wit.com/lib/gui/shell"
+ "go.wit.com/lib/protobuf/gitpb"
+ "go.wit.com/log"
+)
+
+func clone(gopath string) (*gitpb.Repo, error) {
+ // if the user defined a repo, attempt to download it now
+ if gopath == "" {
+ // nothing to clone
+ // user probably wants to --recursive on current working dir
+ return nil, errors.New("gopath was blank")
+ }
+ os.Setenv("REPO_AUTO_CLONE", "true")
+ // pb, _ := forge.NewGoPath(gopath)
+ check := forge.Repos.FindByGoPath(gopath)
+ if check != nil {
+ if check.IsValid() {
+ // repo already exists and is valid
+ return check, nil
+ }
+ }
+ pb, err := forge.Clone(gopath)
+ if err != nil {
+ log.Info("clone() could not download err:", err)
+ return nil, err
+ }
+
+ // first try to generate go.mod & go.sum with go-mod-clean
+ 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("")
+ }
+ }
+ // if this fails, just use go mod
+ if err := pb.ValidGoSum(); err != nil {
+ if err := pb.RunStrict([]string{"go", "mod", "init", pb.GoPath}); err != nil {
+ log.Info("go mod init failed", err)
+ }
+ if err := pb.RunStrict([]string{"go", "mod", "tidy"}); err != nil {
+ log.Info("go mod tidy failed", err)
+ }
+ }
+ if err := pb.ValidGoSum(); err != nil {
+ // have to give up. can't recursive clone without go.mod file
+ log.Info("could not generate valid go.sum file")
+ return nil, err
+ }
+ pb.ParseGoSum()
+
+ // double check it actually downloaded
+ fullgitdir := filepath.Join(forge.GetGoSrc(), gopath, ".git")
+ if !shell.IsDir(fullgitdir) {
+ log.Info("repo cloned failed", filepath.Join(forge.GetGoSrc(), gopath))
+ return nil, errors.New(fullgitdir + " was not created")
+ }
+ log.Info("onward and upward")
+ return pb, nil
+}
+
+// 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(check *gitpb.Repo) error {
+ var good int
+ var bad int
+
+ if check == nil {
+ return errors.New("repo was nil")
+ }
+ log.Info("STARTING RECURSIVE CLONE", check.GoPath)
+ log.Info("STARTING RECURSIVE CLONE", check.GoPath)
+ if check.GoPrimitive {
+ log.Info("repo is a primitive", check.GoPath)
+ // go primitive repos are "pure"
+ return nil
+ }
+
+ // if just cloned, parse the go.sum file for deps
+ check.ParseGoSum()
+
+ if check.GoDeps == nil {
+ log.Info("repo godeps == nil", check.GoPath)
+ return errors.New("go.sum is missing?")
+ }
+
+ // probably this should never be 0 because GoPrimitive should have been true otherwise
+ if check.GoDeps.Len() == 0 {
+ log.Info("repo len(godeps) == 0", check.GoPath)
+ return errors.New("go.sum never parsed?")
+ }
+
+ log.Info("deps for", check.GoPath, "len()", check.GoDeps.Len())
+ deps := check.GoDeps.SortByGoPath()
+ for deps.Scan() {
+ depRepo := deps.Next()
+ log.Info("download:", depRepo.GoPath)
+ _, err := 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")
+ if bad != 0 {
+ return errors.New("clone failed on some repos")
+ }
+ return nil
+}
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"})