-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcheck_dependency.py
137 lines (110 loc) · 4.36 KB
/
check_dependency.py
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
import re
from github import Auth, Github
from github.PullRequestReview import PullRequestReview
import private_config
import tools
auth = Auth.Token(private_config.TOKEN)
g = Github(auth=auth)
repo = g.get_repo("OCA/OpenUpgrade")
# Get Opened PRs
done_prs, opened_prs = tools._get_prs(repo, private_config.VERSION)
# Get Done modules
module_coverage = tools._get_module_coverage(repo, private_config.VERSION)
def module_ok(module_name):
return module_coverage[module_name] in ["nothing_to_do", "done"]
def _extract_migration_comment(migration_message):
if not migration_message:
return "", "", ""
text_reg = (
r"(?P<before>(\r|\n|.)*)"
r"<dependency>"
"(?P<current_text>(\n|.)*)"
r"<\/dependency>"
r"(?P<after>(\r|\n|.)*)"
)
res = re.match(text_reg, migration_message.body)
if not res:
return "", "", ""
groups = res.groupdict()
return groups["before"], groups["current_text"], groups["after"]
def _get_comment_or_review(pr, content):
comments = [x for x in pr.get_issue_comments() if content in x.body]
if comments:
return comments[0]
reviews = [x for x in pr.get_reviews() if content in x.body]
return reviews and reviews[0] or False
for module_name, pr_number in opened_prs.items():
tools._logger.info(f"Handle PR #{pr_number} for module '{module_name}'")
manifest = tools._get_manifest_module(repo, private_config.VERSION, module_name)
if not manifest:
# the module disappeared in the new version
continue
depends = manifest.get("depends")
pr = repo.get_pull(pr_number)
migration_message = _get_comment_or_review(pr, "ocabot migration")
current_labels = [x.name for x in pr.labels]
new_labels = current_labels.copy()
log_message = f"PR #{pr_number} for {module_name}:"
if all([module_ok(x) for x in depends]):
# all dependencies are OK, mark the PR as OK.
label_to_remove = "Blocked by dependency"
label_to_add = "Dependency OK"
else:
# mark the PR as blocked
label_to_remove = "Dependency OK"
label_to_add = "Blocked by dependency"
if label_to_remove in new_labels:
log_message += f" Remove '{label_to_remove}'"
new_labels.remove(label_to_remove)
if label_to_add not in new_labels:
log_message += f" Set '{label_to_add}'"
new_labels.append(label_to_add)
if new_labels != current_labels:
tools._logger.info(log_message)
pr.set_labels(*new_labels)
if not migration_message:
tools._logger.warning(f"Migration message not found in {pr.number}")
continue
before_text, current_text, after_text = _extract_migration_comment(
migration_message
)
dep_modules_ok = [x for x in depends if x in done_prs]
dep_modules_pending = [x for x in depends if x in opened_prs]
dep_modules_ko = [
x for x in depends if x not in dep_modules_ok + dep_modules_pending
]
new_text = ""
for dep_module in dep_modules_pending:
new_text += f"\n- {dep_module} : #{opened_prs[dep_module]}"
for dep_module in dep_modules_ko:
new_text += f"\n- {dep_module} : TODO"
if new_text:
new_text = "Depends on : \n" + new_text
new_body = ""
if not current_text and new_text:
tools._logger.info(
f"PR#{pr.number} - {pr.title}: ADDING Text in migration message."
)
if migration_message.user.login != private_config.LOGIN:
tools._logger.warning(
f"The message has been written by @{migration_message.user.login}"
)
new_body = (
migration_message.body + "\n\n<dependency>" + new_text + "</dependency>"
)
elif new_text != current_text:
tools._logger.info(
f"PR#{pr.number} - {pr.title}: Replacing text in migration message."
)
if migration_message.user.login != private_config.LOGIN:
tools._logger.warning(
f"The message has been written by @{migration_message.user.login}"
)
new_body = (
before_text + "<dependency>" + new_text + "</dependency>" + after_text
)
if new_body:
if type(migration_message) is PullRequestReview:
tools._logger.warning("Unable to edit the PR due to PyGithub limitation.")
continue
migration_message.edit(new_body)