package main import ( "flag" "fmt" "io" "log" "os" "path" "path/filepath" "time" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/config" ) var Error *log.Logger var Warning *log.Logger func init() { log.SetFlags(log.Ldate | log.Ltime) Error = log.New(io.MultiWriter(os.Stderr, os.Stdout), fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"), log.Ldate|log.Ltime) Warning = log.New(io.MultiWriter(os.Stdout), fmt.Sprintf("%sWarning:%s ", "\033[0;93m", "\033[0m"), log.Ldate|log.Ltime) } 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 { Error.Printf("error parsing SCAN_INTERVAL: %v", err) return } cwd, err := os.Getwd() if err != nil { Error.Printf("error getting cwd: %v", err) return } ROOT = path.Clean(cwd) ROOT, err = filepath.Abs(ROOT) if err != nil { Error.Printf("error getting absolute path for ROOT: %v", err) return } log.Printf("Input args parsed as:") log.Printf("ROOT: %s", ROOT) log.Printf("SCAN_INTERVAL: %.0fs", scanInterval.Seconds()) for { log.Printf("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 { Error.Printf("Error opening repository: %v", err) return } // Get the worktree w, err := r.Worktree() if err != nil { Error.Printf("Error getting worktree: %v", err) return } // Check status status, err := w.Status() if err != nil { Error.Printf("Error getting status: %v", err) return } if status.IsClean() { log.Printf("Nothing to commit") return } log.Printf("Changes detected") // Add all changes err = w.AddWithOptions(&git.AddOptions{All: true}) if err != nil { Error.Printf("Error adding changes: %v", err) return } log.Printf("Changes added to index") // Set identity err = setIdentity(r) if err != nil { Error.Printf("Error setting identity: %v", err) return } // Commit changes _, err = w.Commit("Update", &git.CommitOptions{ Author: &config.Signature{ Name: "system", Email: "system@localhost", }, }) if err != nil { Error.Printf("Error committing changes: %v", err) return } log.Printf("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) }