This repository has been archived by the owner on Jun 2, 2023. It is now read-only.
/
main.go
142 lines (118 loc) · 3.1 KB
/
main.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
131
132
133
134
135
136
137
138
139
140
141
142
package main
import (
"bufio"
"encoding/json"
"flag"
"fmt"
"log"
"os"
"strconv"
"time"
"github.com/golangci/golangci-api/pkg/api/models"
"github.com/pkg/errors"
"github.com/golangci/golangci-api/internal/shared/config"
"github.com/golangci/golangci-api/internal/shared/db/gormdb"
"github.com/golangci/golangci-api/internal/shared/logutil"
"github.com/jinzhu/gorm"
uuid "github.com/satori/go.uuid"
)
func main() {
inputFile := flag.String("input-file", "amp.json", "Amplitude json file path")
flag.Parse()
if err := importAmplitude(*inputFile); err != nil {
log.Fatal(err)
}
}
func importAmplitude(filePath string) error {
f, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("can't open file %s: %s", filePath, err)
}
defer f.Close()
s := bufio.NewScanner(f)
for s.Scan() {
eventLine := s.Text()
if err = importEvent(eventLine); err != nil {
return fmt.Errorf("can't import event %s: %s", eventLine, err)
}
}
return nil
}
type EventTime time.Time
func (et *EventTime) UnmarshalJSON(data []byte) error {
s, err := strconv.Unquote(string(data))
if err != nil {
return err
}
layouts := []string{"2006-01-02 15:04:05.000000", "2006-01-02 15:04:05"}
for _, layout := range layouts {
t, err := time.Parse(layout, s)
if err != nil {
continue
}
*et = EventTime(t)
return nil
}
return fmt.Errorf("can't parse time %s", s)
}
type Event struct {
EventProperties struct {
RepoName string
TotalIssues int
Status string
PRNumber int
} `json:"event_properties"`
EventTime EventTime `json:"event_time"`
}
func importEvent(eventJSON string) error {
var event Event
if err := json.Unmarshal([]byte(eventJSON), &event); err != nil {
return fmt.Errorf("can't unmarshal event json: %s", err)
}
if event.EventProperties.RepoName == "" { // not interesting event type
return nil
}
et := time.Time(event.EventTime)
if et.After(time.Date(2018, 04, 13, 0, 0, 0, 0, time.UTC)) {
// after that time we already save analyzes into pg
return nil
}
return storeEvent(&event)
}
func storeEvent(event *Event) error {
log := logutil.NewStderrLog("")
cfg := config.NewEnvConfig(log)
db, err := gormdb.GetDB(cfg, log, "")
if err != nil {
return errors.Wrap(err, "failed to get gorm db")
}
var gr models.Repo
err = models.NewRepoQuerySet(db.Unscoped()).
FullNameEq(event.EventProperties.RepoName).
One(&gr)
if err != nil {
return fmt.Errorf("can't find repo %s: %s", event.EventProperties.RepoName, err)
}
et := time.Time(event.EventTime)
status := "processed/success"
if event.EventProperties.Status != "ok" {
status = "processed/failure"
}
ga := models.PullRequestAnalysis{
Model: gorm.Model{
CreatedAt: et,
UpdatedAt: et,
},
RepoID: gr.ID,
PullRequestNumber: event.EventProperties.PRNumber,
GithubDeliveryGUID: fmt.Sprintf("fake_%s", uuid.NewV4().String()),
Status: status,
ReportedIssuesCount: event.EventProperties.TotalIssues,
// TODO: ResultJSON
}
if err = ga.Create(db); err != nil {
return fmt.Errorf("can't create pull request analysis: %s", err)
}
log.Infof("ga is %#v", ga)
return nil
}