diff options
Diffstat (limited to 'scanReposDir.go')
| -rw-r--r-- | scanReposDir.go | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/scanReposDir.go b/scanReposDir.go new file mode 100644 index 0000000..9c62e55 --- /dev/null +++ b/scanReposDir.go @@ -0,0 +1,116 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "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) + gitfile := filepath.Join(fullpath, "git.pb") + bytes, err := os.ReadFile(gitfile) + if err != nil { + log.Info("todo: git.pb non-existant:", gitfile) + return nil, err + } + newr := new(gitpb.Repo) + if err := newr.Unmarshal(bytes); err != nil { + log.Info("unmarshal failed: NEED TO DELETE:", gitfile) + return nil, fmt.Errorf("todo: re-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 + log.Infof("error accessing path %q: %v\n", path, err) + return err + } + + if d.IsDir() { + // log.Info("WHAT IS THIS?", 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 + } + + gitfile := filepath.Join(path, "git.pb") + _, err2 := os.Stat(gitfile) + if !os.IsNotExist(err2) { + // log.Info("IS THIS THE ONE?", path) + if ok, err := addGitRepoDir(path); ok { + log.Info("added", path) + } else { + if err != nil { + log.Info("add failed", path, err) + } + } + return filepath.SkipDir + } + + // todo: check if dir is empty here and delete dir? + return nil + }) + + if trip { + log.Info("WARNING: junk in", srcDir) + } + return all, err +} + +// must be "/foo/bar/" + "git.clone/" and then have a .git/ dir +func addGitRepoDir(dir string) (bool, error) { + fullpath := filepath.Join(dir, "git.clone") + if check := me.forge.Repos.FindByFullPath(fullpath); check != nil { + // log.Info(oldr.Namespace, fullpath, "already added") + return false, nil + } + + var namespace string + if oldr, err := readGitPB(dir); err == nil { + namespace = oldr.Namespace + } else { + log.Info("readGitPB() failed", dir, err) + namespace = strings.TrimPrefix(dir, "/home/repos") + } + namespace = strings.Trim(namespace, "/") + + // check to see if 'git clone' has already been run + _, err := os.Stat(fullpath) + if os.IsNotExist(err) { + log.Info("repo needs cloning:", namespace, dir) + return false, err + } + if repo, err := me.forge.AddNamespaceDir(namespace, fullpath); err == nil { + log.Info("repo added", repo.FullPath) + return true, nil + } else { + log.Info("repo add failed", repo.FullPath, err) + return false, err + } + return false, err +} |
