-
Notifications
You must be signed in to change notification settings - Fork 21
/
project.go
102 lines (82 loc) · 1.56 KB
/
project.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 dashboard
import (
"log"
"sync"
"time"
)
var defaultProjectMap = sync.Map{}
func initProjects() {
for _, p := range defaultProjects {
defaultProjectMap.Store(p.Name, p)
}
go resetProjectsPeriodically()
go prefillAllProjectsFromGitHub()
}
func resetProjectsPeriodically() {
for range time.Tick(time.Hour / 2) {
log.Println("resetting projects' cache")
resetProjects()
prefillAllProjectsFromGitHub()
}
}
func resetProjects() {
for _, p := range defaultProjects {
p.reset()
}
}
type Project struct {
GlobalRelayID string `json:"id"`
Name string `json:"name"`
Nwo string `json:"nwo"`
Branch string `json:"branch"`
GemName string `json:"gem_name"`
Stars int `json:"star_count"`
Gem *RubyGem `json:"gem"`
GitHub *GitHub `json:"github"`
fetched bool
}
func (p *Project) fetch() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
p.fetchGitHubData()
wg.Done()
}()
wg.Add(1)
go func() {
p.fetchRubyGemData()
wg.Done()
}()
wg.Wait()
p.fetched = true
}
func (p *Project) fetchRubyGemData() {
if p.Gem != nil {
return
}
p.Gem = <-rubygem(p.GemName)
}
func (p *Project) fetchGitHubData() {
if p.GitHub != nil {
return
}
p.GitHub = <-github(p.GlobalRelayID)
}
func (p *Project) reset() {
p.fetched = false
p.Gem = nil
p.GitHub = nil
}
func getProject(name string) *Project {
if p, ok := defaultProjectMap.Load(name); ok {
proj := p.(*Project)
if !proj.fetched {
proj.fetch()
}
return proj
}
return nil
}
func getProjects() []*Project {
return defaultProjects
}