forked from pivotal-cf/cred-alert
-
Notifications
You must be signed in to change notification settings - Fork 0
/
syncer.go
102 lines (80 loc) · 1.92 KB
/
syncer.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
package rolodex
import (
"errors"
"os"
"code.cloudfoundry.org/lager"
"cred-alert/gitclient"
"cred-alert/metrics"
)
type syncer struct {
repoUrl string
repoPath string
gitClient gitclient.Client
teamRepo TeamRepository
logger lager.Logger
successCounter metrics.Counter
failureCounter metrics.Counter
fetchTimer metrics.Timer
}
type Syncer interface {
Sync()
}
func NewSyncer(logger lager.Logger, emitter metrics.Emitter, repoUrl, repoPath string, gitClient gitclient.Client, teamRepo TeamRepository) Syncer {
syncLogger := logger.Session("syncer", lager.Data{
"upstream": repoUrl,
"local": repoPath,
})
return &syncer{
repoUrl: repoUrl,
repoPath: repoPath,
gitClient: gitClient,
teamRepo: teamRepo,
logger: syncLogger,
successCounter: emitter.Counter("rolodex.syncer.fetch.success"),
failureCounter: emitter.Counter("rolodex.syncer.fetch.failure"),
fetchTimer: emitter.Timer("rolodex.syncer.fetch.time"),
}
}
const remoteMaster = "refs/remotes/origin/master"
func (s *syncer) Sync() {
if _, err := os.Stat(s.repoPath); os.IsNotExist(err) {
err := s.gitClient.Clone(s.repoUrl, s.repoPath)
if err != nil {
s.logger.Error("cloning", err)
return
}
s.teamRepo.Reload()
return
}
var fetchErr error
s.fetchTimer.Time(s.logger, func() {
heads, err := s.gitClient.Fetch(s.repoPath)
if err != nil {
s.logger.Error("fetching", err)
fetchErr = err
return
}
if len(heads) == 0 {
return
}
upstream, found := heads[remoteMaster]
if !found {
err := errors.New("no remote master branch found")
s.logger.Error("failed-to-find-updated-master", err)
fetchErr = err
return
}
err = s.gitClient.HardReset(s.repoPath, upstream[1])
if err != nil {
s.logger.Error("reseting", err)
fetchErr = err
return
}
})
if fetchErr != nil {
s.failureCounter.Inc(s.logger)
return
}
s.successCounter.Inc(s.logger)
s.teamRepo.Reload()
}