Compare commits

...

134 Commits

Author SHA1 Message Date
Jeff Carr dcac6d6608 build-quick 2025-09-22 20:35:06 -05:00
Jeff Carr da0540d3a7 more stuff 2025-09-13 07:45:09 -05:00
Jeff Carr bcaded6b37 s// 2025-09-13 07:30:31 -05:00
Jeff Carr 926a1ce33c moved to new scan func 2025-09-13 07:09:28 -05:00
Jeff Carr d31c80d780 minor 2025-09-13 05:32:42 -05:00
Jeff Carr 0e6cefb72e duh 2025-09-13 01:57:04 -05:00
Jeff Carr 5ceab01b0e smarter build 2025-09-13 01:31:07 -05:00
Jeff Carr 2d5a45476c api change 2025-09-13 01:07:42 -05:00
Jeff Carr 03daf07ec2 rm bits 2025-09-12 16:02:14 -05:00
Jeff Carr dca25f2425 rm debugging code 2025-09-12 16:01:33 -05:00
Jeff Carr 756586e95e attempt to debug the release process further 2025-09-12 15:51:45 -05:00
Jeff Carr bad8a5c628 trying to debug the process 2025-09-12 15:40:19 -05:00
Jeff Carr 73cc9c0693 track down versioning 2025-09-12 15:12:32 -05:00
Jeff Carr 63dc802ded add tag check to doRelease() 2025-09-12 14:52:13 -05:00
Jeff Carr fd2254cd72 stop using GoSrc() 2025-09-11 22:14:41 -05:00
Jeff Carr d813ade5ab trying to get things back to working 2025-09-11 07:53:07 -05:00
Jeff Carr 7cf1758a36 back to a common Init() 2025-09-11 04:38:22 -05:00
Jeff Carr ad1144efe5 new forge init() 2025-09-11 03:28:07 -05:00
Jeff Carr fa876aa17d switch to new config 2025-09-11 03:15:28 -05:00
Jeff Carr 131d6b4178 everything must be on the master branch to publish 2025-09-10 17:30:33 -05:00
Jeff Carr c0d131a659 new GUI codebase 2025-09-09 05:45:29 -05:00
Jeff Carr e5c43347ea try even quicker release process 2025-09-05 13:04:46 -05:00
Jeff Carr 515f862f19 patch stuff 2025-09-05 01:24:25 -05:00
Jeff Carr 27b10fdc73 releaser went through the whole process this time 2025-09-04 12:34:37 -05:00
Jeff Carr 09d595fd53 attempt to fix the release process 2025-09-03 20:50:30 -05:00
Jeff Carr d5626a5e23 fixes 2025-08-31 16:30:12 -05:00
Jeff Carr d8706ed738 fix the release process somewhat 2025-08-31 09:15:25 -05:00
Jeff Carr 1528d8d507 verify all repos are on master 2025-08-17 23:44:34 -05:00
Jeff Carr 2f6b497b12 fixes do to 'go mod' behavior changes 2025-05-29 19:18:12 -05:00
Jeff Carr c0b5f7da3a stub in args 2025-03-23 11:41:33 -05:00
Jeff Carr 8037a3cc01 minor 2025-03-22 05:21:48 -05:00
Jeff Carr 0cfaf29361 run this way 2025-03-19 07:52:51 -05:00
Jeff Carr 0662c2e0cb minor 2025-03-19 07:19:32 -05:00
Jeff Carr 236a7cb5e8 add verbose 2025-03-05 05:11:50 -06:00
Jeff Carr 8d5d7ca85c hmm. notsure what is going on 2025-03-05 04:35:38 -06:00
Jeff Carr 6add3f9982 notsure why this stalled without this line 2025-03-05 03:57:17 -06:00
Jeff Carr bfa63cac22 these are done now 2025-03-03 11:10:19 -06:00
Jeff Carr 392ea6e98e misc 2025-02-22 07:35:45 -06:00
Jeff Carr 0a1cb978e8 allow building just changed packages 2025-02-22 03:40:49 -06:00
Jeff Carr 3ff6dae849 put a non-empty file in resources/ 2025-02-20 11:06:08 -06:00
Jeff Carr 721ee08ad2 actually try to make all the packages also 2025-02-19 18:19:28 -06:00
Jeff Carr 38a0f70c78 trim old code 2025-02-17 14:14:00 -06:00
Jeff Carr eb57f644f7 rm old code 2025-02-15 18:58:56 -06:00
Jeff Carr 93b659020b remove wrong code 2025-02-15 18:55:19 -06:00
Jeff Carr a128a45ef9 attempt to make debian packages on success 2025-02-15 18:02:46 -06:00
Jeff Carr 8efada2a54 handle private repos first 2025-02-14 20:42:16 -06:00
Jeff Carr f70f3bfe1a hopefully the last check. perfectly perfect? 2025-02-14 19:15:57 -06:00
Jeff Carr 2f1d7ac1f2 minor 2025-02-14 17:58:20 -06:00
Jeff Carr ffecf5ea0a finally am checking for duplicate tags correctly. maybe. 2025-02-14 00:43:16 -06:00
Jeff Carr 8f514d4268 fix changes related to plugin updates 2025-02-14 00:09:37 -06:00
Jeff Carr 225cd84f68 set MAX loop to Repos.Len() 2025-02-12 17:02:47 -06:00
Jeff Carr 248642b681 minor 2025-02-12 17:01:03 -06:00
Jeff Carr cfd6046978 handle primitive package logic 2025-02-12 10:35:50 -06:00
Jeff Carr 76c327b1f1 send back an error on nil 2025-02-09 15:05:10 -06:00
Jeff Carr 447b4ebd3b changed 20 to 40 2025-02-09 14:53:31 -06:00
Jeff Carr 973032af1c nil check 2025-02-09 14:50:08 -06:00
Jeff Carr 8d33a63e7e hot diggity. this might actually work. 2025-02-08 19:46:39 -06:00
Jeff Carr 8cc487393f checks for more things 2025-02-08 06:32:37 -06:00
Jeff Carr 021c7774b2 moved lots of logic to go-mod-clean 2025-02-07 11:21:51 -06:00
Jeff Carr 3ceb5d0bf5 lame debugging code before. couldn't tell what was failing 2025-01-30 14:12:29 -06:00
Jeff Carr 501241dbb6 func name change 2025-01-30 12:08:08 -06:00
Jeff Carr 2ea06531dc minor debugging on the end 2025-01-30 04:43:51 -06:00
Jeff Carr 8d4687e2c1 dump old doRelease() all code. terrible code 2025-01-30 03:06:49 -06:00
Jeff Carr d81a1f6cb9 just name fixups. maybe more. this still doesn't work 2025-01-30 01:47:56 -06:00
Jeff Carr ffb90cd28f this process is annoying 2025-01-30 01:15:00 -06:00
Jeff Carr f690c1a8a3 need fixes to force versions in go.mod 2025-01-29 21:24:08 -06:00
Jeff Carr 250742905f maybe this works finally 2025-01-29 20:43:03 -06:00
Jeff Carr 9ee828cc3b hopefully this logic will finally fucking work 2025-01-29 20:00:26 -06:00
Jeff Carr 1d6c67b46c fix more of the logic errors 2025-01-29 16:41:01 -06:00
Jeff Carr 2d118d3ae7 worked pretty well last release 2025-01-28 11:36:06 -06:00
Jeff Carr 0ec680f2c3 maybe actually works 2025-01-20 08:14:18 -06:00
Jeff Carr fbc3dae556 improving the logic 2025-01-20 07:58:39 -06:00
Jeff Carr 9ef08346f8 print published repos at the end 2025-01-20 05:09:28 -06:00
Jeff Carr 782a2c35b1 try to debug the current logic 2025-01-19 11:51:54 -06:00
Jeff Carr 82f06c160a more rill. trying to improve logic 2025-01-19 10:48:16 -06:00
Jeff Carr f3e7f02e16 Merge branch 'jcarr' into devel 2025-01-19 04:35:58 -06:00
Jeff Carr ff90528c2e this needs rework 2025-01-19 04:32:01 -06:00
Jeff Carr f9c5e4c444 rill some stuff 2025-01-18 11:31:36 -06:00
Jeff Carr 57883ffa61 rill stuff 2025-01-18 11:11:06 -06:00
Jeff Carr 31a8c54d0f minor 2025-01-18 08:04:39 -06:00
Jeff Carr e4616e5971 put in wrong place 2025-01-18 07:57:51 -06:00
Jeff Carr 5bc157ec34 still fucking loops(?) 2025-01-18 07:30:11 -06:00
Jeff Carr 80109e7e65 more debugging 2025-01-18 05:52:41 -06:00
Jeff Carr 9738e869bf keep tracking down publish loops 2025-01-18 04:47:57 -06:00
Jeff Carr 0eeab33e64 zookeeper debian package logic is wrong 2025-01-18 03:13:58 -06:00
Jeff Carr ab73c05b9d double check finished repos 2025-01-17 14:19:26 -06:00
Jeff Carr 68ee252acd add bash support 2025-01-17 06:20:55 -06:00
Jeff Carr 9431656ae8 quiet output 2025-01-17 05:30:24 -06:00
Jeff Carr 5a745337fb check for go-mod-clean 2025-01-17 05:13:11 -06:00
Jeff Carr cb26cd9610 notes on what to fix 2025-01-17 04:47:32 -06:00
Jeff Carr db659057c1 .proto changes 2025-01-13 08:11:43 -06:00
Jeff Carr f5b53b403e quiet some output 2025-01-08 04:53:45 -06:00
Jeff Carr 2c71c4a5fe keep working on why this doesn't work anymore 2025-01-08 02:39:30 -06:00
Jeff Carr 3d94edd024 code cleanup in aisle 9 2025-01-08 00:59:38 -06:00
Jeff Carr a0428fa5f6 move code into forgepb 2025-01-08 00:52:17 -06:00
Jeff Carr bc710a8fd2 minor 2025-01-08 00:24:00 -06:00
Jeff Carr 81d34e86a1 tracking down bugs 2025-01-07 21:17:33 -06:00
Jeff Carr fcbc000fcf blah 2025-01-07 07:09:39 -06:00
Jeff Carr 7ccbf7f59d say goodbye finally 2025-01-07 06:46:55 -06:00
Jeff Carr 209c270add no longer merge to master 2025-01-07 03:23:47 -06:00
Jeff Carr 439067b9ac improve versioning by verifying it is greater
Signed-off-by: Jeff Carr <jcarr@wit.com>
2025-01-05 17:35:21 -06:00
Jeff Carr 6d0503b9e5 sure thing 2024-12-30 06:03:49 -06:00
Jeff Carr c9639a8db2 try to use the last tag versions 2024-12-18 20:24:28 -06:00
Jeff Carr 35fdbe3150 go.work files should be git metadata 2024-12-18 20:08:48 -06:00
Jeff Carr 54c70eb166 rm old stuff 2024-12-18 01:29:24 -06:00
Jeff Carr 5447f9ebfe jesus. what a slow slog 2024-12-17 23:59:08 -06:00
Jeff Carr 79ea2eaec1 more and more and more 2024-12-17 21:58:14 -06:00
Jeff Carr 491c4455d8 use GetGoPrimitive() 2024-12-17 20:47:35 -06:00
Jeff Carr 4e0a111c8c more things moved to gitpb 2024-12-17 18:48:45 -06:00
Jeff Carr 9e297f4603 attempt to save pb and reload it 2024-12-17 15:36:54 -06:00
Jeff Carr db2296b5b4 fix for new gitpb 2024-12-17 13:13:15 -06:00
Jeff Carr 3d22172fa9 fixes for new gitpb 2024-12-17 07:03:17 -06:00
Jeff Carr 8dd47d59e3 oops 2024-12-16 00:21:32 -06:00
Jeff Carr e76894265e add --protobuf 2024-12-16 00:19:03 -06:00
Jeff Carr 04f3fa193a hmm. move this to forge 2024-12-15 22:53:01 -06:00
Jeff Carr 279182ab62 maybe safely exit when finished 2024-12-15 20:53:15 -06:00
Jeff Carr 8e9408bac8 don't os.exit anymore as often 2024-12-15 17:03:51 -06:00
Jeff Carr 24ddb803f3 maybe forge.ConfigSave() at the right time? 2024-12-15 15:52:11 -06:00
Jeff Carr 139653ba8c add --minor argv. will it work? 2024-12-15 08:46:23 -06:00
Jeff Carr 7bfd240649 force binary and plugin packages to update 2024-12-14 23:28:53 -06:00
Jeff Carr 5f196513df maybe don't redo those go.* files anymore here 2024-12-14 23:22:34 -06:00
Jeff Carr 47085c837e use go-mod-clean --strict here 2024-12-14 18:47:28 -06:00
Jeff Carr e214aff7db keep trying to automate this 2024-12-14 16:29:14 -06:00
Jeff Carr 1c8f55d397 move checks to panic in safer places 2024-12-13 20:32:07 -06:00
Jeff Carr d1708d6a4b logic is better 2024-12-13 19:30:12 -06:00
Jeff Carr 6f39827fb9 need to run from a unchanged repo 2024-12-13 19:00:20 -06:00
Jeff Carr ffade519ff attempt to AutogenSave() files 2024-12-13 16:19:12 -06:00
Jeff Carr 02bce38b78 use go-mod-clean 2024-12-13 12:35:39 -06:00
Jeff Carr da4f5402b3 works?
Signed-off-by: Jeff Carr <jcarr@wit.com>
2024-12-13 04:13:33 -06:00
Jeff Carr 0de08f72ef maybe someday this will work 2024-12-13 02:21:39 -06:00
Jeff Carr 6e9ff62fba keep switching to protobuf 2024-12-12 02:05:47 -06:00
Jeff Carr 2d981da765 better checking 2024-12-11 01:19:07 -06:00
Jeff Carr 20b3fa3520 testing automation 2024-12-10 01:47:45 -06:00
Jeff Carr dcf18c2b7a minor 2024-12-07 16:47:51 -06:00
17 changed files with 863 additions and 1212 deletions

