package main import ( "flag" "fmt" "os" "path/filepath" "strings" "github.com/go-git/go-git/v5" ) const ( green = "\033[32m" red = "\033[31m" reset = "\033[0m" ) func getStatus(repoPath string) (git.Status, error) { repo, err := git.PlainOpen(repoPath) if err != nil { return git.Status{}, err } w, err := repo.Worktree() if err != nil { return git.Status{}, err } status, err := w.Status() if err != nil { return git.Status{}, err } return status, nil } func expandTilde(path string) (string, error) { if !strings.HasPrefix(path, "~") { return path, nil } home, err := os.UserHomeDir() if err != nil { return "", err } return filepath.Join(home, path[1:]), nil } func main() { // dirPath := flag.String("dir", ".", "path to directory") flag.Parse() args := flag.Args() dir := "." if len(args) > 0 { // log.Fatal("usage: gitcheck ") dir = args[0] } path, err := expandTilde(dir) if err != nil { fmt.Println(err) } entries, err := os.ReadDir(path) if err != nil { fmt.Println(err) } for _, d := range entries { cpath := filepath.Join(path, d.Name()) // fmt.Println(cpath) // p, err := os.Stat(cpath) if err != nil { // fmt.Println(err) fmt.Println(cpath) continue } // if !p.IsDir() { // continue // } status, err := getStatus(cpath) if err != nil { // fmt.Println(err) fmt.Println(cpath) continue } // fmt.Println("----------") // pp.Println(res) // fmt.Printf("%v: %v \n", cpath, res) if !status.IsClean() { fmt.Printf("%s%s (%v)%s\n", green, cpath, len(status), reset) // fmt.Println(status.String()) } else { fmt.Println(cpath) // fmt.Printf("%s%s%s\n", red, cpath, reset) } } }