1
1
# -*- coding: utf-8 -*-
2
2
import argparse
3
+ import json
3
4
import os
4
5
from datetime import datetime
5
6
6
- import requests
7
- from libmozdata .vcs_map import download_mapfile
8
- from libmozdata .vcs_map import git_to_mercurial
9
7
from taskcluster .utils import slugId
10
8
11
9
from code_coverage_bot .secrets import secrets
12
- from code_coverage_tools . taskcluter import TaskclusterConfig
10
+ from code_coverage_bot . taskcluster import taskcluster_config
13
11
14
- CODECOV_URL = "https://codecov.io/api/gh/marco-c/gecko-dev/commit"
15
12
MC_REPO = "https://hg.mozilla.org/mozilla-central"
16
- HOOK_GROUP = "project-releng"
17
- HOOK_ID = "services-{app_channel}-codecoverage/bot-generation"
18
-
19
- taskcluster = TaskclusterConfig ()
20
- taskcluster .auth (
21
- os .environ ["TASKCLUSTER_CLIENT_ID" ], os .environ ["TASKCLUSTER_ACCESS_TOKEN" ]
22
- )
23
- secrets .load (os .environ ["TASKCLUSTER_SECRET" ])
24
-
25
-
26
- def list_commits (codecov_token , maximum = None , unique = None , skip_commits = []):
27
- """
28
- List all the commits ingested on codecov
29
- """
30
- assert unique in (None , "week" , "day" )
31
- params = {"access_token" : codecov_token , "page" : 1 }
32
- nb = 0
33
- dates = set ()
34
- while True :
35
- resp = requests .get (CODECOV_URL , params = params )
36
- resp .raise_for_status ()
37
- data = resp .json ()
38
-
39
- if not data ["commits" ]:
40
- return
41
-
42
- for commit in data ["commits" ]:
43
-
44
- # Skip commit if that day or week has already been processed earlier
45
- day = datetime .strptime (commit ["timestamp" ], "%Y-%m-%d %H:%M:%S" ).date ()
46
- week = day .isocalendar ()[:2 ]
47
- if unique == "day" and day in dates :
48
- continue
49
- if unique == "week" and week in dates :
50
- continue
51
- dates .add (day )
52
- dates .add (week )
53
-
54
- # Convert git to mercurial revision
55
- commit ["mercurial" ] = git_to_mercurial (commit ["commitid" ])
56
- if commit ["mercurial" ] in skip_commits :
57
- print (
58
- "Skipping already processed commit {}" .format (commit ["mercurial" ])
59
- )
60
- continue
61
-
62
- yield commit
63
- nb += 1
64
-
65
- if maximum is not None and nb >= maximum :
66
- return
67
-
68
- params ["page" ] += 1
13
+ HOOK_GROUP = "project-relman"
14
+ HOOK_ID = "code-coverage-{app_channel}"
69
15
70
16
71
17
def trigger_task (task_group_id , commit ):
72
18
"""
73
19
Trigger a code coverage task to build covdir at a specified revision
74
20
"""
75
- assert "mercurial" in commit
76
- name = "covdir {} - {} - {}" .format (
77
- secrets [secrets .APP_CHANNEL ], commit [ "timestamp" ] , commit ["mercurial " ]
21
+ date = datetime . fromtimestamp ( commit [ "date" ]). strftime ( "%Y-%m-%d" )
22
+ name = "covdir with suites on {} - {} - {}" .format (
23
+ secrets [secrets .APP_CHANNEL ], date , commit ["changeset " ]
78
24
)
79
- hooks = taskcluster .get_service ("hooks" )
25
+ hooks = taskcluster_config .get_service ("hooks" )
80
26
payload = {
81
27
"REPOSITORY" : MC_REPO ,
82
- "REVISION" : commit ["mercurial " ],
28
+ "REVISION" : commit ["changeset " ],
83
29
"taskGroupId" : task_group_id ,
84
30
"taskName" : name ,
85
31
}
@@ -91,11 +37,6 @@ def main():
91
37
# CLI args
92
38
parser = argparse .ArgumentParser ()
93
39
parser .add_argument ("--nb-tasks" , type = int , default = 5 , help = "NB of tasks to create" )
94
- parser .add_argument (
95
- "--unique" ,
96
- choices = ("day" , "week" ),
97
- help = "Trigger only one task per day or week" ,
98
- )
99
40
parser .add_argument (
100
41
"--group" , type = str , default = slugId (), help = "Task group to create/update"
101
42
)
@@ -106,20 +47,17 @@ def main():
106
47
help = "List actions without triggering any new task" ,
107
48
)
108
49
parser .add_argument (
109
- "--codecov-token" ,
110
- type = str ,
111
- default = os .environ .get ("CODECOV_TOKEN" ),
112
- help = "Codecov access token" ,
50
+ "history" , type = open , help = "JSON payload of /v2/history endpoint"
113
51
)
114
52
args = parser .parse_args ()
115
53
116
- # Download revision mapper database
117
- print ( "Downloading revision database..." )
118
- download_mapfile ( )
54
+ # Setup Taskcluster
55
+ taskcluster_config . auth ( )
56
+ secrets . load ( os . environ [ "TASKCLUSTER_SECRET" ] )
119
57
120
58
# List existing tags & commits
121
59
print ("Group" , args .group )
122
- queue = taskcluster .get_service ("queue" )
60
+ queue = taskcluster_config .get_service ("queue" )
123
61
try :
124
62
group = queue .listTaskGroup (args .group )
125
63
commits = [
@@ -136,14 +74,24 @@ def main():
136
74
print ("Invalid task group : {}" .format (e ))
137
75
commits = []
138
76
77
+ # Read the history file
78
+ history = json .load (args .history )
79
+
139
80
# Trigger a task for each commit
140
- for commit in list_commits (args .codecov_token , args .nb_tasks , args .unique , commits ):
141
- print ("Triggering commit {mercurial} from {timestamp}" .format (** commit ))
81
+ nb = 0
82
+ for commit in history :
83
+ if nb >= args .nb_tasks :
84
+ break
85
+ if commit in commits :
86
+ print ("Skipping {commit {changeset} from {date}" .format (** commit ))
87
+ continue
88
+ print ("Triggering commit {changeset} from {date}" .format (** commit ))
142
89
if args .dry_run :
143
90
print (">>> No trigger on dry run" )
144
91
else :
145
92
out = trigger_task (args .group , commit )
146
93
print (">>>" , out ["status" ]["taskId" ])
94
+ nb += 1
147
95
148
96
149
97
if __name__ == "__main__" :
0 commit comments