View File

@ -1,9 +1,10 @@
VERSION = $(shell git describe --tags) VERSION = $(shell git describe --tags)
BUILDTIME = $(shell date +%Y.%m.%d) BUILDTIME = $(shell date +%Y.%m.%d)
all: build all: install
goimports: goimports:
reset
goimports -w *.go goimports -w *.go
# // to globally reset paths: # // to globally reset paths:
# // gofmt -w -r "go.wit.com/gui -> go.wit.com/gui/gui" . # // gofmt -w -r "go.wit.com/gui -> go.wit.com/gui/gui" .
@ -13,27 +14,30 @@ vet:
build: build:
echo "build it!" echo "build it!"
touch resources/blank.so
-rm resources/*.so -rm resources/*.so
-mkdir resources/ -mkdir resources/
cp -a ~/go/src/go.wit.com/toolkits/*/*.so resources/ -cp -a ~/go/src/go.wit.com/toolkits/*/*.so resources/
touch resources/blank.so
GO111MODULE=off go build \ GO111MODULE=off go build \
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}" -ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
install: clean:
rm -f go.*
-rm resources/*.so -rm resources/*.so
cp -a ~/go/src/go.wit.com/toolkits/*/*.so resources/ touch resources/blank.so
install: goimports
touch resources/blank.so
-rm resources/*.so
# -cp -a ~/go/src/go.wit.com/toolkits/*/*.so resources/
touch resources/blank.so
GO111MODULE=off go install \ GO111MODULE=off go install \
-ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}" -ldflags "-X main.VERSION=${VERSION} -X main.BUILDTIME=${BUILDTIME} -X gui.GUIVERSION=${VERSION}"
check-git-clean: check-git-clean:
@git diff-index --quiet HEAD -- || (echo "Git repository is dirty, please commit your changes first"; exit 1) @git diff-index --quiet HEAD -- || (echo "Git repository is dirty, please commit your changes first"; exit 1)
redomod:
rm -f go.*
GO111MODULE= go mod init
GO111MODULE= go mod tidy
go mod edit -go=1.20
curl-help: curl-help:
curl --silent http://localhost:9419/help curl --silent http://localhost:9419/help
@ -51,18 +55,11 @@ curl-setBranchesToMasterB:
findNext: findNext:
curl --silent http://localhost:9419/findNext curl --silent http://localhost:9419/findNext
fixNext:
curl --silent http://localhost:9419/fixNext
showNext: showNext:
curl --silent http://localhost:9419/showNext curl --silent http://localhost:9419/showNext
testNext:
curl --silent http://localhost:9419/testNext
doRelease: doRelease:
reset reset
make curl-list-changed
make showNext make showNext
sleep 10 sleep 10
curl --silent http://localhost:9419/doRelease curl --silent http://localhost:9419/doRelease
@ -88,14 +85,41 @@ curl-incrementAllTargetVersions:
list-release-notdone: list-release-notdone:
curl --silent http://localhost:9419/releaseList?readonly=true curl --silent http://localhost:9419/releaseList?readonly=true
# only show repos that need to be merged to the master branch safe-build: install
curl-list-changed: # forge list --private
curl --silent http://localhost:9419/list?perfect=false wit-test install --verbose
# cd ~/go/src/go.wit.com/lib/xgb/ && time GUIRELEASE_REASON="safe-build" guireleaser --gui gocui --gui-verbose --gui-file ../../toolkits/gocui/gocui.so >/tmp/forge.log 2>&1
rm -f go.* ; git checkout go.mod ; cd ~/go/src/go.wit.com/lib/xgb/ && time GUIRELEASE_REASON="safe-build" guireleaser --gui andlabs
# include repos that you probably can't git push commits build-quick: install
curl-list-everything: wit-test install --verbose
curl --silent http://localhost:9419/list?readonly=true # rm -f go.* ; git checkout go.mod ;cd ~/go/src/go.wit.com/lib/xgb/ && time GUIRELEASE_REASON="safe-build" guireleaser --gui andlabs quick
sudo "wit update"
curl-file-for-go.wit.com: autocomplete:
curl --silent http://localhost:9419/goweblist?readonly=true guireleaser --bash > ~/.local/share/bash-completion/completions/guireleaser
curl --silent http://localhost:9419/goweblist?readonly=true |sort > ~/go.wit.com.versions
test-build-force:
GUIRELEASE_REASON="safe-build" guireleaser --gui andlabs --force
# time GUIRELEASE_REASON="safe-build" make test-build
test-build:
wit-test install --verbose
rm ~/go/bin/forged
cd ~/go/src/go.wit.com/lib/xgb/ && rm -f go.*
cd ~/go/src/go.wit.com/lib/xgb/ && git checkout go.mod
cd ~/go/src/go.wit.com/lib/xgb/ && time guireleaser --gui andlabs
cd ~/go/src/go.wit.com/apps/guireleaser
wit-test debian --verbose
do-aptly
# time GUIRELEASE_REASON="safe-build" make test-build-quick
test-build-quick:
wit-test install --verbose
rm ~/go/bin/forged
cd ~/go/src/go.wit.com/lib/xgb/ && rm -f go.*
cd ~/go/src/go.wit.com/lib/xgb/ && git checkout go.mod
cd ~/go/src/go.wit.com/lib/xgb/ && time guireleaser --gui andlabs quick
cd ~/go/src/go.wit.com/apps/guireleaser
wit-test debian --verbose
do-aptly

8
TODO Normal file
View File

@ -0,0 +1,8 @@
notes on what to fix next
go-args make patches for alexflint
go-mod-clean --restore *.pb.go files
go-mod-clean set ctime on files
guireleaser change "title small" to the package being updated"

64
argv.go
View File

