package main import ( "fmt" "os" "path/filepath" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) func readGitPB(fullpath string) (*gitpb.Repo, error) { // fmt.Fprintln(w, "repo:", repo.FullPath, repo.Namespace) bytes, err := os.ReadFile(filepath.Join(fullpath, "git.pb")) if err != nil { log.Info("todo: git.pb non-existant:", fullpath) return nil, err } newr := new(gitpb.Repo) if err := newr.Unmarshal(bytes); err != nil { log.Info("todo: unmarshal failed for git.pb:", fullpath) return nil, fmt.Errorf("todo: generate git.pb for " + fullpath) } return newr, nil } // doesn't enter the directory any further when it finds a .git/ // not stupid like my old version func scanForgedDir(srcDir string) ([]string, error) { var all []string var trip bool err := filepath.WalkDir(srcDir, func(path string, d os.DirEntry, err error) error { if err != nil { // Handle possible errors, like permission issues fmt.Fprintf(os.Stderr, "error accessing path %q: %v\n", path, err) return err } if d.IsDir() { // log.Info("path is dir", path) } else { _, fname := filepath.Split(path) switch fname { case "repos.pb": case "git.pb": case "go.work.last": case "go.work.sum": default: // todo: figure out a way to do padding for init() if trip == false { log.Info("WARNING:") } log.Info("WARNING: you have an untracked file outside of any .git repository:", path) trip = true } return nil } gitdir := filepath.Join(path, "git.pb") _, err2 := os.Stat(gitdir) if !os.IsNotExist(err2) { all = append(all, path) return filepath.SkipDir } // todo: check if dir is empty here and delete dir? return nil }) // probably always leave this here forever // this check, along with CheckDirty() makes sure you can safely delete ~/go/src or the go.work directory // because everything is either checked in or deleted. An important thing to know! if trip { log.Info("WARNING: junk in", srcDir) } return all, err }