From e3ebcf47d3a5e4fdc5aa8ee6f93083a112c74511 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 19 May 2021 23:09:29 +0200 Subject: [PATCH 1/3] resolve first todos --- main.go | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/main.go b/main.go index a38ac85..c0e283b 100644 --- a/main.go +++ b/main.go @@ -23,6 +23,8 @@ type Cache struct { pullBaseBranch string `json:"pullBaseBranch"` } +const perPage = 10 + func loadCache() (cache *Cache) { // default values cache = &Cache{ @@ -115,11 +117,9 @@ func main() { } repoList = append(repoList, repos...) - if len(repos) < 10 { break } - page++ } fmt.Println() @@ -136,10 +136,24 @@ func main() { func threatRepo(baseBranchRule glob.Glob, client *gitlab.Client, repo *gitlab.Project) { fmt.Printf("Handle Repository '%s'\n", repo.Name) - // TODO: handle pagination - branchList, _, err := client.Branches.ListBranches(repo.ID, nil) - if err != nil { - error(10, "Could not obtain branch list from '%s': %v\n", repo.Name, err) + var branchList []*gitlab.Branch + var page = 1 + for { + bL, _, err := client.Branches.ListBranches(repo.ID, &gitlab.ListBranchesOptions{ + ListOptions: gitlab.ListOptions{ + Page: page, + PerPage: perPage, + }, + }) + if err != nil { + error(10, "Could not obtain branch list from '%s': %v\n", repo.Name, err) + } + + branchList = append(branchList, bL...) + if len(bL) < 10 { + break + } + page++ } fmt.Printf(" found %d branches:", len(branchList)) @@ -181,7 +195,7 @@ func threatRepo(baseBranchRule glob.Glob, client *gitlab.Client, repo *gitlab.Pr if len(pullList) == 0 { fmt.Printf(" no existing pull for %s, creating one ...\n", baseBranch.Name) pull, _, err := client.MergeRequests.CreateMergeRequest(repo.ID, &gitlab.CreateMergeRequestOptions{ - Title: optString(fmt.Sprintf("%s <- %s", repo.DefaultBranch, baseBranch.Name)), // TODO: better title (required) + Title: optString(fmt.Sprintf("%s <- %s", repo.DefaultBranch, baseBranch.Name)), Description: optString("Auto created by https://code.obermui.de/6543/GitLab_MergeDevel2Default"), SourceBranch: &baseBranch.Name, TargetBranch: &repo.DefaultBranch, From 227a1dae55f998ee2f8737e7f5aaad8538fc96d1 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 19 May 2021 23:26:42 +0200 Subject: [PATCH 2/3] done --- main.go | 61 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/main.go b/main.go index c0e283b..7756706 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "fmt" "io/ioutil" "os" + "time" "github.com/AlecAivazis/survey/v2" "github.com/gobwas/glob" @@ -23,6 +24,12 @@ type Cache struct { pullBaseBranch string `json:"pullBaseBranch"` } +type pullCache struct { + repoID int + iid int + webURL string +} + const perPage = 10 func loadCache() (cache *Cache) { @@ -124,16 +131,24 @@ func main() { } fmt.Println() + var pullsToMergeCache []*pullCache for i := range repoList { if !excludeRule.Match(repoList[i].Name) { // for each NOT excluded repo ... - threatRepo(baseBranchRule, client, repoList[i]) + pullsToMergeCache = append(pullsToMergeCache, + threatRepo(baseBranchRule, client, repoList[i]), + ) } } + + fmt.Printf("\n\nwait 3sec for gitlab before merge created pulls\n") + time.Sleep(3 * time.Second) + mergePulls(client, pullsToMergeCache) } // threatRepo create (if needed) & merge "develop[ment]" branch in DefaultBranch -func threatRepo(baseBranchRule glob.Glob, client *gitlab.Client, repo *gitlab.Project) { +// and return pulls to merge +func threatRepo(baseBranchRule glob.Glob, client *gitlab.Client, repo *gitlab.Project) *pullCache { fmt.Printf("Handle Repository '%s'\n", repo.Name) var branchList []*gitlab.Branch @@ -178,7 +193,7 @@ func threatRepo(baseBranchRule glob.Glob, client *gitlab.Client, repo *gitlab.Pr if len(diff.Commits) == 0 { fmt.Printf(" branch '%s' is not ahead of '%s', skiping\n", baseBranch.Name, repo.DefaultBranch) - return + return nil } // check if pull already exist @@ -203,7 +218,7 @@ func threatRepo(baseBranchRule glob.Glob, client *gitlab.Client, repo *gitlab.Pr }) if err != nil { fmt.Printf(" could not create merge request '%s <- %s', skiping '%s'\n", repo.DefaultBranch, baseBranch.Name, repo.Name) - return + return nil } pullList = []*gitlab.MergeRequest{pull} } else { @@ -211,32 +226,38 @@ func threatRepo(baseBranchRule glob.Glob, client *gitlab.Client, repo *gitlab.Pr changes, _, err := client.MergeRequests.GetMergeRequestChanges(repo.ID, pullList[0].IID, nil) if err != nil { fmt.Printf(" could not obtain changes of merge request '%s', skiping '%s'\n", pullList[0].WebURL, repo.Name) - return + return nil } if len(changes.Changes) == 0 { fmt.Printf(" pull '%s' does not conatin changes, skiping\n", changes.WebURL) - return + return nil } } - // TODO: check and wait for pull to get ready + // since we had a match go to next repo ... and return pull + return &pullCache{ + repoID: repo.ID, + iid: pullList[0].IID, + webURL: pullList[0].WebURL, + } + } + } + return nil +} - // merge pull - if pull, _, err := client.MergeRequests.AcceptMergeRequest(repo.ID, pullList[0].IID, nil); err != nil { - fmt.Printf(" pull '%s' can not be merged: %v\n", pullList[0].WebURL, err) +func mergePulls(c *gitlab.Client, pulls []*pullCache) { + for i := range pulls { + if pull, _, err := c.MergeRequests.AcceptMergeRequest(pulls[i].repoID, pulls[i].iid, nil); err != nil { + fmt.Printf(" pull '%s' can not be merged: %v\n", pulls[i].webURL, err) + } else { + fmt.Printf(" pull '%s' got merged successfully\n", pull.WebURL) + + if err, _ := c.Branches.DeleteBranch(pulls[i].repoID, pull.SourceBranch); err != nil { + fmt.Printf(" branch '%s' can not be deleted: %v\n", pull.SourceBranch, err) } else { - fmt.Printf(" pull '%s' got merged successfully\n", pull.WebURL) - - if err, _ := client.Branches.DeleteBranch(repo.ID, baseBranch.Name); err != nil { - fmt.Printf(" branch '%s' can not be deleted: %v\n", baseBranch.Name, err) - } else { - fmt.Printf(" branch '%s' successfully deleted\n", baseBranch.Name) - } + fmt.Printf(" branch '%s' successfully deleted\n", pull.SourceBranch) } - - // since we had a match go to next repo ... - return } } } From 19019aa6653fb5009007b343533eb2361a431dd9 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Wed, 19 May 2021 23:53:29 +0200 Subject: [PATCH 3/3] next const --- main.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 7756706..a8484a4 100644 --- a/main.go +++ b/main.go @@ -30,7 +30,10 @@ type pullCache struct { webURL string } -const perPage = 10 +const ( + perPage = 10 + waitSecForMerge = 3 +) func loadCache() (cache *Cache) { // default values @@ -142,7 +145,7 @@ func main() { } fmt.Printf("\n\nwait 3sec for gitlab before merge created pulls\n") - time.Sleep(3 * time.Second) + time.Sleep(waitSecForMerge * time.Second) mergePulls(client, pullsToMergeCache) }