@ -1,5 +1,11 @@
package main package main
import (
"fmt"
"os"
"os/user"
)
/* /*
this parses the command line arguements this parses the command line arguements
@ -7,14 +13,26 @@ package main
*/ */
type args struct { type args struct {
// Repo string `arg:"positional" help:"go import path"` Quick *QuickCmd `arg:"subcommand:quick" help:"only do repos with patches"`
// Increment bool `arg:"--increment" help:"auto increment"`
// Release bool `arg:"--release" help:"do a release an exit"`
DryRun bool `arg:"--dry-run,env:DRYRUN" help:"don't actually do the release"` DryRun bool `arg:"--dry-run,env:DRYRUN" help:"don't actually do the release"`
Fix bool `arg:"--fix" help:"run fixGoMod() on startup"` Minor bool `arg:"--minor" help:"increment minor verion numbers"`
Protobuf bool `arg:"--protobuf" help:"increment protobuf repos"`
Verbose bool `arg:"--verbose" help:"talk alot"`
Full bool `arg:"--full" help:"build every package"`
Reason string `arg:"--reason" help:"tag message"` Reason string `arg:"--reason" help:"tag message"`
DumpVersions bool `arg:"--dump-versions" help:"dump the versions file for go.wit.com"` Force bool `arg:"--force" help:"try harder than normal"`
Port int `arg:"--port" default:"9419" help:"do fun stuff with curl"` Port int `arg:"--port" default:"9419" help:"do fun stuff with curl"`
Bash bool `arg:"--bash" help:"generate bash completion"`
BashAuto []string `arg:"--auto-complete" help:"does the actual autocompletion"`
}
type QuickCmd struct {
List *EmptyCmd `arg:"subcommand:list" help:"list available patches"`
Show *EmptyCmd `arg:"subcommand:show" help:"show a specific patch"`
NoLibs *EmptyCmd `arg:"subcommand:show" help:"skip libraries that aren't changed"`
}
type EmptyCmd struct {
} }
func (a args) Description() string { func (a args) Description() string {
@ -29,3 +47,39 @@ the repositories in the go.sum file using git clone`
func (args) Version() string { func (args) Version() string {
return "guireleaser " + VERSION return "guireleaser " + VERSION
} }
/*
handles shell autocomplete
*/
func (a args) DoAutoComplete(argv []string) {
switch argv[0] {
case "checkout":
usr, _ := user.Current()
fmt.Println("user devel master " + usr.Username)
case "commit":
fmt.Println("--all")
case "config":
fmt.Println("add fix list delete")
case "list":
fmt.Println("--all --mine --favorites --private")
case "pull":
fmt.Println("--all --mine --favorites --private")
case "patch":
fmt.Println("--list --submit --show")
case "dirty":
fmt.Println("--show-files")
case "user":
fmt.Println("--force")
case "devel":
fmt.Println("--force")
case "master":
fmt.Println("--force")
default:
if argv[0] == ARGNAME {
// list the subcommands here
fmt.Println("--bash quick")
}
}
os.Exit(0)
}

View File

@ -2,83 +2,154 @@
package main package main
import ( import (
"errors"
"fmt"
"os" "os"
"path/filepath"
"strings" "strings"
"time"
"github.com/go-cmd/cmd"
"go.wit.com/lib/gui/shell" "go.wit.com/lib/gui/shell"
"go.wit.com/log" "go.wit.com/log"
) )
func doRelease() bool { func doRelease() error {
log.Info("doRelease() on", me.current.Name()) check := me.current
log.Info("doRelease() on", me.current.GetGoPath())
if !findOk {
log.Info("doRelease() immediately end something went wrong last time. findOk == false")
return fmt.Errorf("findOK = false %s", check.GetGoPath())
}
// double check release version logic // double check release version logic
if me.release.releaseVersionB.String() != "release version "+me.release.version.String() { if me.release.releaseVersionB.String() != "release version "+me.release.version.String() {
log.Warn("something went wrong with the release.version:", me.release.version.String()) log.Warn("something went wrong with the release.version:", me.release.version.String())
return false return fmt.Errorf("GUI lied %s", check.GetGoPath())
} }
if strings.HasPrefix(me.release.version.String(), "v") { if strings.HasPrefix(me.release.version.String(), "v") {
log.Warn("everything is ok. version starts with v.", me.release.version.String()) log.Warn("everything is ok. version starts with v.", me.release.version.String())
} else { } else {
log.Warn("version does not start with v.", me.release.version.String()) log.Warn("version does not start with v.", me.release.version.String())
return false return fmt.Errorf("release does not start with a v %s", check.GetGoPath())
} }
if shell.Exists("go.mod") { if shell.Exists("go.mod") {
log.Info("go.mod exists ok") log.Info("go.mod exists ok")
} else { } else {
log.Info("go.mod missing")
return false
/*
pwd, _ := os.Getwd() pwd, _ := os.Getwd()
log.Info("go.mod disappeared. need to run go mod init and go mod tidy here:", pwd) log.Info("go.mod missing in working dir", pwd)
shell.RunRealtime([]string{"go", "mod", "init"}) return fmt.Errorf("go.mod missing %s", check.GetGoPath())
shell.RunRealtime([]string{"go", "mod", "tidy"})
shell.RunRealtime([]string{"go", "mod", "edit", "-go=1.20"})
*/
} }
curName := me.current.Status.GetCurrentBranchName() curName := me.current.GetCurrentBranchName()
mName := me.current.Status.GetMasterBranchName() mName := me.current.GetMasterBranchName()
if curName != mName { if curName != mName {
log.Info("\trepo is not working from main branch", curName, "!=", mName) log.Info("\trepo is not working from main branch", curName, "!=", mName)
return false return fmt.Errorf("not on main branch %s", check.GetGoPath())
} }
check := me.forge.Repos.FindByGoPath(me.current.GoPath()) if alreadyDone(check) {
if check == nil { // means it was already published
log.Info("boo, you didn't git clone", me.current.GoPath()) // protects against logic errors that might result
return false // in an infinite loop
log.Info("doRelease() WARNING. should have never gotten here. return true. already done", check.GetGoPath())
log.Info("doRelease() WARNING. should have never gotten here. return true. already done", check.GetGoPath())
log.Info("doRelease() WARNING. should have never gotten here. return true. already done", check.GetGoPath())
check.ReloadCheck()
return fmt.Errorf("already released %s", check.GetGoPath())
} }
if !me.forge.FinalGoDepsCheckOk(check) {
log.Info("the go.mod file is wrong. fix it here?", check.GetGoPath()) // check if the git tag already exists somehow
os.Exit(-1) testtag := me.release.version.String()
return false if check.LocalTagExists(testtag) {
log.Info("TAG ALREADY EXISTS", testtag)
return log.Errorf("%s TAG ALREADY EXISTS %s", check.FullPath, testtag)
} else {
log.Info("TAG IS NEW", testtag)
}
if me.forge.Config.IsPrivate(me.current.GetGoPath()) {
// do not self update private repos
log.Info("This is a private repo.")
var retag [][]string
retag = append(retag, []string{"git", "tag", "-m", me.releaseReasonS, me.release.version.String()})
retag = append(retag, []string{"git", "push", "origin", me.release.version.String()})
if !me.current.RunAll(retag) {
log.Info("retag failed")
findOk = false
return fmt.Errorf("RETAG FAILED %s", check.GetGoPath())
}
return skipToNext()
}
me.done = append(me.done, me.current.GetGoPath())
if err := me.forge.FinalGoDepsCheckOk(check, true); err != nil {
msg := fmt.Sprint("the go.mod file is wrong. fix it here?", check.GetGoPath())
badExit(errors.New(msg))
return fmt.Errorf("FinalGoDeps %s err %v", check.GetGoPath(), err)
}
if check.GetGoPath() == me.startRepo.GetGoPath() {
log.Info("CAN NOT SELF UPDATE.", check.GetGoPath(), "is the same as os.Getwd()")
log.Info("go get must be run from somewhere else other than startRepo")
log.Info("chdir to autotypist if it exists")
msg := fmt.Sprint("CAN NOT SELF UPDATE.", check.GetGoPath(), "is the same as os.Getwd()")
badExit(errors.New(msg))
}
if !me.startRepo.Exists("go.mod") {
log.Info("go.sum missing in", me.startRepo.GetGoPath())
log.Info("pick a different repo here")
log.Info("todo: error out earlier knowing this will upgrade")
log.Info("versions", me.startRepo.GetTargetVersion(), me.startRepo.GetMasterVersion())
panic("redo go.sum")
} }
log.Info("\ttag and push", curName, me.release.version.String(), me.releaseReasonS) log.Info("\ttag and push", curName, me.release.version.String(), me.releaseReasonS)
if err := check.ValidGoSum(); err != nil {
log.Info("ValidGoSum() error", check.GetGoPath(), err)
msg := fmt.Sprint("ValidGoSum() error", check.GetGoPath(), err)
badExit(errors.New(msg))
}
// this is the final check. even here, just to be a total asshole
// I rerun go mod init and go mod tidy
// the re-parse all the results
// this is the last and final check.
// believe it or not, I've seen this fail. It's not worth being careful here
// or liberal about it. if it doesn't work, yep, you are stuck here you bastard
// (bastard being me. I designed this to be so annoying that if it makes it
// past this point it always works. that is the whole point of this code. NEVER
// EVER FAIL PAST THIS POINT
// )
// so let's do it: let's run go-mod-clean strict
// then reparse everything
_, err := check.RunVerboseOnError([]string{"go-mod-clean", "strict"})
if err != nil {
badExit(err)
}
var all [][]string var all [][]string
var autogen []string
all = append(all, []string{"git", "add", "-f", "go.mod"}) all = append(all, []string{"git", "add", "-f", "go.mod"})
if ok, _ := check.IsPrimitive(); ok { autogen = append(autogen, "go.mod")
if check.GoInfo.GoPrimitive {
// don't add go.sum here. TODO: check for go.sum file and fail // don't add go.sum here. TODO: check for go.sum file and fail
} else { } else {
all = append(all, []string{"git", "add", "-f", "go.sum"}) all = append(all, []string{"git", "add", "-f", "go.sum"})
autogen = append(autogen, "go.sum")
} }
if ok, compiled, err := me.current.IsProtobuf(); ok { if ok, compiled, err := me.current.IsProtobuf(); ok {
log.Info("\tIsProtobuf() == true") log.Info("\tIsProtobuf() == true")
if err != nil { if err != nil {
log.Info("\tERROR: There are protobuf files, but they are not compiled") log.Info("\tERROR: There are protobuf files, but they are not compiled")
log.Info("\tERROR: can not continue") log.Info("\tERROR: can not continue")
os.Exit(-1) msg := fmt.Sprint("ERROR: There are protobuf files, but they are not compiled")
badExit(errors.New(msg))
} }
log.Info("\tshould add the protobuf files here") log.Info("\tshould add the protobuf files here")
log.Info("\tcompiled files found:", compiled) log.Info("\tcompiled files found:", compiled)
for _, s := range compiled { for _, s := range compiled {
log.Info("\tcompiled file found:", s) log.Info("\tcompiled file found:", s)
all = append(all, []string{"git", "add", "-f", s}) all = append(all, []string{"git", "add", "-f", s})
autogen = append(autogen, s)
} }
} else { } else {
log.Info("\tIsProtobuf() == false") log.Info("\tIsProtobuf() == false")
@ -88,31 +159,30 @@ func doRelease() bool {
all = append(all, []string{"git", "tag", "-m", me.releaseReasonS, me.release.version.String()}) all = append(all, []string{"git", "tag", "-m", me.releaseReasonS, me.release.version.String()})
all = append(all, []string{"git", "push", "origin", me.release.version.String()}) all = append(all, []string{"git", "push", "origin", me.release.version.String()})
if !me.current.Status.DoAll(all) { // save the autogenerated files in git metadata (aka: notes)
cname := check.GetCurrentBranchName()
if err := check.AutogenSave(autogen, cname, true); err != nil {
log.Info("AutogenSave() error", err)
msg := fmt.Sprint("AutogenSave() error", err)
badExit(errors.New(msg))
}
if !me.current.RunAll(all) {
log.Info("failed to make new release", me.release.version.String()) log.Info("failed to make new release", me.release.version.String())
return false findOk = false
return fmt.Errorf("setting findOK = false %s", check.GetGoPath())
} }
log.Info("RELEASE OK") log.Info("RELEASE OK")
// 'publish' the version to the golang package versioning system // 'publish' the version to the golang package versioning system
if !doPublishVersion() { if !doPublishVersion() {
log.Info("PUBLISH FAILED") time.Sleep(3 * time.Second)
return false // this can fail to update, try it again after sleep(3s)
if !doPublishVersion() {
log.Info("PUBLISH FAILED gopath=%s", check.GetGoPath())
findOk = false
return fmt.Errorf("PUBLISH FAILED gopath=%s", check.GetGoPath())
} }
pb := me.forge.Repos.FindByGoPath(me.current.GoPath())
if pb != nil {
pb.UpdatePublished()
/* remove. earlier protected against nil
if !pb.IsPrimitive() {
loop := pb.Published.SortByGoPath()
for loop.Scan() {
t := loop.Next()
log.Info("new Published dep:", t.GetGoPath(), t.GetVersion())
}
}
*/
me.forge.Repos.ConfigSave()
} }
log.Info("PUBLISH OK") log.Info("PUBLISH OK")
@ -120,9 +190,10 @@ func doRelease() bool {
// unwind and re-tag. Now that the go.mod and go.sum are published, revert // unwind and re-tag. Now that the go.mod and go.sum are published, revert
// to the development branch // to the development branch
if !me.current.Status.RevertMasterToDevel() { if !me.current.RevertMasterToDevel() {
log.Info("Revert Failed") log.Info("Revert Failed")
return false findOk = false
return fmt.Errorf("REVERT FAILED %s", check.GetGoPath())
} }
// update tag // update tag
@ -132,103 +203,42 @@ func doRelease() bool {
retag = append(retag, []string{"git", "tag", "-m", me.releaseReasonS, me.release.version.String()}) retag = append(retag, []string{"git", "tag", "-m", me.releaseReasonS, me.release.version.String()})
retag = append(retag, []string{"git", "push", "origin", me.release.version.String()}) retag = append(retag, []string{"git", "push", "origin", me.release.version.String()})
if !me.current.Status.DoAll(retag) { if !me.current.RunAll(retag) {
log.Info("retag failed") log.Info("retag failed")
return false findOk = false
return fmt.Errorf("RETAG FAILED %s", check.GetGoPath())
} }
log.Info("EVERYTHING OK. RERELEASED", me.current.Name()) log.Info("EVERYTHING OK. RERELEASED", me.current.GetGoPath())
// it's necessary to recreate the the files here return nil
// safe to do this here. everything has been published
fixGodeps(check)
// update the values in the GUI
me.current.NewScan()
// attempt to find another repo to release
if !doReleaseFindNext() {
log.Info("doReleaseFindNext() could not find a new")
log.Info("THIS PROBABLY MEANS THAT ACTUALLY WE ARE TOTALLY DONE?")
os.Setenv("FindNextDone", "true")
return false
}
log.Info("GOOD TO RUN ANOTHER DAY ON:", me.current.Name())
return true
}
// try to figure out if there is another package to update
// returns true if it finds something
func doReleaseFindNext() bool {
// scan for new repo
if findNext() {
log.Info("findNext() found something")
} else {
// this means findNext() didn't find anything but there are
// still packages to release. start trying to fix the go.sum files
if findCounter != 0 {
findFix = true
}
log.Info("findNext() could not find anything")
return false
}
check := me.forge.Repos.FindByGoPath(me.current.GoPath())
if check == nil {
log.Info("boo, you didn't git clone", me.current.GoPath())
return false
}
if findFix {
fixGodeps(check)
}
if me.forge.FinalGoDepsCheckOk(check) {
// the go.sum file is ok to release
return true
}
return false
} }
// this pulls the new tag from the golang package repository // this pulls the new tag from the golang package repository
// to insert the new version // to insert the new version
func doPublishVersion() bool { func doPublishVersion() bool {
gopath := me.current.GoPath() gopath := me.current.GetGoPath()
docmd := []string{"go", "get", "-v", gopath + "@" + me.release.version.String()} docmd := []string{"go", "get", "-v", gopath + "@" + me.release.version.String()}
log.Info("SHOULD RUN cmd HERE:", docmd) log.Info("SHOULD RUN cmd HERE:", docmd)
// right now, you can't publish this because the go.* files in this project are screwed up if me.forge.Config.IsPrivate(me.current.GetGoPath()) {
if me.release.guireleaser == nil {
log.Info("CAN NOT SELF UPDATE HERE. cmd =", docmd)
return false
}
homeDir, _ := os.UserHomeDir()
gosum := filepath.Join(homeDir, "go/src/go.wit.com/apps/guireleaser/go.sum")
if !shell.Exists(gosum) {
log.Info("go.sum must exist here")
me.release.guireleaser.MakeRedoMod()
}
if me.current.Status.IsPrivate() {
// do not self update private repos // do not self update private repos
log.Info("This is a private repo and can not be self checked") log.Info("This is a private repo and can not be self checked")
return true return true
} }
// try to pull from google // try to pull from google
var result cmd.Status if gopath == me.startRepo.GetGoPath() {
if gopath == "go.wit.com/apps/guireleaser" {
log.Info("CAN NOT SELF UPDATE. cmd =", docmd) log.Info("CAN NOT SELF UPDATE. cmd =", docmd)
log.Info("go get must be run from somewhere else other than guireleaser") log.Info("go get must be run from somewhere else other than startRepo")
log.Info("chdir to autotypist if it exists") log.Info("chdir to autotypist if it exists")
if shell.Exists("/home/jcarr/go/src/go.wit.com/apps/autotypist") { msg := fmt.Sprint("CAN NOT SELF UPDATE. cmd =", docmd)
os.Chdir("/home/jcarr/go/src/go.wit.com/apps/autotypist") badExit(errors.New(msg))
} else {
log.Info("need to chdir somewhere with go.sum & go.mod")
return false
} }
// result = shell.PathRun("/home/jcarr/go/src/go.wit.com/apps/autotypist", docmd)
} else {
// publish go.mod & go.sum for use with go // publish go.mod & go.sum for use with go
os.Unsetenv("GO111MODULE") os.Unsetenv("GO111MODULE")
log.Info("TRYING TO SELF UPDATE HERE. cmd =", docmd) log.Info("TRYING TO SELF UPDATE HERE. cmd =", docmd)
result = me.release.guireleaser.Status.Run(docmd) result := me.startRepo.Run(docmd)
}
if result.Error != nil { if result.Error != nil {
log.Info("SELF UPDATE FAILED. error =", result.Error) log.Info("SELF UPDATE FAILED. error =", result.Error)
log.Info("SELF UPDATE FAILED. exit =", result.Exit) log.Info("SELF UPDATE FAILED. exit =", result.Exit)
@ -243,7 +253,7 @@ func doPublishVersion() bool {
log.Info("SELF UPDATE FAILED") log.Info("SELF UPDATE FAILED")
return false return false
} }
log.Info("SELF UPDATE OK. out =", result.Stdout) log.Info("SELF UPDATE OK. out =", strings.Join(result.Stdout, "\n"))
log.Info("SELF UPDATE WORKED") log.Info("SELF UPDATE WORKED")
return true return true
} }

19
exit.go Normal file
View File

@ -0,0 +1,19 @@
package main
import (
"os"
"go.wit.com/log"
)
func okExit(thing string) {
log.Info(thing, "ok")
// log.Info("Finished go-clean on", check.GetNamespace(), "ok")
me.forge.Exit()
os.Exit(0)
}
func badExit(err error) {
log.Info("forge failed: ", err, me.forge.Config.ReposDir)
os.Exit(-1)
}

View File

@ -1,173 +1,167 @@
// This is a simple example
package main package main
import ( import (
"errors"
"fmt"
"os"
"path/filepath"
"go.wit.com/log" "go.wit.com/log"
"go.wit.com/lib/gui/repolist"
"go.wit.com/lib/protobuf/gitpb" "go.wit.com/lib/protobuf/gitpb"
) )
var findCounter int var findCounter int
var findFix bool = false var findFix bool = false
var findOk bool = true
func checkDeps(repo *gitpb.Repo) error {
if repo.GoDeps == nil {
return fmt.Errorf("%s has GoDeps == nil", repo.GetNamespace())
}
for dep := range repo.GoDeps.IterAll() {
// log.Info(repo.GetNamespace(), dep.GoPath, dep.Version)
// check if the package in question is waiting for another package to publish
found := me.forge.FindByGoPath(dep.GoPath)
if found == nil {
return fmt.Errorf("%s has dep == nil", repo.GetNamespace(), dep.GoPath)
}
// loop through all the repos that need to be published with new go versions
all := me.found.SortByFullPath()
for all.Scan() {
check := all.Next()
if found.GetNamespace() == check.GetNamespace() {
// this package is waiting on other packages to publish
return fmt.Errorf("%s is waiting on %s", repo.GetNamespace(), found.GetNamespace())
}
}
// found package isn't being published. is the version correct?
// never check this? we are done?
/*
if found.GetLastTag() == dep.Version {
// everything is normal
} else {
return fmt.Errorf("%s version mismatch on %s (%s vs %s)", repo.GetNamespace(), found.GetNamespace(), found.GetLastTag(), dep.Version)
}
*/
}
// everything might be cool?
return nil
}
// trys to figure out if there is still something to update // trys to figure out if there is still something to update
// todo: redo this logic as it is terrible // todo: redo this logic as it is terrible
// rename this findNext() // rename this findNext()
func findNext() bool { func findNext() bool {
findCounter = 0 findCounter = 0
loop := me.repos.View.ReposSortByName() all := me.found.SortByFullPath()
for loop.Scan() { for all.Scan() {
repo := loop.Repo() check := all.Next()
if check.GetMasterBranchName() != check.GetCurrentBranchName() {
log.Info("YOU MUST BE ON THE MASTER BRANCH", check.GetNamespace())
continue
}
if check.IsDirty() {
log.Info("CAN NOT RELEASE DIRTY REPO", check.GetNamespace())
continue
}
if alreadyDone(check) {
log.Info("findNext() alreadyDone. WHY IS THIS STILL CHECKING?", check.GetNamespace())
continue
}
log.Info("CHECKING START:", check.GetNamespace())
check := me.forge.Repos.FindByGoPath(repo.GoPath()) if me.forge.Config.IsPrivate(check.GetNamespace()) {
if check == nil { log.Info("GOOD TO GO ON PRIVATE REPO", check.GetNamespace())
log.Info("boo, you didn't git clone", repo.GoPath()) setCurrentRepo(check, "should be good to release", "pretty sure")
return false
}
if check.GetTargetVersion() == check.GetCurrentBranchVersion() {
// log.Info("findNext() no update needed", check.GoPath, check.GetTargetVersion(), "vs", check.GetCurrentBranchVersion())
continue
} else {
log.Info("findNext() update needed", check.GoPath, check.GetTargetVersion(), "vs", check.GetCurrentBranchVersion())
}
if me.forge.Config.IsReadOnly(check.GoPath) {
log.Info("findNext() skipping readonly")
continue
}
if check.CheckDirty() {
log.Info("findNext() skipping dirty")
continue
}
if findFix {
log.Info("findFix is true. running fixGoDeps()")
if fixGodeps(check) {
log.Info("fixGoDeps() returned true")
} else {
log.Info("fixGoDeps() returned false")
}
}
findCounter += 1
if check.Exists("go.mod") {
log.Info("go.mod exists here")
} else {
log.Info("go.mod is gone here")
}
if ok, err := check.ParseGoSum(); !ok {
log.Info("ParseGoSum() failed (probably repo needs go mod tidy)", err)
log.Info("ParseGoSum() findFix =", findFix, "findCounter =", findCounter)
if check.Exists("go.mod") {
log.Info("go.mod exists here")
} else {
log.Info("go.mod is gone here")
}
continue
}
if check.Exists("go.mod") {
log.Info("go.mod exists here")
} else {
log.Info("go.mod is gone here")
}
if me.forge.FinalGoDepsCheckOk(check) {
setCurrentRepo(repo, "should be good to release", "pretty sure")
if check.Exists("go.mod") {
log.Info("go.mod exists here")
} else {
log.Info("go.mod is gone here")
}
return true return true
} }
if check.Exists("go.mod") {
log.Info("go.mod exists here") godepsNew, err := check.GoSumFromRepo()
if err != nil {
log.Info("CHECKING go deps from repo failed", err)
continue
}
if godepsNew == nil {
// don't check godepsNew, but check to make sure go mod tidy actually ran without error
os.Unsetenv("GO111MODULE")
cmd := []string{"go", "mod", "tidy"}
err := check.RunVerbose(cmd)
if err != nil {
log.Info("go mod tidy failed. this go package needs to be examined by hand as it doesn't appear to be primitive")
os.Exit(-1)
}
// if godepsNew == nil, then this go package is a primitive and there is no go.sum file
} else { } else {
log.Info("go.mod is gone here") if err := testGoDepsCheckOk(godepsNew, argv.Verbose); err != nil {
log.Info("CHECKING current repo deps failed", err)
continue
} }
log.Info("findNext() got to the end. repo", repo.GoPath(), "did not work. trying to find a new one now")
} }
if err := me.forge.FinalGoDepsCheckOk(check, argv.Verbose); err != nil {
// if err := me.forge.FinalGoDepsCheckOk(check, false); err != nil {
log.Info("FinalGoDepsCheckOk() repo=", check.GetNamespace(), "err:", err)
log.Info("CHECKING END:", check.GetNamespace())
log.Info("")
continue
}
log.Info("GOOD TO GO ON", check.GetNamespace())
setCurrentRepo(check, "should be good to release", "pretty sure")
return true
}
if findCounter == 0 { if findCounter == 0 {
log.Info("NOTHING TO UPDATE. findCounter =", findCounter) log.Info("NOTHING TO UPDATE. findCounter =", findCounter, "found len =", me.found.Len())
if me.found.Len() == 0 {
printDone()
okExit("")
}
} else { } else {
findFix = true
log.Info("me.current is nil findCounter =", findCounter, "so set findFix =", findFix) log.Info("me.current is nil findCounter =", findCounter, "so set findFix =", findFix)
} }
log.Info("tried to findNext() but not sure what to do next counter =", findCounter, "findFix =", findFix) log.Info("tried to findNext() but not sure what to do next counter =", findCounter, "findFix =", findFix)
setCurrentRepo(nil, "findNext found nothing", "crap")
me.release.status.SetText("ALL DONE?") me.release.status.SetText("ALL DONE?")
return false return false
} }
// tries to fix the go.mod and go.sum files func setCurrentRepo(check *gitpb.Repo, s string, note string) bool {
func fixGodeps(check *gitpb.Repo) bool { me.current = check
var good bool = true
// check if the package dependancies changed, if so, re-publish
// skip primative ones
if ok, _ := check.IsPrimitive(); ok {
log.Info("fixGoDeps() skipping primitive", check.GoPath)
return true
}
ok, err := check.RedoGoMod()
if err != nil {
log.Info("fixGoDeps() RedoGoMod() error", err)
return false
}
if !ok {
log.Info("gitpb.RedoGoMod() returned false", check.GetGoPath())
return false
}
if check.GoDeps == nil {
cmd := []string{"go", "mod", "edit", "-go=1.20"}
check.Run(cmd)
return true
}
log.Printf("current repo %s go dependancy count: %d", check.GetGoPath(), check.GoDepsLen())
deps := check.GoDeps.SortByGoPath()
for deps.Scan() {
depRepo := deps.Next()
// log.Info("found dep", depRepo.GetGoPath())
if me.forge.Config.IsReadOnly(depRepo.GoPath) {
log.Info("IsReadOnly = true", depRepo.GetGoPath())
continue
} else {
// log.Info("IsReadOnly = false", depRepo.GetGoPath())
}
found := me.forge.Repos.FindByGoPath(depRepo.GetGoPath())
if found == nil {
log.Info("not found:", depRepo.GetGoPath())
continue
}
if depRepo.GetVersion() != found.GetMasterVersion() {
log.Printf("%-48s %10s (gitpb depRepo)", depRepo.GetGoPath(), depRepo.GetVersion())
log.Printf("%-48s %10s (gitpb found)", found.GetGoPath(), found.GetMasterVersion())
cmd := []string{"go", "get", depRepo.GetGoPath() + "@latest"}
check.Run(cmd)
}
}
cmd := []string{"go", "mod", "tidy"}
check.Run(cmd)
cmd = []string{"go", "mod", "edit", "-go=1.20"}
check.Run(cmd)
check.GoDeps = nil
if ok, err := check.ParseGoSum(); !ok {
log.Info("ParseGoSum() failed", err)
return false
}
return good
}
func setCurrentRepo(repo *repolist.RepoRow, s string, note string) bool {
check := me.forge.Repos.FindByGoPath(repo.GoPath())
if check == nil { if check == nil {
log.Info("boo, you didn't git clone", repo.GoPath()) me.release.repo.SetText("")
return false me.release.version.SetText("")
} me.release.releaseVersionB.SetText("nope")
me.release.version.SetText("badver")
me.release.repo.SetText(check.GoPath) } else {
me.release.status.SetText(s) me.release.repo.SetText(check.GetNamespace())
me.release.notes.SetText(note)
me.current = repo
me.release.version.SetText(check.GetTargetVersion()) me.release.version.SetText(check.GetTargetVersion())
me.release.releaseVersionB.SetText("release version " + check.GetTargetVersion()) me.release.releaseVersionB.SetText("release version " + check.GetTargetVersion())
me.release.openrepo.Enable() me.release.version.SetText(check.GetTargetVersion())
}
me.release.status.SetText(s)
me.release.notes.SetText(note)
// me.release.openrepo.Enable()
return true return true
} }
func testGoDepsCheckOk(godeps *gitpb.GoDeps, verbose bool) error {
if godeps == nil {
return errors.New("testGoDepsCheckOk() godeps == nil")
}
all := godeps.SortByGoPath()
for all.Scan() {
depRepo := all.Next()
fullpath := filepath.Join(me.forge.Config.ReposDir, depRepo.GoPath)
found := me.found.FindByFullPath(fullpath)
if found == nil {
continue
}
return fmt.Errorf("dep is being upgraded %s", depRepo.GoPath)
}
return nil
}

View File

@ -4,7 +4,6 @@ import (
"go.wit.com/gui" "go.wit.com/gui"
"go.wit.com/lib/debugger" "go.wit.com/lib/debugger"
"go.wit.com/lib/gui/logsettings" "go.wit.com/lib/gui/logsettings"
"go.wit.com/log"
) )
func globalDisplayOptions(box *gui.Node) { func globalDisplayOptions(box *gui.Node) {
@ -12,8 +11,8 @@ func globalDisplayOptions(box *gui.Node) {
group1 := vbox.NewGroup("Global Display Options") group1 := vbox.NewGroup("Global Display Options")
/*
hidegrid := group1.NewGrid("hidecfg", 0, 0) hidegrid := group1.NewGrid("hidecfg", 0, 0)
hidegrid.NewButton("Show Repository Window", func() { hidegrid.NewButton("Show Repository Window", func() {
if me.repos.Hidden() { if me.repos.Hidden() {
me.repos.Show() me.repos.Show()
@ -23,12 +22,13 @@ func globalDisplayOptions(box *gui.Node) {
log.Info("showing reposwin") log.Info("showing reposwin")
}) })
hidegrid.NextRow() hidegrid.NextRow()
*/
group1 = vbox.NewGroup("prep for release") group1 = vbox.NewGroup("prep for release")
grid := group1.RawGrid() grid := group1.RawGrid()
grid.NewButton("make prepare-release", func() { grid.NewButton("make prepare-release", func() {
makePrepareRelease() rePrepareRelease()
}) })
grid.NextRow() grid.NextRow()

View File

@ -1,42 +0,0 @@
package main
import (
"os"
"go.wit.com/lib/gui/repolist"
)
// like tcl/tk, use ENV variables to set display preferences
func hideFunction(r *repolist.RepoRow) {
// always show dirty repos
if r.Status.IsDirty() {
r.Show()
return
}
// hide read-only repos
if os.Getenv("AUTOTYPIST_READONLY") == "hide" {
if r.Status.ReadOnly() {
// log.Info(r.Name(), "hiding read-only repo")
r.Hide()
return
} else {
// log.Info(r.Name(), "not hiding read-only repo")
}
}
// show repos with mismatched mode
// this means, if you are in "devel" mode, show all the repos that
// might be stuck on the wrong branch, like 'master' or '<username>'
if os.Getenv("AUTOTYPIST_MODE") != "" {
if !r.Status.IsCorrectMode(os.Getenv("AUTOTYPIST_MODE")) {
r.Show()
return
}
}
// show everything else. often this will be "unconforming" repos
// if you what those repos ignored, add these to the config file
// as read-only=true
r.Show()
}

239
http.go
View File

@ -7,7 +7,7 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"go.wit.com/lib/gui/repolist" "go.wit.com/lib/protobuf/gitpb"
"go.wit.com/log" "go.wit.com/log"
) )
@ -27,10 +27,6 @@ func okHandler(w http.ResponseWriter, r *http.Request) {
repoName := r.URL.Query().Get("repo") repoName := r.URL.Query().Get("repo")
version := r.URL.Query().Get("version") version := r.URL.Query().Get("version")
comment := r.URL.Query().Get("comment") comment := r.URL.Query().Get("comment")
readonly := r.URL.Query().Get("readonly")
onlydirty := r.URL.Query().Get("onlydirty")
perfect := r.URL.Query().Get("perfect")
whitelist := r.URL.Query().Get("whitelist")
switch route { switch route {
case "/help": case "/help":
@ -50,7 +46,7 @@ func okHandler(w http.ResponseWriter, r *http.Request) {
log.Info("") log.Info("")
case "/doRelease": case "/doRelease":
buttonDisable() buttonDisable()
if doRelease() { if err := doRelease(); err == nil {
buttonEnable() buttonEnable()
log.Info("doRelease() worked") log.Info("doRelease() worked")
} else { } else {
@ -74,148 +70,54 @@ func okHandler(w http.ResponseWriter, r *http.Request) {
return return
} }
log.Info(me.current.StandardHeader()) // log.Info(me.current.StandardHeader())
log.Info(me.current.StandardReleaseHeader()) log.Info(me.forge.StandardReleaseHeader(me.current, "todoing"))
case "/rescanAll":
me.repos.View.ScanRepositories()
case "/setCurrentRepo": case "/setCurrentRepo":
log.Info("repo: " + repoName) log.Info("repo: " + repoName)
log.Info("version: " + version) log.Info("version: " + version)
log.Info("comment: " + comment) log.Info("comment: " + comment)
repo := me.repos.View.FindByName(repoName) repo := me.forge.FindByGoPath(repoName)
if repo == nil { if repo == nil {
log.Info("FindRepoByName() returned nil") log.Info("FindRepoByName() returned nil")
return return
} }
setCurrentRepo(repo, "HTTP", "doRelease() ?") setCurrentRepo(repo, "HTTP", "doRelease() ?")
case "/IncrementRevisonVersion":
log.Info("repo: " + repoName)
log.Info("version: " + version)
me.current.Status.IncrementRevisionVersion(comment)
case "/IncrementMinorVersion":
log.Info("repo: " + repoName)
log.Info("version: " + version)
me.current.Status.IncrementMinorVersion("trying minor")
case "/setAllBranchesToMaster":
log.Info("set all branches to master")
me.Disable()
defer me.Enable()
if setAllBranchesToMaster() {
// if it succeeds, disable this button
me.setBranchesToMasterB.Disable()
}
return
case "/setTargetVersion":
log.Info("repo: " + repoName)
log.Info("version: " + version)
if repoName != "" {
repo := me.repos.View.FindByName(repoName)
if repo == nil {
log.Info("could not find repo", repoName)
} else {
log.Info("setting target version", version)
repo.Status.SetTargetVersion(version)
}
return
}
if me.current == nil {
log.Info("me.current == nil")
return
}
me.current.Status.SetTargetVersion(version)
return
case "/setAllTargetVersions":
log.Info("version: " + version)
loop := me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
master := repo.Status.GetMasterVersion()
lastTag := repo.Status.LastTag()
if master == lastTag {
repo.Status.SetTargetVersion(master)
} else {
repo.Status.IncrementRevisionVersion("Nov 2024 test")
}
}
case "/whitelist":
repo := me.repos.View.FindByName(repoName)
if repo == nil {
log.Info("FindRepoByName() returned nil")
return
}
log.Info("whitelisted " + repo.Name())
if whitelist == "false" {
repo.Status.Whitelist = false
} else {
repo.Status.Whitelist = true
}
case "/testNext":
testNext()
return
case "/fixNext":
check := me.forge.Repos.FindByGoPath(me.current.GoPath())
if check == nil {
log.Info("boo, you didn't git clone", me.current.GoPath())
return
}
// destroy and recreate the go.sum
fixGodeps(check)
return return
case "/showNext": case "/showNext":
showNext() check := me.forge.FindByGoPath(me.current.GetGoPath())
if check == nil {
log.Info("boo, current is missing", me.current.GetGoPath())
return
}
testGoRepo(check)
me.forge.HumanPrintRepo(check)
log.Info("upgrade reason:", me.reason[check])
return return
case "/list": case "/list":
PrintReport(readonly, onlydirty, perfect) me.forge.PrintHumanTable(me.found)
return return
case "/releaseList": case "/releaseList":
PrintReleaseReport(readonly, perfect) me.forge.PrintHumanTable(me.found)
return
case "/quit":
log.Info("Got URL /quit")
os.Exit(0)
return
case "/goweblist":
loop := me.repos.View.ReposAll()
for loop.Scan() {
repo := loop.Repo()
lastTag := repo.LastTag()
tag := repo.Status.NewestTag()
gitAge, err := tag.GetDate()
if err != nil {
log.Info(fmt.Sprintf("tag date error", repo.Name()))
}
// if lastTag == "" {
// lastTag = tag.Name()
// }
if repo.ReadOnly() {
if readonly == "true" {
continue
}
}
// dur := time.Since(gitAge)
// log.Info(fmt.Sprintf("%-60s %s %s %s", repo.Name(), lastTag, shell.FormatDuration(dur), lastTag, tag.Name()))
log.Info(fmt.Sprintf("%s %d %s", repo.Name(), gitAge.Unix(), lastTag))
/*
for _, tag := range repo.Tags.ListAll() {
log.Info(fmt.Sprintf("%-60s %s", "", tag.Name()))
}
*/
}
return return
default: default:
log.Info("BAD URL = " + route) log.Info("BAD URL = " + route)
} }
} }
func testGoRepo(check *gitpb.Repo) {
data, _ := os.ReadFile(filepath.Join(check.FullPath, "go.mod"))
log.Info(string(data))
if err := me.forge.FinalGoDepsCheckOk(check, true); err == nil {
log.Info("forge.FinalGoDepsCheck(check) worked!")
} else {
log.Info("forge.FinalGoDepsCheck(check) failed. boo.")
}
}
// starts and sits waiting for HTTP requests // starts and sits waiting for HTTP requests
func startHTTP() { func startHTTP() {
http.HandleFunc("/", okHandler) http.HandleFunc("/", okHandler)
@ -228,90 +130,3 @@ func startHTTP() {
log.Println("Error starting server:", err) log.Println("Error starting server:", err)
} }
} }
func testNext() {
// re-scans the go.sum file. DOES NOT MODIFY ANYTHING
check := me.forge.Repos.FindByGoPath(me.current.GoPath())
if check == nil {
log.Info("boo, you didn't git clone", me.current.GoPath())
return
}
data, _ := os.ReadFile(filepath.Join(check.FullPath, "go.mod"))
log.Info(string(data))
if me.forge.FinalGoDepsCheckOk(check) {
log.Info("forge.FinalGoDepsCheck(check) worked!")
} else {
log.Info("forge.FinalGoDepsCheck(check) failed. boo.")
}
}
func showNext() {
log.Info("gui repo: " + me.release.repo.String())
log.Info("gui name: " + me.release.version.String())
log.Info("gui notes: " + me.release.notes.String())
log.Info("gui status: " + me.release.status.String())
log.Info("")
if me.current == nil {
log.Info("me.current == nil")
return
}
check := me.forge.Repos.FindByGoPath(me.current.GoPath())
if check == nil {
log.Info("forge: how was this not found?", me.current.GoPath())
return
}
if me.current.Status.IsReleased() {
log.Info("IsReleased() == true. do not release this a second time")
} else {
log.Info("IsReleased() == false")
}
if check.CheckDirty() {
log.Info("CheckDirty() == true. do not release dirty repos")
} else {
log.Info("CheckDirty() == false")
}
if ok, _ := check.IsPrimitive(); ok {
log.Info("IsPrimitive() == true")
} else {
log.Info("IsPrimitive() == false")
}
if me.forge.Config.IsPrivate(check.GoPath) {
log.Info("IsPrivate() == true")
} else {
log.Info("IsPrivate() == false")
}
if ok, compiled, err := me.current.IsProtobuf(); ok {
log.Info(log.Sprint("IsProtobuf() == true compiled protobuf files = ", compiled))
if err != nil {
log.Info(log.Sprint("IsProtobuf() == err", err))
os.Exit(-1)
}
for _, s := range compiled {
log.Info("\tcompiled file found:", s)
}
} else {
log.Info("IsProtobuf() == false")
if err != nil {
log.Info(log.Sprint("IsProtobuf() == err", err))
}
}
if me.current.Status.Whitelist {
log.Info("Whitelist == true SHOULD NOT RELEASE THIS")
} else {
log.Info("Whitelist == false")
}
log.Info("")
testNext()
log.Info(repolist.ReportHeader())
log.Info(me.current.StandardHeader())
log.Info("")
log.Info(repolist.ReleaseReportHeader())
log.Info(me.current.StandardReleaseHeader())
}

View File

@ -1,84 +0,0 @@
package main
import (
"fmt"
"go.wit.com/lib/gui/repolist"
"go.wit.com/log"
)
func PrintReport(readonly string, onlydirty string, perfect string) {
var count int
log.Info(repolist.ReportHeader())
loop := me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
count += 1
header := repo.StandardHeader()
if onlydirty == "true" {
if repo.CheckDirty() {
log.Info(header + "")
}
continue
}
if me.forge.Config.IsReadOnly(repo.GoPath()) {
if readonly == "true" {
log.Info(header + "readonly")
}
continue
}
if repo.State() == "PERFECT" {
if perfect == "false" {
continue
}
}
if repo.State() != "merge to main" {
log.Info(header + "")
continue
}
if repo.CheckDirty() {
log.Info(header + "")
continue
}
log.Info(header + "")
check := me.forge.Repos.FindByGoPath(repo.GoPath())
if check == nil {
log.Info("boo, you didn't git clone", repo.GoPath())
continue
}
me.forge.StandardReleaseHeader(check, repo.State())
}
log.Info(fmt.Sprintf("EVERYTHING WORKED repo count = %d", count))
}
func PrintReleaseReport(readonly string, perfect string) {
var count int
log.Info(repolist.ReleaseReportHeader())
loop := me.forge.Repos.SortByGoPath()
for loop.Scan() {
check := loop.Next()
if me.forge.Config.IsReadOnly(check.GoPath) {
continue
}
if check.GetCurrentBranchVersion() == check.GetTargetVersion() {
continue
}
count += 1
if check == nil {
log.Info("boo, you didn't git clone", check.GoPath)
continue
}
var state string
if check.CheckDirty() {
state = "(dirty)"
}
log.Info(me.forge.StandardReleaseHeader(check, state))
}
log.Info(fmt.Sprintf("total repo count = %d", count))
}

179
main.go
View File

@ -2,17 +2,23 @@ package main
import ( import (
"embed" "embed"
"errors"
"fmt"
"os" "os"
"path/filepath" "path/filepath"
"go.wit.com/dev/alexflint/arg" "go.wit.com/dev/alexflint/arg"
"go.wit.com/gui" "go.wit.com/lib/fhelp"
"go.wit.com/lib/gadgets"
"go.wit.com/lib/gui/prep"
"go.wit.com/lib/gui/shell" "go.wit.com/lib/gui/shell"
"go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/forgepb"
"go.wit.com/lib/protobuf/gitpb"
"go.wit.com/log" "go.wit.com/log"
) )
var VERSION string var VERSION string
var ARGNAME string = "guireleaser"
//go:embed resources/* //go:embed resources/*
var resources embed.FS var resources embed.FS
@ -21,21 +27,24 @@ var argv args
func main() { func main() {
me = new(autoType) me = new(autoType)
prep.Bash(ARGNAME, argv.DoAutoComplete) // this line should be: prep.Bash(argv)
me.myGui = prep.Gui() // prepares the GUI package for go-args
me.pp = arg.MustParse(&argv)
// load the ~/.config/forge/ config
me.forge = forgepb.Init() me.forge = forgepb.Init()
// me.forge.ConfigPrintTable() me.forge.ScanRepoDir() // looks for new dirs, checks existing repos for changes
os.Setenv("REPO_WORK_PATH", me.forge.GetGoSrc()) me.found = new(gitpb.Repos)
// parse the command line fhelp.CheckGoModCleanExit()
arg.MustParse(&argv)
// me.forge.ConfigPrintTable()
os.Setenv("REPO_WORK_PATH", me.forge.Config.ReposDir)
// save the ENV var here // save the ENV var here
me.releaseReasonS = os.Getenv("GUIRELEASE_REASON") me.releaseReasonS = os.Getenv("GUIRELEASE_REASON")
if me.releaseReasonS == "" { if me.releaseReasonS == "" {
log.Info("shell ENV GUIRELEASE_REASON not set") badExit(errors.New("shell ENV GUIRELEASE_REASON not set"))
os.Exit(0)
} }
// unset the go development ENV var to generate release files // unset the go development ENV var to generate release files
@ -43,16 +52,20 @@ func main() {
// user drops to a shell or xterm, then they shouldn't be set there either // user drops to a shell or xterm, then they shouldn't be set there either
os.Unsetenv("GO111MODULE") os.Unsetenv("GO111MODULE")
me.myGui = gui.New() me.myGui.Start() // loads the GUI toolkit
me.myGui.InitEmbed(resources)
me.myGui.Default()
// our main window // our main window
me.mainWindow = me.myGui.NewWindow("GUI release manager " + VERSION) me.mainWindow = gadgets.RawBasicWindow("GUI release manager " + VERSION)
me.mainBox = me.mainWindow.NewBox("bw hbox", true) me.mainWindow.Custom = func() {
log.Warn("Window closed. forge configsave")
// sets the hidden flag to false so Toggle() works
me.forge.ConfigSave()
okExit("")
}
me.mainWindow.Make()
me.mainWindow.Show()
// start the http server for polling status me.mainBox = me.mainWindow.Box()
go startHTTP()
// sanity check of things that might be around that mess // sanity check of things that might be around that mess
// up things later // up things later
@ -61,128 +74,58 @@ func main() {
homeDir, _ := os.UserHomeDir() homeDir, _ := os.UserHomeDir()
gowork := filepath.Join(homeDir, "go/src/go.work") gowork := filepath.Join(homeDir, "go/src/go.work")
if shell.Exists(gowork) { if shell.Exists(gowork) {
log.Info("go.work must be deleted") badExit(errors.New("go.work must be deleted"))
os.Exit(0)
} }
/*
// sanity check of things that might be around that mess
// up things later
// check to make sure we have a go.sum here
gosum := filepath.Join(homeDir, "go/src/go.wit.com/apps/guireleaser/go.sum")
if !shell.Exists(gosum) {
log.Info("go.sum must exist here")
os.Exit(0)
}
*/
log.Info("Creating the Release Window") log.Info("Creating the Release Window")
// initialize the repo list window
// which should be all the git repositories in ~/go/src & the .config file
me.repos = makeRepoView()
// the left side of the window options // the left side of the window options
globalDisplayOptions(me.mainBox) globalDisplayOptions(me.mainBox)
// create the right side of the main window // create the right side of the main window
createReleaseBox(me.mainBox) createReleaseBox(me.mainBox)
// disable the open repo button. this isn't really important
// but does indicates the app (and toolkit) is working
// this can be removed later, but in these early days, I'm using this
// tool to release the code for this app, the gui and the gui toolkits
// and sometimes they lie, don't display stuff, don't even disable things
// so I can't trust even what I see. It's complicated right now still.
me.release.openrepo.Disable()
// disable the gui until the repos are scanned // disable the gui until the repos are scanned
me.release.box.Disable() me.release.box.Disable()
me.Disable() me.Disable()
// register a Show/Hide function for the repo list table // todo: add this to forgepb
me.repos.View.RegisterHideFunction(hideFunction) me.startRepo = me.forge.FindWorkingDirRepo()
// scan in the State of all the repos if _, count, _, err := me.forge.IsEverythingOnMaster(); err != nil {
// TODO: should not really be necessary directly after init() log.Info("not everything is on the master branch (", count, "repos)")
me.repos.View.ScanRepositories() if argv.Quick != nil {
// quick also means ignore the master branch check
argv.Force = true
}
if !argv.Force {
os.Exit(-1)
}
}
loop := me.repos.View.ReposSortByName() if me.startRepo == nil {
for loop.Scan() { pwd, _ := os.Getwd()
repo := loop.Repo() msg := fmt.Sprint("Can not run if pwd is not a repo", pwd)
if me.forge.Config.IsReadOnly(repo.GoPath()) { badExit(errors.New(msg))
repo.Status.SetReadOnly(true) }
me.forge.RillFuncError(rillPurge)
// run this each time something gets published successfully
rePrepareRelease()
if findNext() {
log.Info("prepare release findNext() returned true")
} else { } else {
repo.Status.SetReadOnly(false) // check if nothing is found an exit?
if me.found.Len() == 0 {
log.Info("nothing found to publish")
okExit("found nothing")
} }
if me.forge.Config.IsPrivate(repo.GoPath()) {
repo.Status.SetPrivate(true)
} else {
repo.Status.SetPrivate(false)
}
}
// the repo from the command line
// var myrepo *repolist.RepoRow
// find myself. the guireleaser directory is used as a working scratchpad
// for running go commands that can mess up the go.* files
loop = me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
if repo.GoPath() == "go.wit.com/apps/guireleaser" {
if me.release.guireleaser == nil {
me.release.guireleaser = repo
}
}
log.Info("repolist.ReposSortByName() found", repo.GoPath())
/*
if repo.GoPath() == myargs.Repo {
myrepo = repo
}
*/
}
if me.release.guireleaser == nil {
log.Info("Can not release if guireleaser was not found")
os.Exit(0)
} }
me.Enable() me.Enable()
me.release.box.Enable()
// set all branches to master & findNext() // start the http server for polling status
makePrepareRelease() startHTTP()
// intermittently scans the status indefinitly
me.repos.View.Watchdog(func() {
log.Info("In main()")
// processing is done. update the repo summary box
// me.summary.Update()
})
}
// start the initail scan and make sure each repo is set
// to the master branch
func setAllBranchesToMaster() bool {
var worked bool = true
loop := me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
if repo.ReadOnly() {
continue
}
if repo.IsDirty() {
continue
}
if repo.Status.Whitelist {
continue
}
if repo.Status.CheckoutMaster() {
log.Warn("git checkout master branch worked", repo.Name())
} else {
log.Warn("git checkout master branch failed", repo.Name())
worked = false
}
// repo.NewScan()
}
return worked
} }

View File

@ -1,139 +1,297 @@
package main package main
import ( import (
"errors"
"fmt"
"os" "os"
"path/filepath"
"time"
"go.wit.com/lib/gui/shell"
"go.wit.com/lib/protobuf/forgepb"
"go.wit.com/lib/protobuf/gitpb"
"go.wit.com/log" "go.wit.com/log"
) )
func makePrepareRelease() { func forceReleaseVersion(repo *gitpb.Repo) {
me.Disable() if argv.Minor {
me.release.box.Disable() // if v1.2.3 change to v.1.3.0
defer me.Enable() repo.IncrementTargetMinor()
if setAllBranchesToMaster() {
// if it succeeds, disable this button
me.setBranchesToMasterB.Disable()
me.release.box.Enable()
PrintReleaseReport("", "")
} else { } else {
log.Info("setAllBranchesToMaster() failed") // if v1.2.3 change to v.1.2.4
} repo.IncrementTargetRevision()
// first reset all the target versions back to the current version
// incase there was a partial release process running that
// did not finish
loop := me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
// find the gitpb.Repo
check := me.forge.Repos.FindByGoPath(repo.GoPath())
if check == nil {
log.Info("boo, you didn't git clone", repo.GoPath())
os.Exit(-1)
}
// set the target version to the current master version
curver := repo.Status.GetMasterVersion()
check.SetTargetVersion(curver)
}
// on startup, run fixGoDeps() on every go.sum that didn't match
if argv.Fix {
loop = me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
// find the gitpb.Repo
check := me.forge.Repos.FindByGoPath(repo.GoPath())
if check == nil {
log.Info("boo, you didn't git clone", repo.GoPath())
os.Exit(-1)
}
if !me.forge.FinalGoDepsCheckOk(check) {
fixGodeps(check)
}
} }
} }
// now figure out what to release and increment the version func checkpkgcache(repo *gitpb.Repo) error {
loop = me.repos.View.ReposSortByName() homedir, err := os.UserHomeDir()
for loop.Scan() { if err != nil {
repo := loop.Repo() return err
// find the gitpb.Repo }
check := me.forge.Repos.FindByGoPath(repo.GoPath()) rver := repo.GetLastTag()
if check == nil { if rver == "" {
log.Info("boo, you didn't git clone", repo.GoPath()) return errors.New("could not get master version")
os.Exit(-1) }
moddir := filepath.Join(homedir, "go/pkg/mod", repo.GetGoPath()+"@"+rver)
if shell.IsDir(moddir) {
return nil
} }
// if check.GetGoPath() == "go.wit.com/dev/alexflint/arg" { getpath := repo.GetGoPath() + "@" + repo.GetLastTag()
if check.GetGoPath() == "go.wit.com/gui" { log.Infof("~/go/pkg/mod/ IS MISSING %s so I'm running go get here.", getpath)
log.Info("arg", check.GetGoPath(), check.GetMasterVersion(), check.GoPrimitive) _, err = me.startRepo.RunVerboseOnError([]string{"go", "get", getpath})
if me.forge.FinalGoDepsCheckOk(check) { return err
log.Info("arg final check true", check.GetGoPath()) }
var rillcount int
func rillPurge(repo *gitpb.Repo) error {
if me.forge.Config.IsReadOnly(repo.GetGoPath()) {
return nil
}
if me.forge.Config.IsPrivate(repo.GetGoPath()) {
return nil
}
_, err := repo.RunQuiet([]string{"go-mod-clean", "purge"})
rillcount += 1
if err != nil {
log.Info("go-mod-clean purge failed", repo.GetGoPath(), err)
return err
}
return nil
}
func rillRestore(repo *gitpb.Repo) error {
if me.forge.Config.IsReadOnly(repo.GetGoPath()) {
return nil
}
if me.forge.Config.IsPrivate(repo.GetGoPath()) {
return nil
}
var err error
if argv.Verbose {
log.Info("go-mod-clean lax START", repo.GetGoPath())
result := repo.RunRealtime([]string{"go-mod-clean", "lax"})
log.Info("go-mod-clean lax END", repo.GetGoPath())
if result.Exit != 0 {
err = fmt.Errorf("repo %s failed %d", repo.GetGoPath(), result.Exit)
}
} else { } else {
log.Info("arg final check false", check.GetGoPath()) _, err = repo.RunQuiet([]string{"go-mod-clean", "lax"})
// os.Exit(-1)
} }
// see if there is a new version rillcount += 1
master := repo.Status.GetMasterVersion() if err != nil {
lastTag := repo.Status.LastTag() log.Info("go-mod-clean lax failed", repo.GetGoPath(), err)
log.Info("arg ", master, lastTag) return err
// os.Exit(-1)
} }
// check if the package dependancies changed, if so, re-publish return nil
if !check.GoPrimitive { }
if me.forge.FinalGoDepsCheckOk(check) {
log.Printf("go.sum is perfect! %s\n", check.GetGoPath()) func rePrepareRelease() {
} else { me.forge.ScanRepoDir() // looks for new dirs, checks existing repos for changes
log.Printf("dependancy checks indicate a new release is needed for %s\n", check.GetGoPath()) me.found = new(gitpb.Repos)
repo.Status.IncrementRevisionVersion("godeps changed") me.reason = make(map[*gitpb.Repo]string) // stores the reason repos need to be versioned & released
target := repo.Status.GetTargetVersion()
check.SetTargetVersion(target) log.Printf("rePrepareRelease() START rill go-mod-clean lax (11 seconds?)")
rillcount = 0
forgepb.RillX = 2
forgepb.RillY = 2
now := time.Now()
me.forge.RillFuncError(rillRestore)
log.Printf("showRestore() (%d total repos) took:%s\n", rillcount, shell.FormatDuration(time.Since(now)))
log.Sleep(1)
all2 := me.forge.Repos.SortByFullPath()
for all2.Scan() {
check := all2.Next()
if me.forge.Config.IsReadOnly(check.GetGoPath()) {
continue
}
if me.forge.Config.IsPrivate(check.GetGoPath()) {
continue
}
// this should be rare? nonexistant?
if err := checkpkgcache(check); err != nil {
log.Info("go get checks failed here.", err, check.GetGoPath())
} }
} }
// see if there is a new version all := me.forge.Repos.SortByFullPath()
master := repo.Status.GetMasterVersion() for all.Scan() {
lastTag := repo.Status.LastTag() check := all.Next()
if alreadyDone(check) {
// means it was already published
// protects against logic errors that might result
// in an infinite loop
log.Info("WARNING alreadyDone rePrepareRelease()", check.GetGoPath())
continue
}
if me.forge.Config.IsReadOnly(check.GetGoPath()) {
// can't release readonly repos
continue
}
master := check.GetMasterVersion()
lastTag := check.GetLastTag()
if argv.Quick != nil {
// if argv has 'quick' don't do anything
// that doesn't actually have a patch
if master == lastTag { if master == lastTag {
repo.Status.SetTargetVersion(master) continue
} else {
repo.Status.IncrementRevisionVersion("Nov 2024 test")
target := repo.Status.GetTargetVersion()
check.SetTargetVersion(target)
} }
// if check.GetGoPath() == "go.wit.com/dev/alexflint/arg" {
// if check.GetGoPath() == "go.wit.com/gui" {
if check.GetGoPath() == "go.wit.com/dev/davecgh/spew" {
log.Info(repo.StandardReleaseHeader())
log.Info(me.forge.StandardReleaseHeader(check, repo.State()))
log.Info("arg", check.GetGoPath(), check.GetMasterVersion(), check.GoPrimitive)
if me.forge.FinalGoDepsCheckOk(check) {
log.Info("go.sum is perfect")
} else {
log.Info("go.sum check false")
} }
// see if there is a new version log.Info("LAST TAG", check.FullPath, master, lastTag)
master := repo.Status.GetMasterVersion()
lastTag := repo.Status.LastTag() // this is detailed. It makes sure the go.* files are absolutely perfect
log.Info("arg ", master, lastTag) if !me.forge.Config.IsPrivate(check.GetGoPath()) {
if err := checkPublishedGodeps(check); err != nil {
// this means the published godeps are no longer up to date
forceReleaseVersion(check)
me.found.AppendByFullPath(check)
log.Info("checkPublishedGodeps failed with err", check.GetGoPath(), err)
continue
} else {
// log.Info("checkPublishedGodeps is ok", check.GetGoPath())
}
}
// if master != lastTag, always increment
if master != lastTag { if master != lastTag {
newmhash := check.GetTagHash(master)
oldlhash := check.GetTagHash(lastTag)
if newmhash == oldlhash {
// they are actually equal
continue
}
b1 := check.CountDiffObjects(oldlhash, newmhash)
b2 := check.CountDiffObjects(newmhash, oldlhash)
if b1 != 0 {
log.Printf("HASH ERROR %-50s tag %s < %s\n", check.GetGoPath(), newmhash, oldlhash)
log.Info("old vs new count", b1, b2, "git merge", oldlhash)
}
if b1 == 0 && b2 == 0 {
log.Info("got to identical repo", check.GetGoPath(), b1, b2)
log.Info("got to identical repo", check.GetGoPath(), oldlhash, newmhash)
// actually identical. do nothing
continue
}
if gitpb.IsGoTagVersionGreater(lastTag, master) {
// this function is not right really. the hash error above should catch it correctly
// log.Printf("PROBABLY NOT NEE %-50s tag %s < %s\n", check.GetGoPath(), lastTag, master)
}
log.Printf("NEED RELEASE FOR %-50s tag %s != %s\n", check.GetGoPath(), master, lastTag)
forceReleaseVersion(check)
me.found.AppendByFullPath(check)
me.reason[check] = "master != lastTag"
continue
}
if me.forge.Config.IsPrivate(check.GetGoPath()) {
// only checks after this are GO dep related which don't matter for private repos
continue
}
if argv.Protobuf && check.GetRepoType() == "protobuf" {
log.Printf("NEED RELEASE FOR %s err: %v\n", check.GetGoPath(), "because --protobuf")
// if --protobuf, this will force upgrade each one
forceReleaseVersion(check)
me.found.AppendByFullPath(check)
me.reason[check] = "protobuf repo deps changed"
continue
}
// if the repo is a go binary or plugin for a new release for
// any library version change
// if check.GetRepoType() == "binary" || check.GetRepoType() == "plugin" {
// check if the package dependancies changed, if so, re-publish
if err := me.forge.FinalGoDepsCheckOk(check, false); err == nil {
// log.Printf("go.sum is perfect! %s\n", check.GetGoPath())
continue
} else {
log.Printf("NEED RELEASE FOR %-50s err: %v\n", check.GetGoPath(), err)
forceReleaseVersion(check)
me.found.AppendByFullPath(check)
me.reason[check] = "FinalGoDepsCheckOk() failed even though master tag == last tag"
}
}
me.forge.PrintHumanTable(me.found)
// todo: verify each found repo is on the master branch
for repo := range me.found.IterAll() {
if repo.CurrentBranchName != repo.MasterBranchName {
log.Info("repo not on master branch", repo.FullPath)
if !argv.Force {
os.Exit(-1) os.Exit(-1)
} }
} }
} }
if findNext() { }
log.Info("prepare release findNext() returned true")
me.release.box.Enable() func printDone() {
for _, gopath := range me.done {
log.Info("printDone() THESE WERE PUBLISHED", gopath)
}
log.Info("printDone() total finished so far:", len(me.done))
time.Sleep(time.Second)
}
func alreadyDone(repo *gitpb.Repo) bool {
for _, gopath := range me.done {
// log.Info("WARNING already done", gopath, repo.GetGoPath())
// log.Info("WARNING already done", gopath, repo.GetGoPath())
// log.Info("WARNING already done", gopath, repo.GetGoPath())
if repo.GetGoPath() == gopath {
log.Info("FOUND. RETURN TRUE. already done", gopath, repo.GetGoPath())
return true
}
}
return false
}
/*
func upgradeReason(repo *gitpb.Repo) string {
for _, gopath := range me.reason {
// log.Info("WARNING already done", gopath, repo.GetGoPath())
// log.Info("WARNING already done", gopath, repo.GetGoPath())
// log.Info("WARNING already done", gopath, repo.GetGoPath())
if repo.GetGoPath() == gopath {
log.Info("FOUND. RETURN TRUE. already done", gopath, repo.GetGoPath())
return true
}
}
return false
}
*/
func checkPublishedGodeps(repo *gitpb.Repo) error {
godepsOld, err := repo.GoSumFromPkgDir()
if err != nil {
return err
}
if godepsOld != nil {
if err := me.forge.TestGoDepsCheckOk(godepsOld, argv.Verbose); err != nil {
return err
}
}
godepsNew, err := repo.GoSumFromRepo()
if err != nil {
return err
}
if godepsOld == nil {
if godepsNew == nil {
log.Printf("%s published godeps == nil && real == nil\n", repo.GetGoPath())
return nil
} else { } else {
log.Info("prepare release findNext() returned false") return fmt.Errorf("published godeps == nil vs real != nil")
if findNext() {
log.Info("prepare release findNext() returned true")
me.release.box.Enable()
} else {
log.Info("prepare release findNext() returned false")
} }
} }
if err := me.forge.TestGoDepsCheckOk(godepsNew, argv.Verbose); err != nil {
return err
}
return nil
} }

View File

@ -3,17 +3,14 @@ package main
import ( import (
"fmt" "fmt"
"os"
"path/filepath"
"strings"
"time" "time"
"go.wit.com/gui" "go.wit.com/gui"
"go.wit.com/log" "go.wit.com/log"
"go.wit.com/lib/gadgets" "go.wit.com/lib/gadgets"
"go.wit.com/lib/gui/repolist"
"go.wit.com/lib/gui/shell" "go.wit.com/lib/gui/shell"
"go.wit.com/lib/protobuf/gitpb"
) )
type releaseStruct struct { type releaseStruct struct {
@ -28,19 +25,14 @@ type releaseStruct struct {
releaseVersionB *gui.Node releaseVersionB *gui.Node
reason *gadgets.BasicEntry reason *gadgets.BasicEntry
openrepo *gui.Node // openrepo *gui.Node
goGetB *gui.Node goGetB *gui.Node
checkGoSumB *gui.Node checkGoSumB *gui.Node
checkDirtyB *gui.Node checkDirtyB *gui.Node
makeRedomodB *gui.Node
sendVersionB *gui.Node sendVersionB *gui.Node
checkSafeB *gui.Node checkSafeB *gui.Node
whitelist map[string]*repolist.RepoRow // whitelist map[string]*repolist.RepoRow
// store myself here. use myself to
// do garbage go get tests and other potential junk
guireleaser *repolist.RepoRow
} }
func (w *autoType) Disable() { func (w *autoType) Disable() {
@ -59,14 +51,20 @@ func createReleaseBox(box *gui.Node) {
me.release.releaseVersionB = me.release.grid.NewButton("release version", func() { me.release.releaseVersionB = me.release.grid.NewButton("release version", func() {
buttonDisable() buttonDisable()
if doRelease() { fpath := me.current.FullPath
if err := doRelease(); err == nil {
buttonEnable() buttonEnable()
log.Info("doRelease() worked") log.Info("doRelease() worked", fpath)
} else { } else {
log.Info("doRelease() failed") log.Info("doRelease() failed", err, fpath)
log.Info("doRelease() FAILED", err, fpath)
log.Info("doRelease() FAILED", err, fpath)
log.Info("doRelease() FAILED", err, fpath)
} }
skipToNext()
me.forge.PrintHumanTable(me.found)
}) })
me.release.grid.NewButton("Find Next Releasable", func() { me.release.grid.NewButton("Find Next", func() {
me.Disable() me.Disable()
defer me.Enable() defer me.Enable()
if findNext() { if findNext() {
@ -74,13 +72,18 @@ func createReleaseBox(box *gui.Node) {
return return
} }
}) })
me.release.grid.NewButton("Show Next", func() {
check := me.current
if check == nil {
log.Info("boo, current is missing", me.current.GetGoPath())
return
}
testGoRepo(check)
me.forge.HumanPrintRepo(check)
})
me.release.grid.NextRow() me.release.grid.NextRow()
me.release.repo = gadgets.NewOneLiner(me.release.grid, "repo") me.release.repo = gadgets.NewOneLiner(me.release.grid, "repo")
me.release.openrepo = me.release.grid.NewButton("Configure", func() {
me.current.Status.Toggle()
})
me.release.openrepo.Disable()
me.release.grid.NextRow() me.release.grid.NextRow()
me.release.status = gadgets.NewOneLiner(me.release.grid, "status") me.release.status = gadgets.NewOneLiner(me.release.grid, "status")
me.release.grid.NextRow() me.release.grid.NextRow()
@ -98,153 +101,71 @@ func createReleaseBox(box *gui.Node) {
me.autoWorkingPwd = gadgets.NewOneLiner(me.release.grid, "working directory (pwd)") me.autoWorkingPwd = gadgets.NewOneLiner(me.release.grid, "working directory (pwd)")
me.release.grid.NextRow() me.release.grid.NextRow()
me.userHomePwd = gadgets.NewOneLiner(me.release.grid, "user home")
me.release.grid.NextRow()
me.goSrcPwd = gadgets.NewOneLiner(me.release.grid, "go src home") me.goSrcPwd = gadgets.NewOneLiner(me.release.grid, "go src home")
me.release.grid.NextRow() me.release.grid.NextRow()
homeDir, err := os.UserHomeDir() // me.userHomePwd.SetText(homeDir)
if err != nil { me.goSrcPwd.SetText(me.forge.Config.ReposDir)
log.Warn("Error getting home directory:", err)
homeDir = "/home/autotypist"
}
me.userHomePwd.SetText(homeDir)
srcDir := filepath.Join(homeDir, "go/src")
me.goSrcPwd.SetText(srcDir)
testf := filepath.Join(srcDir, "go.wit.com/apps/guireleaser", "go.sum")
if !shell.Exists(testf) {
pb := me.forge.Repos.FindByGoPath("go.wit.com/apps/guireleaser")
if pb != nil {
pb.RedoGoMod()
}
if !shell.Exists(testf) {
log.Info("go.sum missing", testf)
panic("redo go.sum")
}
}
group := me.release.box.NewGroup("Run on Current Repo") group := me.release.box.NewGroup("Run on Current Repo")
grid := group.NewGrid("buildOptions", 0, 0) grid := group.NewGrid("buildOptions", 0, 0)
grid.NewButton("whitelist", func() {
// tmp := me.current.GoState()
log.Info("trying to whitelist repo", me.current.GoPath())
me.current.Status.Whitelist = true
findNext()
})
grid.NextRow() grid.NextRow()
group = me.release.box.NewGroup("Process against all repos") group = me.release.box.NewGroup("Publish until done")
grid = group.NewGrid("buildOptions", 0, 0) grid = group.NewGrid("buildOptions", 0, 0)
grid.NewButton("doRelease() all", func() { grid.NewButton("doRelease() all", func() {
buttonDisable() buttonDisable()
// rather than loop forever, at least limit this to the number of repos doReleaseAll()
// incase something, somewhere, goes wrong
ok, duration := doReleaseAll()
s := fmt.Sprint(duration)
log.Info("release returned", ok, "and ran for", s, "findCounter =", findCounter)
first := findCounter
if findCounter != 0 {
log.Info("should try thsi doRelease() loop again since findCounter =", findCounter)
ok, duration := doReleaseAll()
s := fmt.Sprint(duration)
log.Info("release returned", ok, "and ran for", s, "findCounter =", findCounter)
}
second := findCounter
log.Info("doReleaseAll() first =", first, "second =", second)
buttonEnable() buttonEnable()
}) })
grid.NextRow() grid.NextRow()
group = me.release.box.NewGroup("experimental and potentially dangerous stuff")
grid = group.NewGrid("buildOptions", 0, 0)
me.setBranchesToMasterB = grid.NewButton("set all branches to master", func() {
me.Disable()
defer me.Enable()
if setAllBranchesToMaster() {
// if it succeeds, disable this button
me.setBranchesToMasterB.Disable()
}
})
grid.NextRow()
grid.NewButton("git ls-files |grep go.mod", func() {
loop := me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
log.Info("repo:", repo.Name())
if repo.Status.ReadOnly() {
continue
}
if repo.Status.Whitelist {
log.Warn("skipping whitelist", repo.GoPath())
continue
}
good, files := repo.Status.GitLsFiles()
if !good {
log.Warn("Something went wrong", repo.GoPath())
continue
}
for _, filename := range strings.Split(files, "\n") {
log.Info("\tfile", filename)
if filename == "go.mod" {
log.Info("Found go.mod. does version match release version?")
log.Info(repo.Status.GetLastTagVersion(), "vs", repo.Status.GetTargetVersion())
if repo.Status.GetLastTagVersion() != repo.Status.GetTargetVersion() {
log.Info(repo.Status.GetLastTagVersion(), "vs", repo.Status.GetTargetVersion())
log.Info("Found go.sum. version mismatch")
setCurrentRepo(repo, "VERY BROKEN", "rewind go.mod commit")
return
}
}
if filename == "go.sum" {
log.Info("Found go.sum. does version match release version?")
log.Info(repo.Status.GetLastTagVersion(), "vs", repo.Status.GetTargetVersion())
if repo.Status.GetLastTagVersion() != repo.Status.GetTargetVersion() {
log.Info(repo.Status.GetLastTagVersion(), "vs", repo.Status.GetTargetVersion())
log.Info("Found go.sum. version mismatch")
setCurrentRepo(repo, "VERY BROKEN", "rewind go.mod commit")
return
}
}
}
}
log.Info("All repos seem okay")
})
grid.NextRow()
} }
func doReleaseAll() (bool, time.Duration) { func doReleaseAll() {
var worked bool = true count := 0
findCounter = 0 for {
duration := repolist.TimeFunction(func() { log.Info("START doRelease() LOOP count =", count, "len me.done =", len(me.done))
loop := me.repos.View.ReposSortByName() if err := doRelease(); err != nil {
for loop.Scan() { break
loop.Repo()
if doRelease() {
log.Info("doRelease() worked. findCounter =", findCounter)
} else {
if os.Getenv("FindNextDone") == "true" {
log.Info("findNext says it was done. findCounter =", findCounter)
log.Info("findNext says it was done. findCounter =", findCounter)
log.Info("we can os.Exit here")
} }
if me.release.status.String() == "ALL DONE?" { if err := skipToNext(); err != nil {
log.Info("maybe ALL DONE?. findCounter =", findCounter) break
buttonEnable()
worked = true
// os.Exit(0)
} }
log.Info("doRelease() failed. findCounter =", findCounter) count += 1
worked = false if count > me.forge.Repos.Len() {
// never allow a loop longer than all the known repos
// this probably doesn't matter, but often this code is wrong
// so this is a safety check. never remove this check.
break break
} }
} }
}) }
return worked, duration
func skipToNext() error {
shell.RunVerbose([]string{"forge", "dirty"})
log.Info("Sleeping for 2 seconds for no reason.")
time.Sleep(1)
me.forge.ScanRepoDir() // looks for new dirs, checks existing repos for changes
me.found = new(gitpb.Repos)
me.current.ReloadCheck()
me.forge.SetConfigSave(true)
me.forge.ConfigSave()
log.Info("sleep 2")
time.Sleep(2 * time.Second)
printDone()
rePrepareRelease()
findNext()
if me.current == nil {
log.Info("NOT GOOD TO RUN ANOTHER DAY")
log.Info("took out all the loop code")
setCurrentRepo(nil, "loop by hand motherfucker", "fucknuts")
return fmt.Errorf("findNext returned next repo == nil")
}
log.Info("GOOD TO RUN ANOTHER DAY ON:", me.current.GetGoPath())
return nil
} }
func buttonDisable() { func buttonDisable() {

View File

@ -1,73 +0,0 @@
package main
import (
"go.wit.com/lib/gadgets"
"go.wit.com/lib/gui/repolist"
"go.wit.com/log"
"go.wit.com/gui"
)
type repoWindow struct {
win *gadgets.BasicWindow
box *gui.Node
View *repolist.RepoList
}
func (r *repoWindow) Hidden() bool {
return r.win.Hidden()
}
func (r *repoWindow) Show() {
r.win.Show()
}
func (r *repoWindow) Hide() {
r.win.Hide()
}
func (r *repoWindow) Disable() {
r.box.Disable()
}
func (r *repoWindow) Enable() {
r.box.Enable()
}
// you can only have one of these
func makeRepoView() *repoWindow {
if me.repos != nil {
return me.repos
}
r := new(repoWindow)
r.win = gadgets.RawBasicWindow("GUI repositories in ~/go/src/")
r.win.Make()
r.box = r.win.Box().NewBox("bw vbox", false)
r.win.Custom = func() {
log.Warn("GOT HERE: main() gadgets.NewBasicWindow() close")
log.Warn("Should I do something special here?")
}
// reposbox.SetExpand(false)
group1 := r.box.NewGroup("Run on all repos:")
hbox := group1.Box()
// hbox.Horizontal()
hbox.Vertical()
r.View = repolist.InitBox(me.forge, r.box)
r.View.Enable()
r.View.ScanRepositories()
/*
r.View = repolist.GuireleaserView(r.box)
showncount := r.View.MirrorShownCount()
box2.Append(showncount)
duration := r.View.MirrorScanDuration()
box2.Append(duration)
*/
return r
}

1
resources/README Normal file
View File

@ -0,0 +1 @@
* you can put toolkit .so binaries here

View File

@ -1,73 +0,0 @@
package main
/*
func setTargetVersion() {
// go through and set the target versions for each repo
// todo: add sanity checking in repolist to verify these and/or autocompute them
// for now, just don't be stupid when you set your ENV vars
// widget I versioned early before I knew what the hell this would mean and can
// not be down versioned because that's not how GO versioning works. Once you
// set the version for a path, it's set in stone forever. (smart system!)
// we could rename go.wit.com/widget to go.wit.com/newwidget and restart the versioning
// system, but that's rediculous and this servers to always remind me to never make this mistake again
var count int
loop := me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
if repo == nil {
log.Info("initial scan repo = nil")
continue
}
if repo.Status == nil {
log.Info("repo.status == nil", repo.Name())
continue
}
if repo.GoPath() == "go.wit.com/widget" {
repo.Status.SetTargetVersion("v" + os.Getenv("GUIRELEASE_WIDGET"))
} else {
prefix := "v" + os.Getenv("GUIRELEASE_VERSION")
lasttag := repo.Status.LastTag()
if strings.HasPrefix(lasttag, prefix) {
repo.Status.SetTargetVersion(lasttag)
} else {
repo.Status.SetTargetVersion(prefix)
}
}
if strings.HasPrefix(repo.GoPath(), "go.wit.com/dev/") {
lasttag := repo.Status.GetLastTagVersion()
repo.Status.SetTargetVersion(lasttag)
}
// repo.NewScan()
count += 1
}
log.Info("target versions set for", count, "repos")
}
// trys to figure out if the version needs to be incremented
func incrementTargetVersion() bool {
var count int
loop := me.repos.View.ReposSortByName()
for loop.Scan() {
repo := loop.Repo()
if repo.ReadOnly() {
continue
}
lasttag := repo.Status.GetLastTagVersion()
master := repo.Status.GetMasterVersion()
if lasttag != master {
log.Info("increment target version", repo.GoPath(), lasttag, master)
count += 1
} else {
// check go dependancies for target version changes
}
}
log.Info("need to update target versions for", count, "repos")
if count == 0 {
return true
}
return false
}
*/

View File

@ -2,54 +2,39 @@
package main package main
import ( import (
"go.wit.com/dev/alexflint/arg"
"go.wit.com/gui" "go.wit.com/gui"
"go.wit.com/lib/gadgets" "go.wit.com/lib/gadgets"
"go.wit.com/lib/gui/repolist" "go.wit.com/lib/gui/prep"
"go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/forgepb"
"go.wit.com/lib/protobuf/gitpb"
) )
var me *autoType var me *autoType
type autoType struct { type autoType struct {
myGui *gui.Node pp *arg.Parser // for parsing the command line args. Yay to alexf lint!
myGui *prep.GuiPrep // the gui handle itself
releaseReasonS string // = "gocui dropdown select" releaseReasonS string // = "gocui dropdown select"
release releaseStruct release releaseStruct // notsure
reposbox *gui.Node reposbox *gui.Node // notsure
reposgrid *gui.Node reposgrid *gui.Node // notsure
reposgroup *gui.Node reposgroup *gui.Node // notsure
current *repolist.RepoRow current *gitpb.Repo // tracks the next repo to publish
found *gitpb.Repos // stores the list of repos to process things on
done []string // gopaths for repos already published
reason map[*gitpb.Repo]string // the reason this package is going to be updated
// this is the repo we are starting in
// make sure it never changes so go.mod and go.sum are always there
// 'go get' is called from here
startRepo *gitpb.Repo
// guireleaser window // guireleaser window
mainWindow *gui.Node mainWindow *gadgets.BasicWindow
mainBox *gui.Node mainBox *gui.Node
// our view of the repositories forge *forgepb.Forge // your customized repo preferences and settings
repos *repoWindow
// your customized repo preferences and settings
forge *forgepb.Forge
// #### autotypist Global Build Options
// what to change all the branches to
// so, as a developer, you can move all the repos
// to the 'devel' branch and then test a devel branch build
// then switch back to your 'username' branch and do a build there
// toMoveToBranch string
// displays the preferred names used for the repo tree state
// mainBranch *gadgets.BasicCombobox
// develBranch *gadgets.BasicCombobox
// userBranch *gadgets.BasicCombobox
// this button will regenerate everyones go.mod & go.sum
rerunGoMod *gui.Node
// if checked, will stop trying to os.Exec() things after failure
stopOnErrors *gui.Node
// button to attempt to autorebuild
autoRebuildButton *gui.Node
// checkbox for --dry-run // checkbox for --dry-run
autoDryRun *gui.Node autoDryRun *gui.Node
@ -60,9 +45,6 @@ type autoType struct {
// The current working directory // The current working directory
autoWorkingPwd *gadgets.OneLiner autoWorkingPwd *gadgets.OneLiner
// shows what is being used as your home dir
userHomePwd *gadgets.OneLiner
// shows what directory being used as ~/go/src // shows what directory being used as ~/go/src
goSrcPwd *gadgets.OneLiner goSrcPwd *gadgets.OneLiner
@ -78,9 +60,3 @@ type autoType struct {
// show the time it took to do a scan // show the time it took to do a scan
duration *gui.Node duration *gui.Node
} }
/*
func (my *autoType) GoSrcPath() string {
return my.goSrcPwd.String()
}
*/