diff --git a/internal/repositories/update.go b/internal/repositories/update.go new file mode 100644 index 0000000..920a54d --- /dev/null +++ b/internal/repositories/update.go @@ -0,0 +1,37 @@ +package repositories + +import ( + "fmt" + "os" + "os/exec" + "strings" +) + +func Update(repositoryPath string) error { + repositoryPath = strings.TrimSuffix(repositoryPath, "/.git") + + err := os.Chdir(repositoryPath) + + if err != nil { + return fmt.Errorf("failed to change directory to %s: %w", repositoryPath, err) + } + + fmt.Printf("Updating %s\n", repositoryPath) + + commands := [][]string{ + {"git", "fetch", "--all", "--jobs=4", "--progress", "--prune"}, + {"git", "pull", "--rebase"}, + } + + for _, args := range commands { + cmd := exec.Command(args[0], args[1:]...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + if err := cmd.Run(); err != nil { + return fmt.Errorf("%s failed: %w", strings.Join(args, " "), err) + } + } + + return nil +} diff --git a/main.go b/main.go index 9898df4..0d9ebc4 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,6 @@ package main import ( - "fmt" "log" "strings" @@ -19,20 +18,20 @@ func main() { dirs := cfg.Directories for _, dir := range dirs { - repositories, err := repositories.FindInDirectory(dir) + repositoryPaths, err := repositories.FindInDirectory(dir) if err != nil { // TODO } - lines := strings.SplitSeq(repositories, "\n") + lines := strings.SplitSeq(repositoryPaths, "\n") for repositoryPath := range lines { if repositoryPath == "" { continue } - fmt.Println(repositoryPath) + repositories.Update(repositoryPath) } } } diff --git a/todo.txt b/todo.txt index 8604042..c146fa0 100644 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,4 @@ * Load directories from a configuration file +* Update the repositories within each directory. -Update the repositories within each directory. Make depth configurable per directory.