lots of code hopefully better than before
This commit is contained in:
parent
7a90613c91
commit
1d1d8e7eea
|
@ -0,0 +1,63 @@
|
||||||
|
package gitpb
|
||||||
|
|
||||||
|
import "go.wit.com/log"
|
||||||
|
|
||||||
|
func (repo *Repo) CheckoutMaster() bool {
|
||||||
|
bName := repo.GetMasterBranchName()
|
||||||
|
if repo.checkoutBranch(bName) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) CheckoutDevel() bool {
|
||||||
|
bName := repo.GetDevelBranchName()
|
||||||
|
if repo.checkoutBranch(bName) {
|
||||||
|
repo.UserBranchName = bName
|
||||||
|
return true
|
||||||
|
// switch ok
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) CheckoutUser() bool {
|
||||||
|
bName := repo.GetUserBranchName()
|
||||||
|
if repo.checkoutBranch(bName) {
|
||||||
|
repo.UserBranchName = bName
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) BranchExists(bName string) bool {
|
||||||
|
// fixme after move to protobuf
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) checkoutBranch(bName string) bool {
|
||||||
|
if !repo.BranchExists(bName) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if bName == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if repo.CheckDirty() {
|
||||||
|
log.Log(GITPB, repo.GetFullPath(), "is dirty")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
cmd := []string{"git", "checkout", bName}
|
||||||
|
r := repo.Run(cmd)
|
||||||
|
if r.Error != nil {
|
||||||
|
log.Log(GITPB, "git checkout error:", r.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
realname := repo.GetCurrentBranchName()
|
||||||
|
realversion := repo.GetCurrentBranchVersion()
|
||||||
|
log.Log(GITPB, repo.GetFullPath(), "realname =", realname, "realversion =", realversion)
|
||||||
|
|
||||||
|
if realname != bName {
|
||||||
|
log.Log(GITPB, "git checkout failed", repo.GetFullPath(), bName, "!=", realname)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
|
@ -6,9 +6,7 @@ package gitpb
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
"go.wit.com/log"
|
"go.wit.com/log"
|
||||||
|
@ -215,29 +213,3 @@ func trimNonNumericFromStart(s string) string {
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (all *GitTags) SortByAge() *GitTagIterator {
|
|
||||||
packs := all.selectAllGitTag()
|
|
||||||
|
|
||||||
sort.Sort(GitTagAge(packs))
|
|
||||||
|
|
||||||
iterator := NewGitTagIterator(packs)
|
|
||||||
return iterator
|
|
||||||
}
|
|
||||||
|
|
||||||
type GitTagAge []*GitTag
|
|
||||||
|
|
||||||
func (a GitTagAge) Len() int { return len(a) }
|
|
||||||
|
|
||||||
// sorts in ? order
|
|
||||||
func (a GitTagAge) Less(i, j int) bool {
|
|
||||||
if time.Since(a[i].Authordate.AsTime()) < time.Since(a[j].Authordate.AsTime()) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
func (a GitTagAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
||||||
|
|
||||||
func (repo *Repo) SetTargetVersion(target string) {
|
|
||||||
repo.TargetVersion = target
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
package gitpb
|
||||||
|
|
||||||
|
// only reads in the go.mod file. doesn't change anything
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Detect a 'Primative' package. Sets the isPrimative flag
|
||||||
|
// will return true if the repo is truly not dependent on _anything_ else
|
||||||
|
// like spew or lib/widget
|
||||||
|
// it assumes go mod ran init and tidy ran without error
|
||||||
|
func (repo *Repo) isPrimativeGoMod() (bool, error) {
|
||||||
|
// go mod init & go mod tidy ran without errors
|
||||||
|
log.Log(GITPB, "isPrimativeGoMod()", repo.FullPath)
|
||||||
|
tmp := filepath.Join(repo.FullPath, "go.mod")
|
||||||
|
gomod, err := os.Open(tmp)
|
||||||
|
if err != nil {
|
||||||
|
log.Log(GITPB, "missing go.mod", repo.FullPath)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
defer gomod.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(gomod)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := strings.TrimSpace(scanner.Text())
|
||||||
|
|
||||||
|
parts := strings.Split(line, " ")
|
||||||
|
log.Log(GITPB, " gomod:", parts)
|
||||||
|
if len(parts) >= 1 {
|
||||||
|
log.Log(GITPB, " gomod: part[0] =", parts[0])
|
||||||
|
if parts[0] == "require" {
|
||||||
|
log.Log(GITPB, " should return false here")
|
||||||
|
return false, errors.New("go.mod file is not primative")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
repo.GoPrimitive = true
|
||||||
|
repo.GoDeps = nil
|
||||||
|
return true, nil
|
||||||
|
}
|
|
@ -0,0 +1,103 @@
|
||||||
|
package gitpb
|
||||||
|
|
||||||
|
// does processing on the go.mod and go.sum files
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
// reads and parses the go.sum file
|
||||||
|
// does not change anything
|
||||||
|
func (repo *Repo) ParseGoSum() (bool, error) {
|
||||||
|
// empty out what was there before
|
||||||
|
repo.GoDeps = nil
|
||||||
|
tmp := filepath.Join(repo.FullPath, "go.sum")
|
||||||
|
gosum, err := os.Open(tmp)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn("missing go.sum", repo.FullPath)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
defer gosum.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(gosum)
|
||||||
|
log.Info("gosum:", tmp)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := strings.TrimSpace(scanner.Text())
|
||||||
|
|
||||||
|
parts := strings.Split(line, " ")
|
||||||
|
if len(parts) == 3 {
|
||||||
|
godep := strings.TrimSpace(parts[0])
|
||||||
|
version := strings.TrimSpace(parts[1])
|
||||||
|
if strings.HasSuffix(version, "/go.mod") {
|
||||||
|
version = strings.TrimSuffix(version, "/go.mod")
|
||||||
|
}
|
||||||
|
new1 := GoDep{
|
||||||
|
GoPath: godep,
|
||||||
|
Version: version,
|
||||||
|
}
|
||||||
|
if repo.GoDeps == nil {
|
||||||
|
repo.GoDeps = new(GoDeps)
|
||||||
|
}
|
||||||
|
repo.GoDeps.AppendUniqueGoPath(&new1)
|
||||||
|
} else {
|
||||||
|
return false, errors.New("go.sum parse error invalid: " + line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
repo.GoDeps = nil
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// reads and parses the go.sum file
|
||||||
|
// is identical to the one above, change that
|
||||||
|
func (repo *Repo) UpdatePublished() (bool, error) {
|
||||||
|
// empty out what was there before
|
||||||
|
repo.Published = nil
|
||||||
|
tmp := filepath.Join(repo.FullPath, "go.sum")
|
||||||
|
gosum, err := os.Open(tmp)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn("missing go.sum", repo.FullPath)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
defer gosum.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(gosum)
|
||||||
|
log.Info("gosum:", tmp)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := strings.TrimSpace(scanner.Text())
|
||||||
|
|
||||||
|
parts := strings.Split(line, " ")
|
||||||
|
if len(parts) == 3 {
|
||||||
|
godep := strings.TrimSpace(parts[0])
|
||||||
|
version := strings.TrimSpace(parts[1])
|
||||||
|
if strings.HasSuffix(version, "/go.mod") {
|
||||||
|
version = strings.TrimSuffix(version, "/go.mod")
|
||||||
|
}
|
||||||
|
new1 := GoDep{
|
||||||
|
GoPath: godep,
|
||||||
|
Version: version,
|
||||||
|
}
|
||||||
|
if repo.Published == nil {
|
||||||
|
repo.Published = new(GoDeps)
|
||||||
|
}
|
||||||
|
repo.Published.AppendUniqueGoPath(&new1)
|
||||||
|
} else {
|
||||||
|
return false, errors.New("go.sum parse error invalid: " + line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := scanner.Err(); err != nil {
|
||||||
|
repo.Published = nil
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
|
@ -3,10 +3,8 @@ package gitpb
|
||||||
// does processing on the go.mod and go.sum files
|
// does processing on the go.mod and go.sum files
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"go.wit.com/log"
|
"go.wit.com/log"
|
||||||
|
@ -60,50 +58,6 @@ func (repo *Repo) RedoGoMod() (bool, error) {
|
||||||
return false, errors.New("MakeRedomod() logic failed")
|
return false, errors.New("MakeRedomod() logic failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
// reads and parses the go.sum file
|
|
||||||
// does not change anything
|
|
||||||
func (repo *Repo) ParseGoSum() (bool, error) {
|
|
||||||
// empty out what was there before
|
|
||||||
repo.GoDeps = nil
|
|
||||||
tmp := filepath.Join(repo.FullPath, "go.sum")
|
|
||||||
gosum, err := os.Open(tmp)
|
|
||||||
if err != nil {
|
|
||||||
log.Warn("missing go.sum", repo.FullPath)
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
defer gosum.Close()
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(gosum)
|
|
||||||
log.Info("gosum:", tmp)
|
|
||||||
for scanner.Scan() {
|
|
||||||
line := strings.TrimSpace(scanner.Text())
|
|
||||||
|
|
||||||
parts := strings.Split(line, " ")
|
|
||||||
if len(parts) == 3 {
|
|
||||||
godep := strings.TrimSpace(parts[0])
|
|
||||||
version := strings.TrimSpace(parts[1])
|
|
||||||
if strings.HasSuffix(version, "/go.mod") {
|
|
||||||
version = strings.TrimSuffix(version, "/go.mod")
|
|
||||||
}
|
|
||||||
new1 := GoDep{
|
|
||||||
GoPath: godep,
|
|
||||||
Version: version,
|
|
||||||
}
|
|
||||||
if repo.GoDeps == nil {
|
|
||||||
repo.GoDeps = new(GoDeps)
|
|
||||||
}
|
|
||||||
repo.GoDeps.AppendUniqueGoPath(&new1)
|
|
||||||
} else {
|
|
||||||
return false, errors.New("go.sum parse error invalid: " + line)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
repo.GoDeps = nil
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
func (repo *Repo) RepoType() string {
|
func (repo *Repo) RepoType() string {
|
||||||
if repo == nil {
|
if repo == nil {
|
||||||
return "nil"
|
return "nil"
|
||||||
|
@ -139,50 +93,6 @@ func (repo *Repo) goListRepoType() string {
|
||||||
return output
|
return output
|
||||||
}
|
}
|
||||||
|
|
||||||
// reads and parses the go.sum file
|
|
||||||
func (repo *Repo) UpdatePublished() (bool, error) {
|
|
||||||
// empty out what was there before
|
|
||||||
repo.Published = nil
|
|
||||||
tmp := filepath.Join(repo.FullPath, "go.sum")
|
|
||||||
gosum, err := os.Open(tmp)
|
|
||||||
if err != nil {
|
|
||||||
log.Warn("missing go.sum", repo.FullPath)
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
defer gosum.Close()
|
|
||||||
|
|
||||||
scanner := bufio.NewScanner(gosum)
|
|
||||||
log.Info("gosum:", tmp)
|
|
||||||
for scanner.Scan() {
|
|
||||||
line := strings.TrimSpace(scanner.Text())
|
|
||||||
|
|
||||||
parts := strings.Split(line, " ")
|
|
||||||
if len(parts) == 3 {
|
|
||||||
godep := strings.TrimSpace(parts[0])
|
|
||||||
version := strings.TrimSpace(parts[1])
|
|
||||||
if strings.HasSuffix(version, "/go.mod") {
|
|
||||||
version = strings.TrimSuffix(version, "/go.mod")
|
|
||||||
}
|
|
||||||
new1 := GoDep{
|
|
||||||
GoPath: godep,
|
|
||||||
Version: version,
|
|
||||||
}
|
|
||||||
if repo.Published == nil {
|
|
||||||
repo.Published = new(GoDeps)
|
|
||||||
}
|
|
||||||
repo.Published.AppendUniqueGoPath(&new1)
|
|
||||||
} else {
|
|
||||||
return false, errors.New("go.sum parse error invalid: " + line)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := scanner.Err(); err != nil {
|
|
||||||
repo.Published = nil
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns true if the last published
|
// returns true if the last published
|
||||||
func (repo *Repo) GoDepsLen() int {
|
func (repo *Repo) GoDepsLen() int {
|
||||||
if repo.GoDeps == nil {
|
if repo.GoDeps == nil {
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
package gitpb
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.wit.com/lib/gui/shell"
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Patch struct {
|
||||||
|
GoPath string
|
||||||
|
Ref string
|
||||||
|
giturl string
|
||||||
|
comment string
|
||||||
|
}
|
||||||
|
|
||||||
|
// move all this to repolist and gowit repos
|
||||||
|
|
||||||
|
func (repo *Repo) GetPatches(oldname string, newname string) (int, []*Patch) {
|
||||||
|
var patchcount int
|
||||||
|
patches := make([]*Patch, 0, 0)
|
||||||
|
|
||||||
|
if oldname == newname {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
// log.Info("repo userv, develv", userv, develv)
|
||||||
|
gitcmd := []string{"git", "log", "--oneline", oldname + ".." + newname}
|
||||||
|
log.Info("Run:", gitcmd)
|
||||||
|
r := repo.Run(gitcmd)
|
||||||
|
if r.Error != nil {
|
||||||
|
log.Info("git failed ", repo.GetGoPath(), "err =", r.Error)
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// patches = strings.Split(output, "\n")
|
||||||
|
log.Info("Run:", r.Stdout)
|
||||||
|
for _, line := range r.Stdout {
|
||||||
|
line = strings.TrimSpace(line)
|
||||||
|
if line == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
parts := strings.Split(line, " ")
|
||||||
|
newp := new(Patch)
|
||||||
|
newp.Ref = parts[0]
|
||||||
|
newp.comment = strings.Join(parts[1:], " ")
|
||||||
|
log.Info("Patch line:", line, repo.GetGoPath())
|
||||||
|
patchcount += 1
|
||||||
|
patches = append(patches, newp)
|
||||||
|
}
|
||||||
|
return patchcount, patches
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) GetUserPatches() (int, []*Patch) {
|
||||||
|
usern := repo.GetUserBranchName()
|
||||||
|
develn := repo.GetDevelBranchName()
|
||||||
|
userv := repo.GetUserVersion()
|
||||||
|
develv := repo.GetDevelVersion()
|
||||||
|
|
||||||
|
if userv == develv {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
c, all := repo.GetPatches(develn, usern)
|
||||||
|
log.Info("GetPatches() guireleaser", develn, usern, "count =", c)
|
||||||
|
return c, all
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) GetMasterPatches() (int, []*Patch) {
|
||||||
|
lasttag := repo.GetLastTag()
|
||||||
|
mastern := repo.GetMasterBranchName()
|
||||||
|
masterv := repo.GetMasterVersion()
|
||||||
|
|
||||||
|
if lasttag == masterv {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
c, all := repo.GetPatches(lasttag, mastern)
|
||||||
|
log.Info("GetPatches() guireleaser", lasttag, mastern, "count =", c)
|
||||||
|
return c, all
|
||||||
|
}
|
||||||
|
|
||||||
|
func (all *Repos) MakePatchset(setdir string) bool {
|
||||||
|
loop := all.SortByGoPath()
|
||||||
|
for loop.Scan() {
|
||||||
|
repo := loop.Next()
|
||||||
|
log.Info("repo", repo.GetGoPath())
|
||||||
|
userv := repo.GetUserVersion()
|
||||||
|
develv := repo.GetDevelVersion()
|
||||||
|
usern := repo.GetUserBranchName()
|
||||||
|
develn := repo.GetDevelBranchName()
|
||||||
|
if userv == develv {
|
||||||
|
// this repo is unchanged
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
repodir := filepath.Join(setdir, repo.GetGoPath())
|
||||||
|
shell.Mkdir(repodir)
|
||||||
|
// git format-patch branch1..branch2
|
||||||
|
gitcmd := []string{"git", "format-patch", "-o", repodir, develn + ".." + usern}
|
||||||
|
log.Info("Run:", gitcmd)
|
||||||
|
r := repo.Run(gitcmd)
|
||||||
|
log.Info("output =", r.Stdout)
|
||||||
|
if r.Error == nil {
|
||||||
|
log.Info("patches made okay for:", repo.GetGoPath())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
log.Info("patches failed for:", repo.GetGoPath())
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
60
repo.new.go
60
repo.new.go
|
@ -1,11 +1,9 @@
|
||||||
package gitpb
|
package gitpb
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"go.wit.com/log"
|
"go.wit.com/log"
|
||||||
)
|
)
|
||||||
|
@ -15,16 +13,21 @@ import (
|
||||||
// TODO: try adding python, rails, perl, rust, other language things?
|
// TODO: try adding python, rails, perl, rust, other language things?
|
||||||
// I probably will never have time to try that, but I'd take patches for anyone
|
// I probably will never have time to try that, but I'd take patches for anyone
|
||||||
// that might see this note and feel so inclined.
|
// that might see this note and feel so inclined.
|
||||||
func (all *Repos) NewGoPath(basepath string, gopath string) (*Repo, error) {
|
func (all *Repos) NewGoPath(basepath string, gopath string, url string) (*Repo, error) {
|
||||||
|
if gopath == "" {
|
||||||
|
return nil, errors.New("blank gopath")
|
||||||
|
}
|
||||||
if r := all.FindByGoPath(gopath); r != nil {
|
if r := all.FindByGoPath(gopath); r != nil {
|
||||||
// already had this gopath
|
// already had this gopath
|
||||||
return r, nil
|
return nil, errors.New("duplicate gopath " + gopath)
|
||||||
}
|
}
|
||||||
|
log.Info("gitpb.NewGoPath() Attempting to add new path", basepath, gopath)
|
||||||
|
|
||||||
// if .git doesn't exist, error out here
|
// if .git doesn't exist, error out here
|
||||||
gitpath := filepath.Join(basepath, gopath, ".git")
|
gitpath := filepath.Join(basepath, gopath, ".git")
|
||||||
_, err := os.Stat(gitpath)
|
_, err := os.Stat(gitpath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Warn("gitpb.NewGoPath() not a git directory", gitpath)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +35,7 @@ func (all *Repos) NewGoPath(basepath string, gopath string) (*Repo, error) {
|
||||||
newr := Repo{
|
newr := Repo{
|
||||||
FullPath: filepath.Join(basepath, gopath),
|
FullPath: filepath.Join(basepath, gopath),
|
||||||
GoPath: gopath,
|
GoPath: gopath,
|
||||||
|
URL: url,
|
||||||
}
|
}
|
||||||
newr.Tags = new(GitTags)
|
newr.Tags = new(GitTags)
|
||||||
// newr.UpdateGit()
|
// newr.UpdateGit()
|
||||||
|
@ -40,53 +44,21 @@ func (all *Repos) NewGoPath(basepath string, gopath string) (*Repo, error) {
|
||||||
// newr.RedoGoMod()
|
// newr.RedoGoMod()
|
||||||
|
|
||||||
switch newr.goListRepoType() {
|
switch newr.goListRepoType() {
|
||||||
|
case "plugin":
|
||||||
|
newr.GoPlugin = true
|
||||||
|
case "protobuf":
|
||||||
|
newr.GoProtobuf = true
|
||||||
case "library":
|
case "library":
|
||||||
newr.GoLibrary = true
|
newr.GoLibrary = true
|
||||||
case "binary":
|
case "binary":
|
||||||
newr.GoBinary = true
|
newr.GoBinary = true
|
||||||
}
|
}
|
||||||
|
|
||||||
all.AppendUniqueGoPath(&newr)
|
if all.AppendUniqueGoPath(&newr) {
|
||||||
return &newr, nil
|
// worked
|
||||||
}
|
return &newr, nil
|
||||||
|
|
||||||
// Detect a 'Primative' package. Sets the isPrimative flag
|
|
||||||
// will return true if the repo is truly not dependent on _anything_ else
|
|
||||||
// like spew or lib/widget
|
|
||||||
// it assumes go mod ran init and tidy ran without error
|
|
||||||
func (repo *Repo) isPrimativeGoMod() (bool, error) {
|
|
||||||
// go mod init & go mod tidy ran without errors
|
|
||||||
log.Log(GITPB, "isPrimativeGoMod()", repo.FullPath)
|
|
||||||
tmp := filepath.Join(repo.FullPath, "go.mod")
|
|
||||||
gomod, err := os.Open(tmp)
|
|
||||||
if err != nil {
|
|
||||||
log.Log(GITPB, "missing go.mod", repo.FullPath)
|
|
||||||
repo.GoDeps = nil
|
|
||||||
return false, err
|
|
||||||
}
|
}
|
||||||
defer gomod.Close()
|
return nil, errors.New("repo already exists: " + gopath)
|
||||||
|
|
||||||
scanner := bufio.NewScanner(gomod)
|
|
||||||
for scanner.Scan() {
|
|
||||||
line := strings.TrimSpace(scanner.Text())
|
|
||||||
|
|
||||||
parts := strings.Split(line, " ")
|
|
||||||
log.Log(GITPB, " gomod:", parts)
|
|
||||||
if len(parts) >= 1 {
|
|
||||||
log.Log(GITPB, " gomod: part[0] =", parts[0])
|
|
||||||
if parts[0] == "require" {
|
|
||||||
log.Log(GITPB, " should return false here")
|
|
||||||
return false, errors.New("go.mod file is not primative")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
repo.GoPrimitive = true
|
|
||||||
return true, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *Repo) SetMasterBranchName(bname string) {
|
|
||||||
repo.MasterBranchName = bname
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *Repo) SetDevelBranchName(bname string) {
|
func (repo *Repo) SetDevelBranchName(bname string) {
|
||||||
|
|
35
repo.proto
35
repo.proto
|
@ -12,22 +12,25 @@ import "google/protobuf/timestamp.proto"; // Import the well-known type for Time
|
||||||
// global settings for autogenpb `autogenpb:mutex`
|
// global settings for autogenpb `autogenpb:mutex`
|
||||||
|
|
||||||
message Repo { // `autogenpb:marshal`
|
message Repo { // `autogenpb:marshal`
|
||||||
string fullPath = 1; // the actual path to the .git directory: '/home/devel/golang.org/x/tools'
|
string fullPath = 1; // the actual path to the .git directory: '/home/devel/golang.org/x/tools'
|
||||||
google.protobuf.Timestamp lastPull = 2; // last time a git pull was done
|
google.protobuf.Timestamp lastPull = 2; // last time a git pull was done
|
||||||
string masterBranchName = 3; // git 'main' or 'master' branch name
|
string masterBranchName = 3; // git 'main' or 'master' branch name
|
||||||
string develBranchName = 4; // whatever the git 'devel' branch name is
|
string develBranchName = 4; // whatever the git 'devel' branch name is
|
||||||
string userBranchName = 5; // whatever your username branch is
|
string userBranchName = 5; // whatever your username branch is
|
||||||
GitTags tags = 6; // known tags
|
GitTags tags = 6; // known tags
|
||||||
string goPath = 7; // `autogenpb:unique` // the logical path as used by golang: 'go.wit.com/apps/helloworld'
|
string goPath = 7; // `autogenpb:unique` // the logical path as used by golang: 'go.wit.com/apps/helloworld'
|
||||||
bool goLibrary = 8; // is this a golang library?
|
bool goLibrary = 8; // is this a golang library?
|
||||||
bool goBinary = 9; // is this a golang binary?
|
bool goBinary = 9; // is this a golang binary?
|
||||||
bool goPrimitive = 10; // if this is a golang primitive (only has go.mod)
|
bool goPrimitive = 10; // if this is a golang primitive (only has go.mod)
|
||||||
bool goPlugin = 11; // is this a golang plugin?
|
bool goPlugin = 11; // is this a golang plugin?
|
||||||
GoDeps goDeps = 12; // what is in the go.sum file
|
GoDeps goDeps = 12; // what is in the go.sum file
|
||||||
google.protobuf.Timestamp lastGoDep = 13; // last time go.sum was processed
|
google.protobuf.Timestamp lastGoDep = 13; // last time go.sum was processed
|
||||||
bool dirty = 14; // if git says things have been changed
|
bool dirty = 14; // if git says things have been changed
|
||||||
GoDeps published = 15; // the last published go.mod/go.sum
|
GoDeps published = 15; // the last published go.mod/go.sum
|
||||||
string targetVersion = 16; // useful during the package release process
|
string targetVersion = 16; // useful during the package release process
|
||||||
|
bool readOnly = 17; // tracks access to 'git push'
|
||||||
|
string URL = 18; // the URL. amazingly I didn't add this earlier. duh.
|
||||||
|
bool goProtobuf = 19; // autogen go files from .proto
|
||||||
}
|
}
|
||||||
|
|
||||||
message Repos { // `autogenpb:marshal`
|
message Repos { // `autogenpb:marshal`
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
package gitpb
|
||||||
|
|
||||||
|
// runs git, parses output
|
||||||
|
// types faster than you can
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (all *GitTags) SortByAge() *GitTagIterator {
|
||||||
|
packs := all.selectAllGitTag()
|
||||||
|
|
||||||
|
sort.Sort(GitTagAge(packs))
|
||||||
|
|
||||||
|
iterator := NewGitTagIterator(packs)
|
||||||
|
return iterator
|
||||||
|
}
|
||||||
|
|
||||||
|
type GitTagAge []*GitTag
|
||||||
|
|
||||||
|
func (a GitTagAge) Len() int { return len(a) }
|
||||||
|
|
||||||
|
// sorts in ? order
|
||||||
|
func (a GitTagAge) Less(i, j int) bool {
|
||||||
|
if time.Since(a[i].Authordate.AsTime()) < time.Since(a[j].Authordate.AsTime()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
func (a GitTagAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||||||
|
|
||||||
|
// rill is awesome. long live rill
|
||||||
|
// attempt scan with rill
|
||||||
|
func (all *Repos) rillGitPull() error {
|
||||||
|
loop := all.SortByGoPath()
|
||||||
|
for loop.Scan() {
|
||||||
|
t := loop.Next()
|
||||||
|
log.Info("repo", t.GoPath)
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
packs := all.selectAllRepo()
|
||||||
|
// Convert a slice of user IDs into a channel
|
||||||
|
ids := rill.FromSlice(packs, nil)
|
||||||
|
|
||||||
|
// Read users from the API.
|
||||||
|
// Concurrency = 20
|
||||||
|
dirs := rill.Map(ids, 20, func(id string) (*Repo, error) {
|
||||||
|
return packs[id], nil
|
||||||
|
})
|
||||||
|
|
||||||
|
// Activate users.
|
||||||
|
// Concurrency = 10
|
||||||
|
err := rill.ForEach(dirs, 10, func(repo *Repo) error {
|
||||||
|
// could do something here
|
||||||
|
// fmt.Printf("Repo found : %s\n", repo.GoPath)
|
||||||
|
// repo.Run([]string{"git", "pull"})
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
*/
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var ErrorMissingGitConfig error = errors.New("missing .git/config")
|
||||||
|
var ErrorGitPullOnLocal error = errors.New("git pull on local only branch")
|
||||||
|
|
||||||
|
// checks to see if you can do a 'git pull'
|
||||||
|
func (repo *Repo) IsOnlyLocalTag(currentName string) bool {
|
||||||
|
log.Warn("IsOnlyLocalTag(currentName string) not re-implemented yet")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (repo *Repo) GitPull() (string, error) {
|
||||||
|
currentName := repo.GetCurrentBranchName()
|
||||||
|
if repo.IsOnlyLocalTag(currentName) {
|
||||||
|
return "", ErrorGitPullOnLocal
|
||||||
|
}
|
||||||
|
var cmd []string
|
||||||
|
cmd = append(cmd, "git", "pull")
|
||||||
|
r := repo.Run(cmd)
|
||||||
|
output := strings.Join(r.Stdout, "\n")
|
||||||
|
if r.Error != nil {
|
||||||
|
output = "git error_,,,_a_,,,_b_,,,c"
|
||||||
|
}
|
||||||
|
if r.Error == nil {
|
||||||
|
log.Log(GITPBWARN, "git pull ran", repo.GetGoPath())
|
||||||
|
log.Log(GITPBWARN, "git pull output", output)
|
||||||
|
} else {
|
||||||
|
log.Log(GITPBWARN, "git pull error", repo.GetGoPath(), r.Error)
|
||||||
|
}
|
||||||
|
return output, r.Error
|
||||||
|
}
|
Loading…
Reference in New Issue