package main import ( "flag" "log" "os" "path" "path/filepath" "time" logger "git.site.quack-lab.dev/dave/cylogger" "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5" ) var ROOT string func main() { scanIntervalF := flag.String("interval", "2s", "scan interval") flag.Parse() log.SetFlags(log.Lmicroseconds) scanInterval, err := time.ParseDuration(*scanIntervalF) if err != nil { logger.Error("error parsing SCAN_INTERVAL: %v", err) return } cwd, err := os.Getwd() if err != nil { logger.Error("error getting cwd: %v", err) return } ROOT = path.Clean(cwd) ROOT, err = filepath.Abs(ROOT) if err != nil { logger.Error("error getting absolute path for ROOT: %v", err) return } logger.Info("Input args parsed as:") logger.Info("ROOT: %s", ROOT) logger.Info("SCAN_INTERVAL: %.0fs", scanInterval.Seconds()) for { logger.Info("Running at %s", time.Now().Format(time.RFC3339)) doRun() time.Sleep(scanInterval) } } func doRun() { // Open the repository r, err := git.PlainOpen(ROOT) if err != nil { logger.Error("Error opening repository: %v", err) return } // Get the worktree w, err := r.Worktree() if err != nil { logger.Error("Error getting worktree: %v", err) return } // Check status status, err := w.Status() if err != nil { logger.Error("Error getting status: %v", err) return } if status.IsClean() { logger.Info("Nothing to commit") return } logger.Info("Changes detected") // Add all changes err = w.AddWithOptions(&git.AddOptions{All: true}) if err != nil { logger.Error("Error adding changes: %v", err) return } logger.Info("Changes added to index") // Set identity err = setIdentity(r) if err != nil { logger.Error("Error setting identity: %v", err) return } // Commit changes _, err = w.Commit("Update", &git.CommitOptions{ Author: &object.Signature{ Name: "system", Email: "system@localhost", }, }) if err != nil { logger.Error("Error committing changes: %v", err) return } logger.Info("Changes committed") } func setIdentity(r *git.Repository) error { cfg, err := r.Config() if err != nil { return err } cfg.User.Name = "system" cfg.User.Email = "system@localhost" return r.SetConfig(cfg) }