summaryrefslogtreecommitdiff
path: root/scanReposDir.go
diff options
context:
space:
mode:
Diffstat (limited to 'scanReposDir.go')
-rw-r--r--scanReposDir.go116
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
+}