// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "errors" "fmt" "os" "path/filepath" "strings" "go.wit.com/lib/fhelp" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) func doGitCreate(namespace string) (string, error) { var s string var err error templateDir := "/var/lib/git/lib/templates/golib" if !shell.IsDir(templateDir) { return "", errors.New("no template/golib") } fullpath := filepath.Join("/var/lib/git", namespace) if shell.IsDir(fullpath) { return "", errors.New("dir " + fullpath + " already exists") } basepath, _ := filepath.Split(fullpath) if err := os.MkdirAll(basepath, os.ModePerm); err != nil { return "", err } cmd := []string{"cp", "-a", templateDir, fullpath} shell.RunVerbose(cmd) return s, err } func doGit() (string, error) { var s string var err error if argv.Git.Log != nil { fstr := "--format=\"%h %>(24)%ar %>(20)%an %s" cmd := []string{"git", "log", fstr} shell.RunVerbose(cmd) s = "git log" } if argv.Git.Create != "" { s = "attmepting to create new repo" } if argv.Git.Tag != nil { cmd := []string{"git", "for-each-ref", "--sort=taggerdate", "--format"} cmd = append(cmd, "%(tag)%00%(taggerdate:raw)%00%(taggername)%00%(subject)") cmd = append(cmd, "refs/tags") result := shell.RunQuiet(cmd) for i, line := range result.Stdout { parts := strings.Split(line, "\x00") log.Infof("LINE: %d len(%d) %v\n", i, len(parts), parts) } s = "git tags" } if argv.Git.Who != nil { if _, err := fhelp.CheckCmd("git-who"); err != nil { if fhelp.QuestionUser("install git-who") { log.Info("go install -v -x github.com/sinclairtarget/git-who@latest") } else { log.Info("not installing") } me.sh.GoodExit("git who should be installed") } cmd := []string{"git", "who"} shell.RunVerbose(cmd) s = "git who" } if argv.Git.Pull != nil { doPull(".config/wit") doPull("tools") s = "git pull" } if argv.Git.Push != nil { doPush(".config/wit") doPush("tools") s = "git push" } if argv.Git.DeleteUntracked { initForge() var totals, repos int for repo := range me.forge.Repos.IterAll() { if !strings.HasPrefix(repo.Namespace, "go.wit.com") { continue } files, _ := repo.GitDeleteOthers() if len(files) == 0 { continue } totals += len(files) repos += 1 log.Info(len(files), repo.Namespace) log.Info(strings.Join(files, "\n")) if argv.Force { if len(files) > 0 { cmd := []string{"rm"} cmd = append(cmd, files...) _, err := fhelp.RunRealtimeError(cmd) if err != nil { log.Info("cmd failed", cmd, repo.FullPath, err) return "rm failed", err } } } } s = log.Sprintf("total files to delete: (%d) in (%d) repos", totals, repos) } return s, err } func findRepo(wpath string) (*gitpb.Repo, bool) { d := filepath.Join(me.homedir, wpath) if !shell.IsDir(d) { return nil, false } repo, err := gitpb.NewRepo(d) if err != nil { log.Info("path error", d, err) return nil, false } return repo, true } func doPull(wpath string) { repo, ok := findRepo(wpath) if !ok { return } os.Chdir(repo.FullPath) cmd := []string{"git", "pull"} log.Info("Run", repo.FullPath, cmd) exitOnErrorRealtime(cmd) } func doPush(wpath string) { doPull(wpath) d := filepath.Join(me.homedir, wpath) if !shell.IsDir(d) { return } repo, err := gitpb.NewRepo(d) if err != nil { log.Info("path error", d, err) return } if repo == nil { log.Info("repo is nil", d, err) return } if err := repo.GitCommit(); err != nil { msg := fmt.Sprintf("repo.GitCommit() %s", repo.FullPath) me.sh.BadExit(msg, err) } repo.RunRealtime([]string{"git", "push"}) }