better append/sort stuff

Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2024-11-29 14:08:33 -06:00
parent 908c905675
commit 98b366e2df
3 changed files with 82 additions and 18 deletions

53
main.go
View File

@ -9,6 +9,8 @@ import (
"github.com/alexflint/go-arg"
"go.wit.com/lib/gui/shell"
"go.wit.com/log"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)
// sent via -ldflags
@ -37,7 +39,7 @@ func main() {
}
// you need --upbase and --lobase
if argv.UpBase == "" {
if argv.Proto == "" {
pp.WriteHelp(os.Stdout)
os.Exit(-1)
}
@ -55,18 +57,20 @@ func main() {
sortmap := make(map[string]string)
sortmap["package"] = packageName
sortmap["protobase"] = protobase
sortmap["base"] = argv.LoBase
if argv.LoBase == "" {
// if not set, assumed to be protobase
sortmap["base"] = protobase
} else {
sortmap["base"] = argv.LoBase
}
sortmap["lock"] = sortmap["base"] + "sLock" // is nonglobal and plural
sortmap["Base"] = argv.UpBase
sortmap["Bases"] = sortmap["Base"] + "s"
sortparts := strings.Split(argv.Sort[0], ",")
sortmap["sortBy"] = sortparts[0]
sortmap["sortKey"] = sortparts[1]
// will keep this key unique if defined
sortmap["append"] = argv.Append
if argv.UpBase == "" {
sortmap["Base"] = cases.Title(language.English, cases.NoLower).String(protobase)
sortmap["Bases"] = sortmap["Base"] + "s"
} else {
sortmap["Base"] = argv.UpBase
sortmap["Bases"] = sortmap["Base"] + "s"
}
if argv.DryRun {
for k, v := range sortmap {
@ -81,11 +85,26 @@ func main() {
syncLock(f, sortmap)
iterTop(f, sortmap)
iterNext(f, sortmap)
iterSort(f, sortmap)
iterAppend(f, sortmap)
// setup Append() functions
if argv.Append == "" {
// do nothing. enforce no unique keys
iterAppend(f, sortmap) // Append() enforce no unique keys
} else {
iterAppend(f, sortmap) // Append() enforce no unique keys
sortmap["append"] = argv.Append
iterAppend(f, sortmap) // Append() enforce unique key argv.Append
}
// setup Sort() functions
if len(argv.Sort) == 0 {
// don't do any sorting
} else {
sortparts := strings.Split(argv.Sort[0], ",")
sortmap["sortBy"] = sortparts[0]
sortmap["sortKey"] = sortparts[1]
iterSort(f, sortmap)
// add ReplaceKey()
iterDelete(f, sortmap)
iterReplace(f, sortmap)
@ -235,8 +254,8 @@ func iterAppend(w io.Writer, names map[string]string) {
if names["append"] == "" {
fmt.Fprintln(w, "func (all *"+names["Bases"]+") Append(newP *"+names["Base"]+") bool {")
} else {
fmt.Fprintln(w, "func (all *"+names["Bases"]+") Append(newP *"+names["Base"]+") bool { // todo: make unique name here")
// fmt.Fprintln(w, "func (all *"+names["Bases"]+") AppendUnique(newP *"+names["Base"]+") bool {")
// fmt.Fprintln(w, "func (all *"+names["Bases"]+") Append(newP *"+names["Base"]+") bool { // todo: make unique name here")
fmt.Fprintln(w, "func (all *"+names["Bases"]+") AppendUnique(newP *"+names["Base"]+") bool {")
}
fmt.Fprintln(w, " "+names["lock"]+".Lock()")
fmt.Fprintln(w, " defer "+names["lock"]+".Unlock()")

View File

@ -3,10 +3,11 @@ BUILDTIME = $(shell date +%Y.%m.%d)
test: vet
all: clean test.pb.go run
all: clean test.pb.go forgeConfig.pb.go run
run:
../autogenpb --proto test.proto --lobase gitTag --upbase GitTag --sort "ByPath,Refname" --marshal GitTags --append Refname
../autogenpb --proto forgeConfig.proto --sort "ByPath,GoPath" --append GoPath
vet:
@GO111MODULE=off go vet
@ -31,3 +32,8 @@ test.pb.go: test.proto
cd ~/go/src && protoc --go_out=. --proto_path=go.wit.com/apps/autogenpb/testautogen \
--go_opt=Mtest.proto=go.wit.com/apps/autogenpb/testautogen \
test.proto
forgeConfig.pb.go: forgeConfig.proto
cd ~/go/src && protoc --go_out=. --proto_path=go.wit.com/apps/autogenpb/testautogen \
--go_opt=MforgeConfig.proto=go.wit.com/apps/autogenpb/testautogen \
forgeConfig.proto

View File

@ -0,0 +1,39 @@
syntax = "proto3";
package testautogen;
import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp
// define 3 branches. that is all that is supported
// the term 'master' is used in the code because 'main' is a reserved word in golang already
// allow 'read only' and 'private' flags
// package names sometimes must be different than the binary name
// for example 'zookeeper' is packaged as 'zookeeper-go'
// due to the prior apache foundation project. This happens and is ok!
message ForgeConfig {
string goPath = 1; // Examples: 'go.wit.com/apps/go-clone' or "~/mythings" or "/home/src/foo"
bool writable = 2; // if you have write access to the repo
bool readOnly = 3; // the opposite, but needed for now because I don't know what I'm doing
bool private = 4; // if the repo can be published
bool directory = 5; // everything in this directory should use these writable & private values
bool favorite = 6; // you like this. always git clone/go clone this repo
bool interesting = 7; // this is something interesting you found and want to remember it
string masterBranchName = 8; // git 'main' or 'master' branch name
string develBranchName = 9; // whatever the git 'devel' branch name is
string userBranchName = 10; // whatever your username branch is
string debName = 11; // the actual name used with 'apt install' (or distro apt equivalent.
// todo: appeal to everyone to alias 'apt' on rhat, gentoo, arch, etc to alias 'apt install'
// so we can make easier instructions for new linux users. KISS
google.protobuf.Timestamp verstamp = 12; // the git commit timestamp of the version
}
// TODO: autogen 'sort', 'marshal'
message ForgeConfigs {
string uuid = 1; // could be useful for /usr/share/file/magic someday?
string version = 2; // could be used for protobuf schema change violations?
repeated ForgeConfig ForgeConfigs = 3;
}