summaryrefslogtreecommitdiff
path: root/main.go
blob: e303214e1aae967b16167c1c3185421e1cedff6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package main

import (
	"embed"
	"errors"
	"fmt"
	"os"
	"path/filepath"

	"go.wit.com/dev/alexflint/arg"
	"go.wit.com/gui"
	"go.wit.com/lib/gui/shell"
	"go.wit.com/lib/protobuf/forgepb"
	"go.wit.com/log"
)

var VERSION string

//go:embed resources/*
var resources embed.FS

var argv args

func main() {
	me = new(autoType)

	// load the ~/.config/forge/ config
	me.forge = forgepb.Init()
	// me.forge.ConfigPrintTable()
	os.Setenv("REPO_WORK_PATH", me.forge.GetGoSrc())

	// parse the command line
	arg.MustParse(&argv)

	// save the ENV var here
	me.releaseReasonS = os.Getenv("GUIRELEASE_REASON")

	if me.releaseReasonS == "" {
		badExit(errors.New("shell ENV GUIRELEASE_REASON not set"))
	}

	// unset the go development ENV var to generate release files
	// this is required for go mod init & tidy. Also, if the
	// user drops to a shell or xterm, then they shouldn't be set there either
	os.Unsetenv("GO111MODULE")

	me.myGui = gui.New()
	me.myGui.InitEmbed(resources)
	me.myGui.Default()

	// our main window
	me.mainWindow = me.myGui.NewWindow("GUI release manager " + VERSION)
	me.mainBox = me.mainWindow.NewBox("bw hbox", true)

	// start the http server for polling status
	go startHTTP()

	// sanity check of things that might be around that mess
	// up things later
	// if you have a go.work file, you must delete it
	// TODO: check for go.work files anywhere
	homeDir, _ := os.UserHomeDir()
	gowork := filepath.Join(homeDir, "go/src/go.work")
	if shell.Exists(gowork) {
		badExit(errors.New("go.work must be deleted"))
	}

	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
	globalDisplayOptions(me.mainBox)

	// create the right side of the main window
	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
	me.release.box.Disable()
	me.Disable()

	// register a Show/Hide function for the repo list table
	me.repos.View.RegisterHideFunction(hideFunction)

	// scan in the State of all the repos
	// TODO: should not really be necessary directly after init()
	me.repos.View.ScanRepositories()

	loop := me.repos.View.ReposSortByName()
	for loop.Scan() {
		repo := loop.Repo()
		if me.forge.Config.IsReadOnly(repo.GoPath()) {
			repo.Status.SetReadOnly(true)
		} else {
			repo.Status.SetReadOnly(false)
		}
		if me.forge.Config.IsPrivate(repo.GoPath()) {
			repo.Status.SetPrivate(true)
		} else {
			repo.Status.SetPrivate(false)
		}
	}

	// todo: add this to forgepb
	me.startRepo = me.forge.FindWorkingDirRepo()

	if me.startRepo == nil {
		pwd, _ := os.Getwd()
		msg := fmt.Sprint("Can not run if pwd is not a repo", pwd)
		badExit(errors.New(msg))
	}
	me.Enable()

	// set all branches to master & findNext()
	makePrepareRelease()

	// 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
}