-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathgitlab_sync.go
130 lines (108 loc) · 2.81 KB
/
gitlab_sync.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package main
import (
"fmt"
"regexp"
"strings"
"github.com/sirupsen/logrus"
"github.com/mendersoftware/integration-test-runner/git"
)
type branchDepth int
const fullDepth = -1
func shouldStartPipeline(branchName string) bool {
startByName := []string{
"master",
"staging",
"production",
"hosted",
"main",
}
for _, n := range startByName {
if branchName == n {
return true
}
}
startByRegEx := []*regexp.Regexp{
regexp.MustCompile(`^[0-9]+\.[0-9]+\.x`),
regexp.MustCompile(`^pr_[0-9]+$`),
}
for _, n := range startByRegEx {
if n.MatchString(branchName) {
return true
}
}
return false
}
func syncRemoteRef(log *logrus.Entry, org, repo, ref string, conf *config) error {
remoteURLGitLab, err := getRemoteURLGitLab(org, repo)
if err != nil {
return fmt.Errorf("getRemoteURLGitLab returned error: %s", err.Error())
}
state, err := git.Commands(
git.Command("init", "."),
git.Command("remote", "add", "github",
getRemoteURLGitHub(conf.githubProtocol, conf.githubOrganization, repo)),
git.Command("remote", "add", "gitlab", remoteURLGitLab),
)
defer state.Cleanup()
if err != nil {
return err
}
depths := []branchDepth{5, 10, 50, 100, fullDepth} // 0 = infinite depth
for _, depth := range depths {
log.Infof("Fetching branch at depth: %d", depth)
err := fetchCmd(ref, repo, state, depth)
if err == nil {
break
}
log.Infof("Failed to sync the remotes at depth: %d", depth)
}
log.Infof("Pushed ref to GitLab: %s:%s", repo, ref)
return nil
}
func setDepth(depth branchDepth) string {
switch depth {
case fullDepth:
return ""
default:
return fmt.Sprintf("--depth=%d", depth)
}
}
func fetchCmd(ref, repo string, state *git.State, depth branchDepth) error {
if strings.Contains(ref, "tags") {
tagName := strings.TrimPrefix(ref, "refs/tags/")
err := git.Command("fetch", setDepth(depth), "--tags", "github").With(state).Run()
if err != nil {
return err
}
err = git.Command("push", "-f", "gitlab", tagName).With(state).Run()
if err != nil {
return err
}
} else if strings.Contains(ref, "heads") {
branchName := strings.TrimPrefix(ref, "refs/heads/")
err := git.Command("fetch", setDepth(depth), "github").With(state).Run()
if err != nil {
return err
}
err = git.Command("checkout", "-b", branchName, "github/"+branchName).With(state).Run()
if err != nil {
return err
}
// For the push, add option ci.skip for mender-qa
cmdArgs := []string{"push", "-f"}
if repo == "mender-qa" {
cmdArgs = append(cmdArgs, "-o", "ci.skip")
}
if !shouldStartPipeline(branchName) {
cmdArgs = append(cmdArgs, "-o", "ci.skip")
}
cmdArgs = append(cmdArgs, "gitlab", branchName)
err = git.Command(cmdArgs...).With(state).Run()
if err != nil {
return err
}
} else {
return fmt.Errorf("Unrecognized ref %s", ref)
}
return nil
}