From 604c7545891a29cd3106b5b67b24e383fe19fc2b Mon Sep 17 00:00:00 2001 From: Simon Cornet Date: Tue, 25 Feb 2025 10:58:18 +0100 Subject: [PATCH] feat: more seperate files --- cmd/gogitlabber/git.go | 54 +++++++++++++++++++ cmd/gogitlabber/gitlab.go | 98 +++------------------------------- cmd/gogitlabber/main.go | 2 + cmd/gogitlabber/progressbar.go | 53 ++++++++++++++++++ 4 files changed, 116 insertions(+), 91 deletions(-) create mode 100644 cmd/gogitlabber/git.go create mode 100644 cmd/gogitlabber/progressbar.go diff --git a/cmd/gogitlabber/git.go b/cmd/gogitlabber/git.go new file mode 100644 index 0000000..5e4178b --- /dev/null +++ b/cmd/gogitlabber/git.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "log" + "os/exec" + "strings" +) + +func cloneRepository(repoDestination string, gitlabUrl string) (string, error) { + + cloneCmd := exec.Command("git", "clone", gitlabUrl, repoDestination) + cloneOutput, err := cloneCmd.CombinedOutput() + + return string(cloneOutput), err +} + +func findRemote(repoDestination string) (string, error) { + + remoteCmd := exec.Command("git", "-C", repoDestination, "remote", "show") + remoteOutput, err := remoteCmd.CombinedOutput() + remote := strings.Split(strings.TrimSpace(string(remoteOutput)), "\n")[0] + + if err != nil { + log.Printf("\n❌ error finding remote for: %s\n", err) + } + + return remote, err +} + +func pullRepositories(repoDestination string) (string, error) { + + remote, err := findRemote(repoDestination) + pullCmd := exec.Command("git", "-C", repoDestination, "pull", remote) + pullOutput, err := pullCmd.CombinedOutput() + + if err != nil { + errorCount = errorCount + 1 + if strings.Contains(string(pullOutput), "You have unstaged changes") { + pullErrorMsg = append(pullErrorMsg, repoDestination) + } + } + + bar.Add(1) + return string(pullOutput), err +} + +func printPullError(pullErrorMsg []string) { + if len(pullErrorMsg) > 0 { + for _, repo := range pullErrorMsg { + fmt.Printf("❕%s has unstaged changes.\n", repo) + } + } +} diff --git a/cmd/gogitlabber/gitlab.go b/cmd/gogitlabber/gitlab.go index 113417d..d9eb215 100644 --- a/cmd/gogitlabber/gitlab.go +++ b/cmd/gogitlabber/gitlab.go @@ -5,11 +5,7 @@ import ( "fmt" "log" "net/http" - "os/exec" "strings" - - "github.com/k0kubun/go-ansi" - "github.com/schollz/progressbar/v3" ) func fetchRepositories() ([]Repository, error) { @@ -60,45 +56,23 @@ func fetchRepositories() ([]Repository, error) { } func checkoutRepositories(repositories []Repository) { - repoCount := len(repositories) - - // make progressbar - barPrefix := fmt.Sprintf("Getting your one and only repository...") - if repoCount > 1 { - barPrefix = fmt.Sprintf("Getting your repositories...") - } - - bar := progressbar.NewOptions( - repoCount, - progressbar.OptionSetWriter(ansi.NewAnsiStdout()), - progressbar.OptionEnableColorCodes(true), - progressbar.OptionShowCount(), - progressbar.OptionShowDescriptionAtLineEnd(), - progressbar.OptionSetElapsedTime(false), - progressbar.OptionSetPredictTime(false), - progressbar.OptionSetWidth(20), - progressbar.OptionSetDescription(barPrefix), - progressbar.OptionSetTheme(progressbar.Theme{ - Saucer: "[green]=[reset]", - SaucerHead: "[green]>[reset]", - SaucerPadding: " ", - BarStart: "[", - BarEnd: "]", - }), - ) for _, repo := range repositories { + // create clone gitlab url repoName := string(repo.PathWithNamespace) gitlabUrl := fmt.Sprintf("https://gitlab-token:%s@%s/%s.git", gitlabToken, gitlabHost, repoName) + // create repository destination repoDestination := repoDestinationPre + repoName + // create bar description descriptionPrefixPre := "Cloning repository " descriptionPrefix := descriptionPrefixPre + repoName + " ..." bar.Describe(descriptionPrefix) + // clone the repo cloneOutput, err := cloneRepository(repoDestination, gitlabUrl) if err != nil { @@ -113,81 +87,23 @@ func checkoutRepositories(repositories []Repository) { _, err := pullRepositories(repoDestination) if err != nil { - bar.Add(1) continue } pulledCount = pulledCount + 1 - bar.Add(1) continue } + // in case cloning failed and the directory does not exist + // print the clone error and continue log.Printf("\n❌ error cloning %s: %v\n%s\n", repoName, err, cloneOutput) errorCount = errorCount + 1 bar.Add(1) continue } + // finish the clone clonedCount = clonedCount + 1 bar.Add(1) } - - // print empty line as the bar does not do that - fmt.Println("") - - // print summary - fmt.Printf( - "Summary:\n"+ - " Cloned repositories: %v\n"+ - " Pulled repositories: %v\n"+ - " Errors: %v\n", - clonedCount, - pulledCount, - errorCount, - ) -} - -func cloneRepository(repoDestination string, gitlabUrl string) (string, error) { - - cloneCmd := exec.Command("git", "clone", gitlabUrl, repoDestination) - cloneOutput, err := cloneCmd.CombinedOutput() - - return string(cloneOutput), err -} - -func findRemote(repoDestination string) (string, error) { - - remoteCmd := exec.Command("git", "-C", repoDestination, "remote", "show") - remoteOutput, err := remoteCmd.CombinedOutput() - remote := strings.Split(strings.TrimSpace(string(remoteOutput)), "\n")[0] - - if err != nil { - log.Printf("\n❌ error finding remote for: %s\n", err) - } - - return remote, err -} - -func pullRepositories(repoDestination string) (string, error) { - - remote, err := findRemote(repoDestination) - pullCmd := exec.Command("git", "-C", repoDestination, "pull", remote) - pullOutput, err := pullCmd.CombinedOutput() - - if err != nil { - errorCount = errorCount + 1 - if strings.Contains(string(pullOutput), "You have unstaged changes") { - pullErrorMsg = append(pullErrorMsg, repoDestination) - } - } - - return string(pullOutput), err -} - -func printPullError(pullErrorMsg []string) { - if len(pullErrorMsg) > 0 { - for _, repo := range pullErrorMsg { - fmt.Printf("❕%s has unstaged changes.\n", repo) - } - } } diff --git a/cmd/gogitlabber/main.go b/cmd/gogitlabber/main.go index ef663c5..1ab148a 100644 --- a/cmd/gogitlabber/main.go +++ b/cmd/gogitlabber/main.go @@ -33,6 +33,8 @@ func main() { } // manage found repositories + progressBar(repositories) checkoutRepositories(repositories) + printSummary() printPullError(pullErrorMsg) } diff --git a/cmd/gogitlabber/progressbar.go b/cmd/gogitlabber/progressbar.go new file mode 100644 index 0000000..d8402d2 --- /dev/null +++ b/cmd/gogitlabber/progressbar.go @@ -0,0 +1,53 @@ +package main + +import ( + "fmt" + + "github.com/k0kubun/go-ansi" + "github.com/schollz/progressbar/v3" +) + +var bar *progressbar.ProgressBar + +func progressBar(repositories []Repository) { + repoCount := len(repositories) + + // make progressbar + barPrefix := fmt.Sprintf("Getting your one and only repository...") + if repoCount > 1 { + barPrefix = fmt.Sprintf("Getting your repositories...") + } + + bar = progressbar.NewOptions( + repoCount, + progressbar.OptionSetWriter(ansi.NewAnsiStdout()), + progressbar.OptionEnableColorCodes(true), + progressbar.OptionShowCount(), + progressbar.OptionShowDescriptionAtLineEnd(), + progressbar.OptionSetElapsedTime(false), + progressbar.OptionSetPredictTime(false), + progressbar.OptionSetWidth(20), + progressbar.OptionSetDescription(barPrefix), + progressbar.OptionSetTheme(progressbar.Theme{ + Saucer: "[green]=[reset]", + SaucerHead: "[green]>[reset]", + SaucerPadding: " ", + BarStart: "[", + BarEnd: "]", + }), + ) +} + +func printSummary() { + + fmt.Println("") + fmt.Printf( + "Summary:\n"+ + " Cloned repositories: %v\n"+ + " Pulled repositories: %v\n"+ + " Errors: %v\n", + clonedCount, + pulledCount, + errorCount, + ) +}