diff options
| author | Jeff Carr <[email protected]> | 2025-10-19 02:55:45 -0500 | 
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-10-19 02:55:45 -0500 | 
| commit | f9a62d1c3aeb9e99214cc16a664705d9a517fac3 (patch) | |
| tree | c0c2dc5199b9388669f6509419a0b93ae054b371 | |
| parent | 3a7d5a176350447cf568d9fbc7ea804895549968 (diff) | |
make doTestVersion()
| -rw-r--r-- | argv.custom.go | 2 | ||||
| -rw-r--r-- | argv.struct.go | 8 | ||||
| -rw-r--r-- | argv.template.go | 6 | ||||
| -rw-r--r-- | doTest.go | 115 | ||||
| -rw-r--r-- | main.go | 80 | ||||
| -rw-r--r-- | sh/sh.go | 28 | ||||
| -rw-r--r-- | subCommand.go | 96 | 
7 files changed, 254 insertions, 81 deletions
diff --git a/argv.custom.go b/argv.custom.go index c8c97be..25904ee 100644 --- a/argv.custom.go +++ b/argv.custom.go @@ -66,7 +66,7 @@ func (args) ArgvGui() error {  }  func (a args) DoAutoComplete(pb *argvpb.Argv) { -	base := []string{"build", "upgrade", "git", "publish", "pb", "linux", "droplet"} +	base := []string{"build", "upgrade", "git", "publish", "pb", "linux", "droplet", "test"}  	base = append(base, "--version", "--force", "--all")  	// add these only if installed diff --git a/argv.struct.go b/argv.struct.go index 2414ac2..ae0d1f9 100644 --- a/argv.struct.go +++ b/argv.struct.go @@ -21,7 +21,7 @@ type args struct {  	Droplet   *DropletCmd `arg:"subcommand:droplet"            help:"do things on virtual machines"`  	Upgrade   *UpgradeCmd `arg:"subcommand:upgrade"            help:"apt upgrade packages installed from mirrors.wit.com"`  	Publish   *PublishCmd `arg:"subcommand:publish"            help:"publish packages"` -	Gui       *GuiCmd     `arg:"subcommand:gui"                help:"start the gui"` +	Test      *TestCmd    `arg:"subcommand:test"               help:"test things"`  	RepoMap   string      `arg:"--repomap"                     help:"location of the repomap"`  	DryRun    bool        `arg:"--dry-run"                     help:"only show what would be packaged"`  	Install   bool        `arg:"--install"                     help:"go install the binaries first"` @@ -47,10 +47,8 @@ type DropletCmd struct {  	Trim *EmptyCmd `arg:"subcommand:trim"            help:"clean out stuff and power off vm"`  } -type GuiCmd struct { -	GuiToolkit string `arg:"--gui"                         help:"which GUI toolkit to load"` -	GuiDebug   string `arg:"--gui-debug"                   help:"enable GUI debugging"` -	GuiBuild   string `arg:"--gui-build"                   help:"build the GUI plugins"` +type TestCmd struct { +	Version *EmptyCmd `arg:"subcommand:version"         help:"clean out stuff and power off vm"`  }  type LinuxCmd struct { diff --git a/argv.template.go b/argv.template.go index d438b20..5ac7060 100644 --- a/argv.template.go +++ b/argv.template.go @@ -31,6 +31,12 @@ func (args) ParseFlags(flags []string) error {  	return err  } +// add this funcgion: this will print the help +func (args) WriteHelpForSubcommand(cmd string) error { +	me.pp.WriteHelpForSubcommand(os.Stderr, cmd) +	return nil +} +  // this will print the help for the subcmd  func (args) WriteHelpForAutocomplete(part string, subcmd ...string) error {  	return me.pp.WriteHelpForAutocomplete(os.Stderr, os.Stdout, part, subcmd...) diff --git a/doTest.go b/doTest.go new file mode 100644 index 0000000..01f7caa --- /dev/null +++ b/doTest.go @@ -0,0 +1,115 @@ +// Copyright 2017-2025 WIT.COM Inc. All rights reserved. +// Use of this source code is governed by the GPL 3.0 + +package main + +import ( +	"errors" +	"strings" + +	"github.com/go-cmd/cmd" +	"go.wit.com/lib/config" +	"go.wit.com/lib/gui/shell" +	"go.wit.com/log" +) + +func doTest() (string, error) { +	var s string +	var err error + +	if argv.Test.Version != nil { +		var data []byte +		data, err = resources.ReadFile("resources/TESTVERSION") +		if err != nil { +			s = "open repomap failed" +			log.Info(s, err) +			return s, err +		} +		if len(data) == 0 { +			s = "resources/repomap is empty" +			log.Info(s, err) +			return s, config.ErrEmpty +		} +		var broken string +		for _, line := range strings.Split(string(data), "\n") { +			line := strings.TrimSpace(line) +			if line == "" { +				continue +			} +			parts := strings.Fields(line) +			cmdname := parts[len(parts)-1] +			log.Info("LINE=", cmdname) +			r := shell.Run([]string{cmdname, "--version"}) +			if r.Error != nil { +				return cmdname + " version test failed", r.Error +			} +			if len(r.Stdout) != 1 { +				for _, line := range r.Stderr { +					log.Info("STDERR:", line) +				} +				for _, line := range r.Stdout { +					log.Info("STDOUT:", line) +				} +				broken += cmdname + " " +			} +		} +		if broken != "" { +			return "version tests failed", errors.New(broken) +		} +		return "all version tests passed", nil +	} +	return "nothing tested", nil +} + +func versionStderr(cmdname string, r *cmd.Status) error { +	stderr := errors.New(cmdname + " version test broken") + +	for _, line := range r.Stderr { +		log.Info("STDERR:", line) +	} +	for _, line := range r.Stdout { +		log.Info("STDOUT:", line) +	} +	if r.Error != nil { +		return errors.Join(stderr, r.Error) +	} +	if r.Exit == 0 { +		return errors.Join(stderr, errors.New("exit -1")) +	} +	return stderr +} + +func doTestVersion(cmdname string) error { + +	r := shell.Run([]string{cmdname, "--version"}) +	if r.Exit != 0 { +		return versionStderr(cmdname, &r) +	} +	if r.Error != nil { +		return versionStderr(cmdname, &r) +	} +	if len(r.Stdout) == 0 { +		return versionStderr(cmdname, &r) +	} +	if len(r.Stdout) == 1 { +		line := r.Stdout[0] +		if !strings.HasPrefix(line, cmdname) { +			return versionStderr(cmdname, &r) +		} +		// probably okay +		return nil +	} +	if len(r.Stdout) == 2 { +		line := r.Stdout[0] +		if !strings.HasPrefix(line, "APPNAME=") { +			return versionStderr(cmdname, &r) +		} +		line = r.Stdout[1] +		if !strings.HasPrefix(line, cmdname) { +			return versionStderr(cmdname, &r) +		} +		// probably okay +		return nil +	} +	return versionStderr(cmdname, &r) +} @@ -9,7 +9,6 @@ import (  	"unicode"  	"go.wit.com/lib/protobuf/argvpb" -	"go.wit.com/lib/protobuf/filepb"  	"go.wit.com/log"  ) @@ -35,84 +34,15 @@ func main() {  	var s string  	var err error -	if argv.Upgrade != nil { -		doUpgrade() -		me.argv.GoodExit("") -	} - -	if argv.Linux != nil { -		if argv.Linux.Rdate != nil { -			s, err = doRdate() -		} else { -			setTerminalTitle("pinging google", "ping", []string{"google.com"}) -		} -	} - -	if argv.Build != nil { -		s, err = doBuild() -	} - -	if argv.Git != nil { -		initMachine() -		s, err = doGit() -	} - -	if argv.PB != nil { -		pbuuid, pbver, pberr := filepb.IdentifyPB(argv.PB.Identify) -		if pberr == nil { -			log.Info("pb version is:", pbver) -			log.Info("pb uuid    is:", pbuuid) -			s = "pb identify worked" -		} else { -			s = "identify failed" -			err = pberr -		} -	} - -	if argv.Clone != nil { -		doClone() -		me.argv.GoodExit("") -	} - -	if argv.WITCOM { -		doWITCOM() -		me.argv.GoodExit("") -	} - -	if argv.Clone != nil { -		doClone() -		me.argv.GoodExit("") -	} - -	if argv.WITCOM { -		doWITCOM() -		me.argv.GoodExit("") -	} - -	if argv.Upgrade != nil { -		doUpgrade() -	} +	// process the argv subcommand (subCommand.go) +	s, err = subCommand() -	if argv.Droplet != nil { -		s, err = doDroplet() -	} - -	if argv.Publish != nil { -		if err := doPublish(); err != nil { -			me.argv.BadExit("doPublish failed", err) -		} -		me.argv.GoodExit("") -	} - -	if argv.Zoo != nil { -		if areSuperuser() { -			exitOnErrorRealtime([]string{"journalctl", "-n", "100", "-f", "_SYSTEMD_UNIT=zood.service"}) -		} -		me.argv.GoodExit("do something here") -	} +	// argv provides timing and other features on exit  	if err != nil { +		// bad exit back to the shell via argv  		me.argv.BadExit(s, err)  	} +	// a good exit back to the shell via argv  	me.argv.GoodExit(s)  } diff --git a/sh/sh.go b/sh/sh.go new file mode 100644 index 0000000..f69de02 --- /dev/null +++ b/sh/sh.go @@ -0,0 +1,28 @@ +package sh + +// Implementations must not retain p. +type Writer interface { +        Write(p []byte) (n int, err error) +} + + +// Implementations must not retain p. +type Argv interface { +        InitIO(out io.Writer, err io.Writer) +        InitPB(pb *argvpb.Argv) +        WriteOUT(bytes []byte) +        WriteERR(bytes []byte) +        Stdout(out io.Writer) +        Stderr(err io.Writer) +        Match() (matches []string, err error) +        Help() (help string, err error) +        Exit(s string, err error) +} + +// Implementations must not retain p. +type Command interface { +        Run(pb *shpb.Command) +        Start(pb *shpb.Command) +        Exit(pb *shpb.Command) +} + diff --git a/subCommand.go b/subCommand.go new file mode 100644 index 0000000..fd75fc2 --- /dev/null +++ b/subCommand.go @@ -0,0 +1,96 @@ +// Copyright 2017-2025 WIT.COM Inc. All rights reserved. +// Use of this source code is governed by the GPL 3.0 + +package main + +import ( +	"go.wit.com/lib/protobuf/filepb" +	"go.wit.com/log" +) + +func subCommand() (string, error) { +	// Standard subcommand handling starts here +	var s string +	var err error + +	if argv.Upgrade != nil { +		doUpgrade() +		me.argv.GoodExit("") +	} + +	if argv.Linux != nil { +		if argv.Linux.Rdate != nil { +			s, err = doRdate() +		} else { +			setTerminalTitle("pinging google", "ping", []string{"google.com"}) +		} +	} + +	if argv.Build != nil { +		s, err = doBuild() +	} + +	if argv.Test != nil { +		s, err = doTest() +	} + +	if argv.Git != nil { +		initMachine() +		s, err = doGit() +	} + +	if argv.PB != nil { +		pbuuid, pbver, pberr := filepb.IdentifyPB(argv.PB.Identify) +		if pberr == nil { +			log.Info("pb version is:", pbver) +			log.Info("pb uuid    is:", pbuuid) +			s = "pb identify worked" +		} else { +			s = "identify failed" +			err = pberr +		} +	} + +	if argv.Clone != nil { +		doClone() +		me.argv.GoodExit("") +	} + +	if argv.WITCOM { +		doWITCOM() +		me.argv.GoodExit("") +	} + +	if argv.Clone != nil { +		doClone() +		me.argv.GoodExit("") +	} + +	if argv.WITCOM { +		doWITCOM() +		me.argv.GoodExit("") +	} + +	if argv.Upgrade != nil { +		doUpgrade() +	} + +	if argv.Droplet != nil { +		s, err = doDroplet() +	} + +	if argv.Publish != nil { +		if err := doPublish(); err != nil { +			me.argv.BadExit("doPublish failed", err) +		} +		me.argv.GoodExit("") +	} + +	if argv.Zoo != nil { +		if areSuperuser() { +			exitOnErrorRealtime([]string{"journalctl", "-n", "100", "-f", "_SYSTEMD_UNIT=zood.service"}) +		} +		me.argv.GoodExit("do something here") +	} +	return s, err +}  | 
