Skip to content
This repository was archived by the owner on Oct 25, 2024. It is now read-only.

Commit 0276b5b

Browse files
authored
Add a roller for WebRTC. (#506)
1 parent 3be7b71 commit 0276b5b

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

scripts/roll_webrtc.py

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# Copyright (C) <2021> Intel Corporation
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
'''Script to roll owt-deps-webrtc revision.
6+
7+
This script is expected to be ran by GitHub action runners when a new change is
8+
committed to owt-deps-webrtc. It updates the revision in DEPS to use the latest
9+
owt-deps-webrtc. A change will be submitted owt-bot/owt-client-native's roll
10+
branch. And a pull request will be opened if it doesn't exist.
11+
'''
12+
13+
import os
14+
import sys
15+
import argparse
16+
import re
17+
import subprocess
18+
import requests
19+
import json
20+
21+
SRC_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
22+
DEPS_PATH = os.path.join(SRC_PATH, 'DEPS')
23+
# Regex expression to match commit hash of owt-deps-webrtc.
24+
REVISION_RE = re.compile(
25+
r"(?<=Var\('deps_webrtc_git'\) \+ '/owt-deps-webrtc' \+ '@' \+ ')[0-9a-f]{40}(?=',)")
26+
TARGET_BRANCH = 'roll'
27+
28+
29+
def webrtc_revision():
30+
'''Return current owt-deps-webrtc revision in DEPS.'''
31+
with open(DEPS_PATH, 'r') as f:
32+
deps = f.read()
33+
return re.search(REVISION_RE, deps).group(0)
34+
35+
36+
def roll(revision):
37+
'''Update DEPS.'''
38+
with open(DEPS_PATH, 'r+') as f:
39+
deps = f.read()
40+
new_deps = re.sub(REVISION_RE, revision, deps)
41+
f.seek(0)
42+
f.truncate()
43+
f.write(new_deps)
44+
return
45+
46+
47+
def commit_message(old_revision, new_revision):
48+
message = 'Roll WebRTC revision %s..%s.' % (
49+
old_revision[:8], new_revision[:8])
50+
return message
51+
52+
53+
def commit(old_revision, new_revision):
54+
'''Create a git commit.'''
55+
message = commit_message(old_revision, new_revision)
56+
commands = [['git', 'config', 'user.name', 'owt-bot'], ['git', 'config', 'user.email',
57+
58+
# Create a git commit with message above.
59+
commands.extend([['git', 'add', 'DEPS'], ['git', 'commit', '-m', message]])
60+
# Force push because when a new version of owt-deps-webrtc is available, the old commit could be rewritten.
61+
commands.append(['git', 'push', '-f', 'https://github.com/owt-bot/owt-client-native.git',
62+
'HEAD:refs/heads/%s' % TARGET_BRANCH])
63+
# Run commands.
64+
for c in commands:
65+
ret = subprocess.call(c, cwd=SRC_PATH)
66+
if ret != 0:
67+
return ret
68+
return 0
69+
70+
71+
def pr(old_revision, new_revision, base_branch, token):
72+
'''Create a pull request. If a PR is already open for webrtc roller, do nothing.'''
73+
# Check if a pull request exists.
74+
# REST API ref: https://docs.github.com/en/rest/reference/pulls#list-pull-requests
75+
params = {'base': base_branch, 'head': TARGET_BRANCH, 'state': "open"}
76+
url = 'https://api.github.com/repos/open-webrtc-toolkit/owt-client-native/pulls'
77+
headers = {
78+
"Authorization": "token %s" % token,
79+
"Accept": "application/vnd.github.v3+json"
80+
}
81+
response = requests.get(url, params=params, headers=headers)
82+
if response.status_code != 200:
83+
print('Failed to get pull request list, REST response status code is %d.' % (
84+
response.status_code), file=sys.stderr)
85+
return -1
86+
fetched_prs = response.json()
87+
if len(fetched_prs) > 0:
88+
for pr in fetched_prs:
89+
if pr['user']['login'] == 'owt-bot':
90+
# Update existing PR.
91+
update_url = pr['url']
92+
print(update_url)
93+
update_params = {'title': commit_message(
94+
old_revision, new_revision)}
95+
update_response = requests.patch(
96+
update_url, json=update_params, headers=headers)
97+
print(json.dumps(update_params))
98+
if update_response.status_code != 200:
99+
print(update_response.headers)
100+
print(update_response.content)
101+
print('Failed to update pull request, REST response status code is %d.' % (
102+
update_response.status_code), file=sys.stderr)
103+
return -1
104+
return 0
105+
# Create a new PR.
106+
create_params = {'title': commit_message(
107+
old_revision, new_revision), 'head': TARGET_BRANCH, 'base': base_branch}
108+
create_response = requests.post(url, json=create_params, headers=headers)
109+
if create_response.status_code != 201:
110+
print('Failed to create pull request, REST response status code is %d.' % (
111+
create_response.status_code), file=sys.stderr)
112+
return -1
113+
return 0
114+
115+
116+
def main():
117+
parser = argparse.ArgumentParser()
118+
parser.add_argument(
119+
'--revision', help='owt-deps-webrtc revision to roll to.')
120+
parser.add_argument(
121+
'--base_branch', help='Pull request will be merged to this branch.', default='main')
122+
parser.add_argument(
123+
'--token', help='Personal access token to create pull requests.')
124+
opts = parser.parse_args()
125+
old_revision = webrtc_revision()
126+
ret = roll(opts.revision) or commit(old_revision, opts.revision) or pr(
127+
old_revision, opts.revision, opts.base_branch, opts.token)
128+
return ret
129+
130+
131+
if __name__ == '__main__':
132+
sys.exit(main())

0 commit comments

Comments
 (0)