/
refs.go
107 lines (89 loc) · 2.35 KB
/
refs.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
package controller
import (
"context"
"dario.cat/mergo"
log "github.com/sirupsen/logrus"
"github.com/mvisonneau/gitlab-ci-pipelines-exporter/pkg/schemas"
)
// GetRefs ..
func (c *Controller) GetRefs(ctx context.Context, p schemas.Project) (
refs schemas.Refs,
err error,
) {
var pulledRefs schemas.Refs
refs = make(schemas.Refs)
if p.Pull.Refs.Branches.Enabled {
// If one of these parameter is set, we will need to fetch the branches from the
// pipelines API instead of the branches one
if !p.Pull.Refs.Branches.ExcludeDeleted ||
p.Pull.Refs.Branches.MostRecent > 0 ||
p.Pull.Refs.Branches.MaxAgeSeconds > 0 {
if pulledRefs, err = c.Gitlab.GetRefsFromPipelines(ctx, p, schemas.RefKindBranch); err != nil {
return
}
} else {
if pulledRefs, err = c.Gitlab.GetProjectBranches(ctx, p); err != nil {
return
}
}
if err = mergo.Merge(&refs, pulledRefs); err != nil {
return
}
}
if p.Pull.Refs.Tags.Enabled {
// If one of these parameter is set, we will need to fetch the tags from the
// pipelines API instead of the tags one
if !p.Pull.Refs.Tags.ExcludeDeleted ||
p.Pull.Refs.Tags.MostRecent > 0 ||
p.Pull.Refs.Tags.MaxAgeSeconds > 0 {
if pulledRefs, err = c.Gitlab.GetRefsFromPipelines(ctx, p, schemas.RefKindTag); err != nil {
return
}
} else {
if pulledRefs, err = c.Gitlab.GetProjectTags(ctx, p); err != nil {
return
}
}
if err = mergo.Merge(&refs, pulledRefs); err != nil {
return
}
}
if p.Pull.Refs.MergeRequests.Enabled {
if pulledRefs, err = c.Gitlab.GetRefsFromPipelines(
ctx,
p,
schemas.RefKindMergeRequest,
); err != nil {
return
}
if err = mergo.Merge(&refs, pulledRefs); err != nil {
return
}
}
return
}
// PullRefsFromProject ..
func (c *Controller) PullRefsFromProject(ctx context.Context, p schemas.Project) error {
refs, err := c.GetRefs(ctx, p)
if err != nil {
return err
}
for _, ref := range refs {
refExists, err := c.Store.RefExists(ctx, ref.Key())
if err != nil {
return err
}
if !refExists {
log.WithFields(log.Fields{
"project-name": ref.Project.Name,
"ref": ref.Name,
"ref-kind": ref.Kind,
}).Info("discovered new ref")
if err = c.Store.SetRef(ctx, ref); err != nil {
return err
}
c.ScheduleTask(ctx, schemas.TaskTypePullRefMetrics, string(ref.Key()), ref)
}
}
return nil
}