// This is a simple example package repostatus import ( "errors" "io/ioutil" "os" "os/exec" "os/user" "path/filepath" "regexp" "strings" "syscall" "go.wit.com/log" ) func run(path string, thing string, cmdline string) string { parts := strings.Split(cmdline, " ") // Create the command cmd := exec.Command(thing, parts...) // Set the working directory cmd.Dir = path // Execute the command output, err := cmd.CombinedOutput() tmp := string(output) tmp = strings.TrimSpace(tmp) if err != nil { log.Log(WARN, "run()", path, thing, cmdline, "=", tmp) log.Error(err, "cmd error'd out", parts) return "" } // Print the output log.Log(INFO, "run()", path, thing, cmdline, "=", tmp) return tmp } // goes in one directory so it gets remote branch names func listFiles(directory string) []string { var files []string fileInfo, err := os.ReadDir(directory) if err != nil { log.Error(err) return nil } for _, file := range fileInfo { if file.IsDir() { dirname := file.Name() newdir, _ := os.ReadDir(directory + "/" + dirname) for _, file := range newdir { if !file.IsDir() { files = append(files, dirname+"/"+file.Name()) } } } else { files = append(files, file.Name()) } } return files } /* // string handling examples that might be helpful for normalizeInt() isAlpha := regexp.MustCompile(`^[A-Za-z]+$`).MatchString for _, username := range []string{"userone", "user2", "user-three"} { if !isAlpha(username) { log.Log(GUI, "%q is not valid\n", username) } } const alpha = "abcdefghijklmnopqrstuvwxyz" func alphaOnly(s string) bool { for _, char := range s { if !strings.Contains(alpha, strings.ToLower(string(char))) { return false } } return true } */ func normalizeVersion(s string) string { // reg, err := regexp.Compile("[^a-zA-Z0-9]+") parts := strings.Split(s, "-") if len(parts) == 0 { return "" } reg, err := regexp.Compile("[^0-9.]+") if err != nil { log.Log(WARN, "normalizeVersion() regexp.Compile() ERROR =", err) return parts[0] } clean := reg.ReplaceAllString(parts[0], "") log.Log(INFO, "normalizeVersion() s =", clean) return clean } func splitVersion(version string) (a, b, c string) { tmp := normalizeVersion(version) parts := strings.Split(tmp, ".") switch len(parts) { case 1: return parts[0], "", "" case 2: return parts[0], parts[1], "" default: return parts[0], parts[1], parts[2] } } func (rs *RepoStatus) RunCmd(parts []string) (error, string) { path := rs.realPath.String() err, _, output := RunCmd(path, parts) if err != nil { log.Log(WARN, "cmd:", parts) log.Log(WARN, "ouptput:", output) log.Log(WARN, "failed with error:", err) } return err, output } // temp hack. fix this func runCmd(path string, parts []string) (error, bool, string) { return RunCmd(path, parts) } func RunCmd(workingpath string, parts []string) (error, bool, string) { if len(parts) == 0 { log.Warn("command line was empty") return errors.New("empty"), false, "" } if parts[0] == "" { log.Warn("command line was empty") return errors.New("empty"), false, "" } thing := parts[0] parts = parts[1:] log.Log(INFO, "working path =", workingpath, "thing =", thing, "cmdline =", parts) // Create the command cmd := exec.Command(thing, parts...) // Set the working directory cmd.Dir = workingpath // Execute the command output, err := cmd.CombinedOutput() if err != nil { if thing == "git" { log.Log(INFO, "git ERROR. maybe okay", workingpath, "thing =", thing, "cmdline =", parts) log.Log(INFO, "git ERROR. maybe okay err =", err) if err.Error() == "exit status 1" { log.Log(INFO, "git ERROR. normal exit status 1") if parts[0] == "diff-index" { log.Log(INFO, "git normal diff-index when repo dirty") return nil, false, "git diff-index exit status 1" } } } log.Log(WARN, "ERROR working path =", workingpath, "thing =", thing, "cmdline =", parts) log.Log(WARN, "ERROR working path =", workingpath, "thing =", thing, "cmdline =", parts) log.Log(WARN, "ERROR working path =", workingpath, "thing =", thing, "cmdline =", parts) log.Error(err) log.Warn("output was", string(output)) log.Warn("cmd exited with error", err) // panic("fucknuts") return err, false, string(output) // The command failed (non-zero exit status) if exitErr, ok := err.(*exec.ExitError); ok { // Assert that it is an exec.ExitError and get the exit code if status, ok := exitErr.Sys().(syscall.WaitStatus); ok { log.Warn("Exit Status: %d\n", status.ExitStatus()) } } else { log.Warn("cmd.Run() failed with %s\n", err) } } tmp := string(output) tmp = strings.TrimSpace(tmp) // Print the output return nil, true, tmp } // Set the path to the package func getfiles(pathToPackage string) { // List files in the directory err := filepath.Walk(pathToPackage, nil) // compiles but crashes if err == nil { log.Log(INFO, "directory ok", pathToPackage) } else { log.Warn("directory wrong", pathToPackage) } } func IsDirectory(path string) bool { info, err := os.Stat(path) if err != nil { return false } return info.IsDir() } func VerifyLocalGoRepo(gorepo string) bool { // Get current user usr, err := user.Current() if err != nil { log.Error(err, "VerifyLocalGoRepo() thinks you should switch to Ultrix") return false } // Form the path to the home Git directory gitDir := filepath.Join(usr.HomeDir, "go/src/", gorepo, ".git") log.Log(INFO, "go directory:", gitDir) return IsDirectory(gitDir) } func readFileToString(filename string) (string, error) { data, err := ioutil.ReadFile(filename) if err != nil { return "", err } return strings.TrimSpace(string(data)), nil }