forged/forgeDir.go

77 lines
2.0 KiB
Go

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
}