Compare commits

..

9 Commits

Author SHA1 Message Date
Jeff Carr 2232aa5823 minor 2025-09-23 14:51:09 -05:00
Jeff Carr 8e3008cfe8 remove noise 2025-09-23 14:22:18 -05:00
Jeff Carr 884d8db585 tinkering with set.PrintTable() 2025-09-23 10:17:36 -05:00
Jeff Carr 4eada310b8 make a standard set.PrintTable() 2025-09-23 09:36:15 -05:00
Jeff Carr 643be0abea set PB tables are working 2025-09-23 09:02:19 -05:00
Jeff Carr 81fc15e743 less confusing patch .proto files 2025-09-23 07:44:07 -05:00
Jeff Carr 6bfd8c78ab save config if Username not set 2025-09-22 21:08:29 -05:00
Jeff Carr 060c304a43 forgot to set Username on init() 2025-09-22 21:07:32 -05:00
Jeff Carr 6890e68af3 output on failure 2025-09-22 20:32:34 -05:00
13 changed files with 297 additions and 171 deletions

View File

@ -5,7 +5,7 @@
# go install # go install
all: forgeConfig.pb.go patchset.pb.go goimports vet all: forgeConfig.pb.go patch.pb.go set.pb.go goimports vet
generate: clean generate: clean
autogenpb --proto patchset.proto autogenpb --proto patchset.proto
@ -27,8 +27,14 @@ clean:
forgeConfig.pb.go: forgeConfig.proto forgeConfig.pb.go: forgeConfig.proto
autogenpb --proto forgeConfig.proto autogenpb --proto forgeConfig.proto
patchset.pb.go: patchset.proto # patchset.pb.go: patchset.proto
autogenpb --proto patchset.proto # autogenpb --proto patchset.proto
patch.pb.go: patch.proto
autogenpb --proto patch.proto
set.pb.go: set.proto
autogenpb --proto set.proto
protoc-test: protoc-test:
cd ~/go/src && protoc \ cd ~/go/src && protoc \

View File

