1
1
#!/usr/bin/env python3
2
2
import os
3
- import sys
4
3
import re
5
4
import subprocess
5
+ import sys
6
+
6
7
import requests
7
8
import simplejson
8
9
9
- github_token = os .environ ['GITHUB_TOKEN' ]
10
- auth = (github_token , 'x-oauth-basic' )
11
- repo = 'getredash/redash'
10
+ github_token = os .environ ["GITHUB_TOKEN" ]
11
+ auth = (github_token , "x-oauth-basic" )
12
+ repo = "getredash/redash"
13
+
12
14
13
15
def _github_request (method , path , params = None , headers = {}):
14
- if not path .startswith (' https://api.github.com' ):
16
+ if not path .startswith (" https://api.github.com" ):
15
17
url = "https://api.github.com/{}" .format (path )
16
18
else :
17
19
url = path
@@ -22,15 +24,18 @@ def _github_request(method, path, params=None, headers={}):
22
24
response = requests .request (method , url , data = params , auth = auth )
23
25
return response
24
26
27
+
25
28
def exception_from_error (message , response ):
26
- return Exception ("({}) {}: {}" .format (response .status_code , message , response .json ().get ('message' , '?' )))
29
+ return Exception ("({}) {}: {}" .format (response .status_code , message , response .json ().get ("message" , "?" )))
30
+
27
31
28
32
def rc_tag_name (version ):
29
33
return "v{}-rc" .format (version )
30
34
35
+
31
36
def get_rc_release (version ):
32
37
tag = rc_tag_name (version )
33
- response = _github_request (' get' , ' repos/{}/releases/tags/{}' .format (repo , tag ))
38
+ response = _github_request (" get" , " repos/{}/releases/tags/{}" .format (repo , tag ))
34
39
35
40
if response .status_code == 404 :
36
41
return None
@@ -39,84 +44,101 @@ def get_rc_release(version):
39
44
40
45
raise exception_from_error ("Unknown error while looking RC release: " , response )
41
46
47
+
42
48
def create_release (version , commit_sha ):
43
49
tag = rc_tag_name (version )
44
50
45
51
params = {
46
- ' tag_name' : tag ,
47
- ' name' : "{} - RC" .format (version ),
48
- ' target_commitish' : commit_sha ,
49
- ' prerelease' : True
52
+ " tag_name" : tag ,
53
+ " name" : "{} - RC" .format (version ),
54
+ " target_commitish" : commit_sha ,
55
+ " prerelease" : True ,
50
56
}
51
57
52
- response = _github_request (' post' , ' repos/{}/releases' .format (repo ), params )
58
+ response = _github_request (" post" , " repos/{}/releases" .format (repo ), params )
53
59
54
60
if response .status_code != 201 :
55
61
raise exception_from_error ("Failed creating new release" , response )
56
62
57
63
return response .json ()
58
64
65
+
59
66
def upload_asset (release , filepath ):
60
- upload_url = release [' upload_url' ].replace (' {?name,label}' , '' )
61
- filename = filepath .split ('/' )[- 1 ]
67
+ upload_url = release [" upload_url" ].replace (" {?name,label}" , "" )
68
+ filename = filepath .split ("/" )[- 1 ]
62
69
63
70
with open (filepath ) as file_content :
64
- headers = {'Content-Type' : 'application/gzip' }
65
- response = requests .post (upload_url , file_content , params = {'name' : filename }, headers = headers , auth = auth , verify = False )
71
+ headers = {"Content-Type" : "application/gzip" }
72
+ response = requests .post (
73
+ upload_url , file_content , params = {"name" : filename }, headers = headers , auth = auth , verify = False
74
+ )
66
75
67
76
if response .status_code != 201 : # not 200/201/...
68
- raise exception_from_error (' Failed uploading asset' , response )
77
+ raise exception_from_error (" Failed uploading asset" , response )
69
78
70
79
return response
71
80
81
+
72
82
def remove_previous_builds (release ):
73
- for asset in release [' assets' ]:
74
- response = _github_request (' delete' , asset [' url' ])
83
+ for asset in release [" assets" ]:
84
+ response = _github_request (" delete" , asset [" url" ])
75
85
if response .status_code != 204 :
76
86
raise exception_from_error ("Failed deleting asset" , response )
77
87
88
+
78
89
def get_changelog (commit_sha ):
79
- latest_release = _github_request (' get' , ' repos/{}/releases/latest' .format (repo ))
90
+ latest_release = _github_request (" get" , " repos/{}/releases/latest" .format (repo ))
80
91
if latest_release .status_code != 200 :
81
- raise exception_from_error (' Failed getting latest release' , latest_release )
92
+ raise exception_from_error (" Failed getting latest release" , latest_release )
82
93
83
94
latest_release = latest_release .json ()
84
- previous_sha = latest_release ['target_commitish' ]
85
-
86
- args = ['git' , '--no-pager' , 'log' , '--merges' , '--grep' , 'Merge pull request' , '--pretty=format:"%h|%s|%b|%p"' , '{}...{}' .format (previous_sha , commit_sha )]
95
+ previous_sha = latest_release ["target_commitish" ]
96
+
97
+ args = [
98
+ "git" ,
99
+ "--no-pager" ,
100
+ "log" ,
101
+ "--merges" ,
102
+ "--grep" ,
103
+ "Merge pull request" ,
104
+ '--pretty=format:"%h|%s|%b|%p"' ,
105
+ "{}...{}" .format (previous_sha , commit_sha ),
106
+ ]
87
107
log = subprocess .check_output (args )
88
- changes = ["Changes since {}:" .format (latest_release [' name' ])]
108
+ changes = ["Changes since {}:" .format (latest_release [" name" ])]
89
109
90
- for line in log .split (' \n ' ):
110
+ for line in log .split (" \n " ):
91
111
try :
92
- sha , subject , body , parents = line [1 :- 1 ].split ('|' )
112
+ sha , subject , body , parents = line [1 :- 1 ].split ("|" )
93
113
except ValueError :
94
114
continue
95
115
96
116
try :
97
- pull_request = re .match ("Merge pull request #(\d+)" , subject ).groups ()[0 ]
117
+ pull_request = re .match (r "Merge pull request #(\d+)" , subject ).groups ()[0 ]
98
118
pull_request = " #{}" .format (pull_request )
99
- except Exception as ex :
119
+ except Exception :
100
120
pull_request = ""
101
121
102
- author = subprocess .check_output ([' git' , ' log' , '-1' , '--pretty=format:"%an"' , parents .split (' ' )[- 1 ]])[1 :- 1 ]
122
+ author = subprocess .check_output ([" git" , " log" , "-1" , '--pretty=format:"%an"' , parents .split (" " )[- 1 ]])[1 :- 1 ]
103
123
104
124
changes .append ("{}{}: {} ({})" .format (sha , pull_request , body .strip (), author ))
105
125
106
126
return "\n " .join (changes )
107
127
128
+
108
129
def update_release_commit_sha (release , commit_sha ):
109
130
params = {
110
- ' target_commitish' : commit_sha ,
131
+ " target_commitish" : commit_sha ,
111
132
}
112
133
113
- response = _github_request (' patch' , ' repos/{}/releases/{}' .format (repo , release ['id' ]), params )
134
+ response = _github_request (" patch" , " repos/{}/releases/{}" .format (repo , release ["id" ]), params )
114
135
115
136
if response .status_code != 200 :
116
137
raise exception_from_error ("Failed updating commit sha for existing release" , response )
117
138
118
139
return response .json ()
119
140
141
+
120
142
def update_release (version , build_filepath , commit_sha ):
121
143
try :
122
144
release = get_rc_release (version )
@@ -125,21 +147,22 @@ def update_release(version, build_filepath, commit_sha):
125
147
else :
126
148
release = create_release (version , commit_sha )
127
149
128
- print ("Using release id: {}" .format (release ['id' ]))
150
+ print ("Using release id: {}" .format (release ["id" ]))
129
151
130
152
remove_previous_builds (release )
131
153
response = upload_asset (release , build_filepath )
132
154
133
155
changelog = get_changelog (commit_sha )
134
156
135
- response = _github_request (' patch' , release [' url' ], {' body' : changelog })
157
+ response = _github_request (" patch" , release [" url" ], {" body" : changelog })
136
158
if response .status_code != 200 :
137
159
raise exception_from_error ("Failed updating release description" , response )
138
160
139
161
except Exception as ex :
140
162
print (ex )
141
163
142
- if __name__ == '__main__' :
164
+
165
+ if __name__ == "__main__" :
143
166
commit_sha = sys .argv [1 ]
144
167
version = sys .argv [2 ]
145
168
filepath = sys .argv [3 ]
0 commit comments