@ -72,12 +72,6 @@ func (cfg *ForgeConfigs) DumpENV() {
} }
/* /*
if f.Config.Username == "" {
usr, _ := user.Current()
f.Config.Username = usr.Username
f.SetConfigSave(true)
}
if f.Config.Xterm == "" { if f.Config.Xterm == "" {
f.Config.Xterm = "xterm" f.Config.Xterm = "xterm"
f.Config.XtermArgv = append(f.Config.XtermArgv, "-bg") f.Config.XtermArgv = append(f.Config.XtermArgv, "-bg")

View File

@ -246,7 +246,7 @@ func (f *Forge) printForgedToTable(repo *gitpb.Repo, sizes []int) {
log.Info(cobol.TerminalChomp(start + " " + end)) log.Info(cobol.TerminalChomp(start + " " + end))
} }
func (psets *Patchsets) PrintTable() { func (psets *Sets) PrintTable() {
if psets == nil { if psets == nil {
return return
} }
@ -257,29 +257,31 @@ func (psets *Patchsets) PrintTable() {
sizes := []int{12, 12, 3, 3, 40, 80, 2, 2, 2, 2} sizes := []int{12, 12, 3, 3, 40, 80, 2, 2, 2, 2}
log.Info(cobol.TerminalChomp(cobol.StandardTableSize10(sizes, args))) log.Info(cobol.TerminalChomp(cobol.StandardTableSize10(sizes, args)))
var countCONTENTS int /*
var countPARTS int var countCONTENTS int
for x, pset := range psets.GetPatchsets() { var countPARTS int
log.Info(pset.Uuid, pset.Name, pset.State) for x, pset := range psets.GetSets() {
if pset.State == "DONE" { log.Info(pset.Patches.Uuid, pset.Patches.Name, pset.Patches.State)
// old patchset if pset.State == "DONE" {
continue // old patchset
} continue
cId := log.Sprintf("%d", x) }
countCONTENTS += 1 cId := log.Sprintf("%d", x)
for i, p := range pset.Patches.GetPatches() { countCONTENTS += 1
var args []string for i, p := range pset.Patches.GetPatches() {
partId := log.Sprintf("%d", i) var args []string
partId := log.Sprintf("%d", i)
_, fname := filepath.Split(p.GetFilename()) _, fname := filepath.Split(p.GetFilename())
args = []string{p.CommitHash, p.NewHash, cId, partId, fname, p.GetNamespace(), "", "", "", "", ""} args = []string{p.CommitHash, p.NewHash, cId, partId, fname, p.GetNamespace(), "", "", "", "", ""}
start := cobol.StandardTableSize10(sizes, args) start := cobol.StandardTableSize10(sizes, args)
log.Info(cobol.TerminalChomp(start)) log.Info(cobol.TerminalChomp(start))
countPARTS += 1 countPARTS += 1
} }
} }
log.Infof("Total Contents (%d) Parts (%d)\n", countCONTENTS, countPARTS) log.Infof("Total Contents (%d) Parts (%d)\n", countCONTENTS, countPARTS)
*/
} }
func (patches *Patches) PrintTable() { func (patches *Patches) PrintTable() {
@ -293,17 +295,19 @@ func (patches *Patches) PrintTable() {
sizes := []int{12, 12, 3, 3, 40, 80, 2, 2, 2, 2} sizes := []int{12, 12, 3, 3, 40, 80, 2, 2, 2, 2}
log.Info(cobol.TerminalChomp(cobol.StandardTableSize10(sizes, args))) log.Info(cobol.TerminalChomp(cobol.StandardTableSize10(sizes, args)))
var countPARTS int /*
for x, p := range patches.GetPatches() { var countPARTS int
var args []string for x, p := range patches.GetPatches() {
partId := log.Sprintf("%d", x) var args []string
partId := log.Sprintf("%d", x)
_, fname := filepath.Split(p.GetFilename()) _, fname := filepath.Split(p.GetFilename())
args = []string{p.CommitHash, p.NewHash, partId, fname, p.GetNamespace(), "", "", "", "", ""} args = []string{p.CommitHash, p.NewHash, partId, fname, p.GetNamespace(), "", "", "", "", ""}
start := cobol.StandardTableSize10(sizes, args) start := cobol.StandardTableSize10(sizes, args)
log.Info(cobol.TerminalChomp(start)) log.Info(cobol.TerminalChomp(start))
countPARTS += 1 countPARTS += 1
} }
log.Infof("Total Patches (%d)\n", countPARTS) log.Infof("Total Patches (%d)\n", countPARTS)
*/
} }

View File

@ -4,6 +4,7 @@ package forgepb
import ( import (
"os" "os"
"os/user"
"path/filepath" "path/filepath"
"go.wit.com/lib/config" "go.wit.com/lib/config"
@ -40,6 +41,11 @@ func Init() *Forge {
f.Config.DumpENV() f.Config.DumpENV()
return f return f
} }
if f.Config.Username == "" {
usr, _ := user.Current()
f.Config.Username = usr.Username
f.Config.ConfigSave()
}
f.initFromConfig() f.initFromConfig()
if f.Config.Mode == ForgeMode_MASTER { if f.Config.Mode == ForgeMode_MASTER {
log.Printf("forge.Init() %s len()=%d\n", f.Config.Filename, f.Repos.Len()) log.Printf("forge.Init() %s len()=%d\n", f.Config.Filename, f.Repos.Len())
@ -86,7 +92,7 @@ func (f *Forge) initFromConfig() {
f.Repos.ConfigLoad(f.Config.ReposPB) f.Repos.ConfigLoad(f.Config.ReposPB)
// init the Patchsets // init the Patchsets
f.Patchsets = NewPatchsets() f.Patchsets = NewSets()
// todo: play with these / determine good values based on user's machine // todo: play with these / determine good values based on user's machine
if f.Config.RillX == 0 { if f.Config.RillX == 0 {

69
patch.proto Normal file
View File

@ -0,0 +1,69 @@
// Copyright 2025 WIT.COM Inc Licensed GPL 3.0
syntax = "proto3";
package forgepb;
import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp
// Forge doesn't need this kind of specificity
// but this is what the patch files contain and how git sees them
// message Blob {
// string hunkLine = 1;
// bytes data = 2;
// }
//
// message File {
// string filename = 1;
// string hashLine = 2;
// repeated Blob Blobs = 3;
// }
//
// message Patch {
// repeated File Files = 1;
// string repoNamespace = 2;
// string gH = 3;
// string gaI = 4;
// string gcI = 5;
// }
// git log -1 --format="%H %aI %cI %an %ae %cn %ce"
message Patch {
string namespace = 1; // the base repo git namespace
bytes data = 2; // the raw data of the whole patch
string gH = 3; // Commit Hash (%H)
string gT = 4; // Tree Hash (%T)
string gP = 5; // Parent Hashes (%P)
string gs = 6; // Subject (%s)
string gaI = 7; // Author Date, ISO 8601 format (%aI)
string gan = 8; // Author Name (%an)
string gae = 9; // Author Email (%ae)
string gcI = 10; // Committer Date, ISO 8601 format (%cI)
string gcn = 11; // Committer Name (%cn)
string gce = 12; // Committer Email (%ce)
string gN = 13; // Commit Notes (%N)
string gGG = 14; // GPG Signature, raw (%GG)
string gGS = 15; // GPG Signer Name (%GS)
string gGK = 16; // GPG Key ID (%GK)
string newHash = 17; // new hash
string state = 18; // the 'state' of the patch
string filename = 19; // `autogenpb:unique` `autogenpb:sort`
string startHash = 20; // the start commit hash
string commitHash = 21; // the git commit hash of this patch `autogenpb:sort` `autogenpb:unique`
string comment = 22; // the git commit message (in patch form)
repeated string Files = 23; // the filenames this patch changes
google.protobuf.Timestamp ctime = 24; // create time of the patch
bool applied = 25; // have you applied this patch?
bool upstream = 26; // has this patch been applied upstream?
string patchId = 27; // patchId `autogenpb:unique`
string treeHash = 28; // final tree Hash
}
// this is a "PATCH: [1/x]" series
message Patches { // `autogenpb:marshal` `autogenpb:gui:Patch` `autogenpb:http`
string uuid = 1; // `autogenpb:uuid:2679065e-c81d-4a00-aca4-03c158a834fb`
string version = 2; // `autogenpb:version:v2.0.0`
repeated Patch patches = 3;
string Error = 4; // when passing these around, if there is an error, store it here
}

View File

@ -11,6 +11,7 @@ import (
"time" "time"
"github.com/google/uuid" "github.com/google/uuid"
"go.wit.com/lib/hostname"
"go.wit.com/lib/protobuf/gitpb" "go.wit.com/lib/protobuf/gitpb"
"go.wit.com/lib/protobuf/httppb" "go.wit.com/lib/protobuf/httppb"
"go.wit.com/log" "go.wit.com/log"
@ -22,24 +23,30 @@ func (p *Patches) HttpPostVerbose(baseURL string, route string) (*Patches, *http
return p.HttpPost(baseURL, route) return p.HttpPost(baseURL, route)
} }
func (p *Patchsets) HttpPostVerbose(baseURL string, route string) (*Patchsets, *httppb.HttpRequest, error) { func (p *Set) HttpPostVerbose(baseURL string, route string) (*Set, *httppb.HttpRequest, error) {
p.PrintTable() p.PrintTable()
return p.HttpPost(baseURL, route) return p.HttpPost(baseURL, route)
} }
func newPatchset(name string) *Patchset { func (p *Sets) HttpPostVerbose(baseURL string, route string) (*Sets, *httppb.HttpRequest, error) {
pset := new(Patchset) p.PrintTable()
return p.HttpPost(baseURL, route)
}
func newPatchset(name string) *Set {
pset := new(Set)
pset.Name = name pset.Name = name
pset.Ctime = timestamppb.New(time.Now()) pset.Ctime = timestamppb.New(time.Now())
pset.Uuid = uuid.New().String() pset.Uuid = uuid.New().String()
pset.Hostname, _ = os.Hostname() pset.Hostname, _ = hostname.Get()
pset.Patches = NewPatches()
return pset return pset
} }
// creates a patchset // creates a patchset
// works from the user branches against the devel branches // works from the user branches against the devel branches
func (f *Forge) MakeDevelPatchSet(name string) (*Patchset, error) { func (f *Forge) MakeDevelPatchSet(name string) (*Set, error) {
pset := newPatchset(name) pset := newPatchset(name)
if os.Getenv("GIT_AUTHOR_NAME") == "" { if os.Getenv("GIT_AUTHOR_NAME") == "" {
return nil, fmt.Errorf("GIT_AUTHOR_NAME not set") return nil, fmt.Errorf("GIT_AUTHOR_NAME not set")
@ -56,7 +63,7 @@ func (f *Forge) MakeDevelPatchSet(name string) (*Patchset, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer os.RemoveAll(dir) // clean up // defer os.RemoveAll(dir) // clean up
pset.TmpDir = dir pset.TmpDir = dir
all := f.Repos.SortByFullPath() all := f.Repos.SortByFullPath()
@ -72,6 +79,10 @@ func (f *Forge) MakeDevelPatchSet(name string) (*Patchset, error) {
continue continue
} }
if repo.ActualGetDevelHash() == repo.ActualGetUserHash() {
continue
}
// make a patchset from user to devel // make a patchset from user to devel
// TODO: verify branches are otherwise exact // TODO: verify branches are otherwise exact
pset.StartBranchName = repo.GetDevelBranchName() pset.StartBranchName = repo.GetDevelBranchName()
@ -85,7 +96,7 @@ func (f *Forge) MakeDevelPatchSet(name string) (*Patchset, error) {
return pset, nil return pset, nil
} }
func (pset *Patchset) makePatchSetNew(repo *gitpb.Repo) error { func (pset *Set) makePatchSetNew(repo *gitpb.Repo) error {
startBranch := pset.StartBranchName startBranch := pset.StartBranchName
endBranch := pset.EndBranchName endBranch := pset.EndBranchName
repoDir := filepath.Join(pset.TmpDir, repo.GetGoPath()) repoDir := filepath.Join(pset.TmpDir, repo.GetGoPath())
@ -122,24 +133,23 @@ func (pset *Patchset) makePatchSetNew(repo *gitpb.Repo) error {
return errors.New(fmt.Sprintf("git returned %d", r.Exit)) return errors.New(fmt.Sprintf("git returned %d", r.Exit))
} }
if len(r.Stdout) == 0 { if len(r.Stdout) == 0 {
log.Infof("No patches in %s (%s,%s)\n", repo.FullPath, repo.ActualGetDevelHash(), repo.ActualGetUserHash())
// git created no files to add // git created no files to add
return nil return nil
} }
err = pset.addPatchFiles(repo) err = pset.addPatchFiles(repo, repoDir)
pset.Ctime = timestamppb.New(time.Now()) log.Infof("Added %d patches for %s len=%d\n", len(r.Stdout), repo.FullPath, pset.Patches.Len())
// pset.PrintTable()
return err return err
} }
// git show <original_commit_hash> | git patch-id // git show <original_commit_hash> | git patch-id
// git cat-file -p <commit_hash> | grep tree // git cat-file -p <commit_hash> | grep tree
// process each file in pDir/ // process each file in pDir/
func (p *Patchset) addPatchFiles(repo *gitpb.Repo) error { func (p *Set) addPatchFiles(repo *gitpb.Repo, fullDir string) error {
psetDir := repo.GetGoPath()
tmpDir := p.TmpDir
// log.Info("ADD PATCH FILES ADDED DIR", tmpDir)
fullDir := filepath.Join(tmpDir, psetDir)
var baderr error var baderr error
// log.Info("ADD PATCH FILES ADDED DIR", fullDir)
filepath.Walk(fullDir, func(path string, info os.FileInfo, err error) error { filepath.Walk(fullDir, func(path string, info os.FileInfo, err error) error {
if err != nil { if err != nil {
// Handle possible errors, like permission issues // Handle possible errors, like permission issues
@ -161,19 +171,21 @@ func (p *Patchset) addPatchFiles(repo *gitpb.Repo) error {
patch.Filename, _ = filepath.Rel(p.TmpDir, path) patch.Filename, _ = filepath.Rel(p.TmpDir, path)
patch.Data = data patch.Data = data
if err := patch.parseData(); err != nil { if err := patch.parseData(); err != nil {
log.Info("parseData() failed", err)
return err return err
} }
if err := findPatchId(repo, patch); err != nil { if err := findPatchId(repo, patch); err != nil {
log.Info("findPatchId() failed", err)
return err return err
} }
patch.StartHash = repo.ActualDevelHash() patch.StartHash = repo.ActualDevelHash()
patch.NewHash = "na" patch.NewHash = "na"
patch.Namespace = repo.GetGoPath() patch.Namespace = repo.GetGoPath()
if p.Patches == nil { if p.Patches == nil {
log.Info("SHOULD NOT HAVE HAPPENED. p.Patches == nil")
p.Patches = new(Patches) p.Patches = new(Patches)
} }
p.Patches.Append(patch) p.Patches.Append(patch)
p.Patches.Uuid = uuid.New().String()
// log.Info("ADDED PATCH FILE", path) // log.Info("ADDED PATCH FILE", path)
return nil return nil
}) })
@ -272,10 +284,11 @@ func findPatchId(repo *gitpb.Repo, p *Patch) error {
return fmt.Errorf("git-patch-id produced empty output") return fmt.Errorf("git-patch-id produced empty output")
} }
if fields[0] != p.CommitHash { if fields[1] != p.CommitHash {
return fmt.Errorf("patchid did not match %s != %v", p.CommitHash, fields) return fmt.Errorf("patchid did not match %s != %v", p.CommitHash, fields)
} }
p.PatchId = fields[1] // log.Infof("hash=%s patchid(%v) %s\n", p.CommitHash, fields, p.Filename)
p.PatchId = fields[0]
return nil return nil
} }

View File

@ -14,7 +14,7 @@ import (
) )
func (f *Forge) LoadPatchsets() error { func (f *Forge) LoadPatchsets() error {
f.Patchsets = NewPatchsets() f.Patchsets = NewSets()
filename := filepath.Join(f.Config.PatchDir, "all-patches.pb") filename := filepath.Join(f.Config.PatchDir, "all-patches.pb")
@ -39,7 +39,7 @@ func (f *Forge) InitPatchsets() error {
log.Info("LoadPatchsets() failed", err) log.Info("LoadPatchsets() failed", err)
} }
// TODO: check if Unmarshal failed here // TODO: check if Unmarshal failed here
f.Patchsets = NewPatchsets() f.Patchsets = NewSets()
f.findAutoPatchset() // adds the default values f.findAutoPatchset() // adds the default values
return f.SavePatchsets() return f.SavePatchsets()
} }
@ -54,7 +54,7 @@ func (f *Forge) SavePatchsets() error {
} }
defer regfile.Close() defer regfile.Close()
newpb := proto.Clone(f.Patchsets).(*Patchsets) newpb := proto.Clone(f.Patchsets).(*Sets)
if newpb == nil { if newpb == nil {
for pset := range f.Patchsets.IterAll() { for pset := range f.Patchsets.IterAll() {
pset.ShowPatchsets() pset.ShowPatchsets()
@ -79,7 +79,7 @@ func cleanSubject(line string) string {
return strings.TrimSpace(cleaned) return strings.TrimSpace(cleaned)
} }
func (pb *Patchset) ShowPatchsets() error { func (pb *Set) ShowPatchsets() error {
author := "Author: " + pb.GitAuthorName author := "Author: " + pb.GitAuthorName
author += " <" + pb.GitAuthorEmail + ">" author += " <" + pb.GitAuthorEmail + ">"
log.Printf("%-16s %s %s %s\n", string(pb.Uuid)[0:8], pb.Name, pb.Comment, author) log.Printf("%-16s %s %s %s\n", string(pb.Uuid)[0:8], pb.Name, pb.Comment, author)
@ -109,7 +109,7 @@ func (f *Forge) AddPatch(patch *Patch) bool {
} }
// adds a patchset or just the patches // adds a patchset or just the patches
func (f *Forge) AddPatchset(pb *Patchset) bool { func (f *Forge) AddPatchset(pb *Set) bool {
var changed bool var changed bool
// if the name of the patchset is "forge auto commit" // if the name of the patchset is "forge auto commit"
// then just add all the patches // then just add all the patches
@ -146,23 +146,18 @@ func (f *Forge) AddPatchset(pb *Patchset) bool {
} }
} }
// Clone() this protobuf into me.forge.Patchsets f.Patchsets.Append(pb)
var newpb *Patchset
newpb = proto.Clone(pb).(*Patchset)
if newpb != nil {
f.Patchsets.Patchsets = append(f.Patchsets.Patchsets, newpb)
}
return true return true
} }
func (f *Forge) findAutoPatchset() *Patchset { func (f *Forge) findAutoPatchset() *Set {
for pset := range f.Patchsets.IterAll() { for pset := range f.Patchsets.IterAll() {
if pset.Name == "forge auto commit" { if pset.Name == "forge auto commit" {
return pset return pset
} }
} }
var fauto *Patchset var fauto *Set
log.Warn("findAutoPatchset() had to create 'forge auto commit'") log.Warn("findAutoPatchset() had to create 'forge auto commit'")
if fauto == nil { if fauto == nil {
fauto = makeDefaultPatchset() fauto = makeDefaultPatchset()
@ -171,8 +166,8 @@ func (f *Forge) findAutoPatchset() *Patchset {
return fauto return fauto
} }
func makeDefaultPatchset() *Patchset { func makeDefaultPatchset() *Set {
fauto := new(Patchset) fauto := new(Set)
fauto.Name = "forge auto commit" fauto.Name = "forge auto commit"
fauto.Patches = NewPatches() fauto.Patches = NewPatches()
fauto.Uuid = uuid.New().String() fauto.Uuid = uuid.New().String()

View File

@ -1,9 +1,11 @@
package forgepb package forgepb
/*
// makes a new patches protobuf. These are all the patches on your machine. // makes a new patches protobuf. These are all the patches on your machine.
func NewPatches() *Patches { func NewPatches() *Patchs {
x := new(Patches) x := new(Patchs)
x.Uuid = "2679065e-c81d-4a00-aca4-03c158a834fb" x.Uuid = "2679065e-c81d-4a00-aca4-03c158a834fb"
x.Version = "v2.0.0 go.wit.com/lib/protobuf/forgepb" x.Version = "v2.0.0 go.wit.com/lib/protobuf/forgepb"
return x return x
} }
*/

View File

@ -1,92 +0,0 @@
// Copyright 2025 WIT.COM Inc Licensed GPL 3.0
syntax = "proto3";
package forgepb;
import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp
// Forge doesn't need this kind of specificity
// but this is what the patch files contain and how git sees them
// message Blob {
// string hunkLine = 1;
// bytes data = 2;
// }
//
// message File {
// string filename = 1;
// string hashLine = 2;
// repeated Blob Blobs = 3;
// }
//
// message Patch {
// repeated File Files = 1;
// string repoNamespace = 2;
// string gH = 3;
// string gaI = 4;
// string gcI = 5;
// }
// git log -1 --format="%H %aI %cI %an %ae %cn %ce"
message Patch {
string namespace = 1; // the base repo git namespace
bytes data = 2; // the raw data of the whole patch
string gH = 3; // Commit Hash (%H)
string gT = 4; // Tree Hash (%T)
string gP = 5; // Parent Hashes (%P)
string gs = 6; // Subject (%s)
string gaI = 7; // Author Date, ISO 8601 format (%aI)
string gan = 8; // Author Name (%an)
string gae = 9; // Author Email (%ae)
string gcI = 10; // Committer Date, ISO 8601 format (%cI)
string gcn = 11; // Committer Name (%cn)
string gce = 12; // Committer Email (%ce)
string gN = 13; // Commit Notes (%N)
string gGG = 14; // GPG Signature, raw (%GG)
string gGS = 15; // GPG Signer Name (%GS)
string gGK = 16; // GPG Key ID (%GK)
string newHash = 17; // new hash
string state = 18; // the 'state' of the patch
string filename = 19; // `autogenpb:unique` `autogenpb:sort`
string startHash = 20; // the start commit hash
string commitHash = 21; // the git commit hash of this patch `autogenpb:sort` `autogenpb:unique`
string comment = 22; // the git commit message (in patch form)
repeated string Files = 23; // the filenames this patch changes
google.protobuf.Timestamp ctime = 24; // create time of the patch
bool applied = 25; // have you applied this patch?
bool upstream = 26; // has this patch been applied upstream?
string patchId = 27; // patchId
string treeHash = 28; // final tree Hash
}
// this is a "PATCH: [1/x]" series
message Patches { // `autogenpb:marshal` `autogenpb:gui:Patch` `autogenpb:http`
string uuid = 1; // `autogenpb:uuid:2679065e-c81d-4a00-aca4-03c158a834fb`
string version = 2; // `autogenpb:version:v2.0.0`
repeated Patch Patches = 3;
string Error = 5; // when passing these around, if there is an error, store it here
}
message Patchset { // `autogenpb:marshal`
Patches patches = 1; //
string name = 2; // `autogenpb:sort`
string comment = 3; //
string gitAuthorName = 4; // `autogenpb:sort`
string gitAuthorEmail = 5; //
google.protobuf.Timestamp ctime = 6; // create time of the patchset
string tmpDir = 7; // temp dir
string startBranchName = 8; //
string endBranchName = 9; //
string startBranchHash = 10; //
string endBranchHash = 11; //
string state = 12; // the state of the patch
string uuid = 13; // `autogenpb:sort` `autogenpb:unique`
string hostname = 14; //
}
message Patchsets { // `autogenpb:marshal` `autogenpb:gui` `autogenpb:nomutex` `autogenpb:http`
string uuid = 1; // `autogenpb:uuid:be926ad9-f07f-484c-adf2-d96eeabf3079`
string version = 2; // `autogenpb:version:v0.0.45`
repeated Patchset Patchsets = 3;
}

View File

@ -164,6 +164,9 @@ func (f *Forge) VerifyBranchNames(repo *gitpb.Repo) {
if repo.GetUserBranchName() == "" { if repo.GetUserBranchName() == "" {
uname := f.configUserBranchName(repo) uname := f.configUserBranchName(repo)
if uname == "" {
log.Info("configUserBranchName() ERROR: failed with blank")
}
if repo.IsBranch(uname) { if repo.IsBranch(uname) {
repo.SetUserBranchName(uname) repo.SetUserBranchName(uname)
} else { } else {
@ -171,7 +174,9 @@ func (f *Forge) VerifyBranchNames(repo *gitpb.Repo) {
repo.SetUserBranchName(uname) repo.SetUserBranchName(uname)
} }
} }
// log.Info("VerifyBranchNames", repo.GetMasterBranchName(), repo.GetDevelBranchName(), repo.GetUserBranchName()) if repo.GetUserBranchName() == "" || repo.GetDevelBranchName() == "" {
log.Infof("VerifyBranchNames() failed m=%s d=%s u=%s\n", repo.GetMasterBranchName(), repo.GetDevelBranchName(), repo.GetUserBranchName())
}
} }
// what name should be used for the user branch? // what name should be used for the user branch?
@ -187,6 +192,9 @@ func (f *Forge) configUserBranchName(repo *gitpb.Repo) string {
if uname != "" { if uname != "" {
return uname return uname
} }
if f.Config.Username == "" {
// something is wrong!
}
// use the os.Username // use the os.Username
uname = f.Config.Username uname = f.Config.Username

32
set.proto Normal file
View File

@ -0,0 +1,32 @@
// Copyright 2025 WIT.COM Inc Licensed GPL 3.0
syntax = "proto3";
package forgepb;
import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp
import "patch.proto"; // Import the well-known type for Timestamp
message Set { // `autogenpb:http`
Patches patches = 1;
string uuid = 2;
google.protobuf.Timestamp ctime = 3; // when the patches were submitted
string submitter = 4; // who submitted these // deprecate this
string name = 5; // "fixes for foo"
string gitAuthorName = 6;
string gitAuthorEmail = 7;
string hostname = 8;
string tmpDir = 9; // temp dir for 'git am' deprecate this
string startBranchName = 10; // deprecate this
string endBranchName = 11; // deprecate this
string startBranchHash = 12; // deprecate this
string endBranchHash = 13; // deprecate this
string comment = 14; // deprecate this
string state = 15; // deprecate this
}
message Sets { // `autogenpb:marshal` `autogenpb:gui` `autogenpb:nomutex` `autogenpb:http`
string uuid = 1; // `autogenpb:uuid:be926ad9-f07f-484c-adf2-d96eeabf3079`
string version = 2; // `autogenpb:version:v0.0.45`
repeated Set sets = 3;
}

89
set.table.go Normal file
View File

@ -0,0 +1,89 @@
// Copyright 2025 WIT.COM Inc Licensed GPL 3.0
package forgepb
import (
"time"
"go.wit.com/lib/cobol"
"go.wit.com/log"
)
func (pset *Set) PrintTable() {
if pset == nil || pset.Patches == nil {
return
}
log.DaemonMode(true) // don't timestamp lines
tablePB := pset.Patches.makeStandardTable()
tablePB.MakeTable()
tablePB.PrintTable()
}
func (mt *PatchesTable) PrintTable() {
// log.Info("ShowTable() SENDING TO GUI")
mt.MakeTable()
cobol.PrintTable(mt.pb)
}
func (pb *Patches) makeStandardTable() *PatchesTable {
t := pb.NewTable("tagList")
t.NewUuid()
col := t.AddNamespace()
col.Width = 28
col = t.AddCommitHash()
col.Width = 8
col = t.AddPatchId()
col.Width = 8
col = t.AddNewHash()
col.Width = 8
col = t.AddTimeFunc("ctime", func(p *Patch) time.Time {
// todo
return p.Ctime.AsTime()
})
col.Width = 4
/*
col = t.AddTimeFunc("age", func(repo *gitpb.GitTag) time.Time {
// todo
return time.Now()
})
col.Width = 4
*/
// col = t.AddStringFunc("filename", func(p *Patch) string {
// _, base := filepath.Split(p.Filename)
// return base
// })
// col.Width = 24
col = t.AddComment()
col.Width = 80
return t
}
/*
func (pb *Sets) makeStandardTablePB() *SetsTable {
t := pb.NewTable("tagList")
t.NewUuid()
col := t.AddUuid()
col.Width = 12
col = t.AddTimeFunc("ctime", func(pset *Set) time.Time {
// todo
return pset.Ctime.AsTime()
})
col.Width = 4
col = t.AddComment()
col.Width = -1
return t
}
*/

View File

@ -12,7 +12,7 @@ type Forge struct {
once sync.Once once sync.Once
Config *ForgeConfigs // config repos for readonly, private, etc Config *ForgeConfigs // config repos for readonly, private, etc
Repos *gitpb.Repos // the repo protobufs Repos *gitpb.Repos // the repo protobufs
Patchsets *Patchsets // patches that are in progress Patchsets *Sets // patches that are in progress
hostname string // your hostname hostname string // your hostname
goWork bool // means the user is currently using a go.work file goWork bool // means the user is currently using a go.work file
} }