Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

action: Document errors properly #5

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 26 additions & 12 deletions action.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ def stdout(msg):

def die(s):
print(f'ERROR: {s}', file=sys.stderr)
print(f'\nMore information about the process can ben found in: '
f'\nhttps://nordicsemi.atlassian.net/wiki/spaces/NCS/pages/108201225/Pull+Requests')
if die_switch:
# Switch back
stdout('die: switch')
Expand Down Expand Up @@ -156,14 +158,14 @@ def fetch_pr(repo, prn, target):
if pr.is_merged():
die(f'PR #{prn} is merged, please use [nrf fromtree] instead')
if pr.state == 'closed':
die(f'PR #{prn} is closed and not merged')
die(f'PR #{prn} is closed and not merged, please open a new PR')

revs = dict()
for rev in pr.get_reviews():
revs[rev.user.login] = rev.state
for k,v in revs.items():
if "CHANGES_REQUESTED" in v:
die(f'PR #{prn} has requested changes')
die(f'PR #{prn} has requested changes, please resolve those')

shas = [c.sha for c in pr.get_commits()]
ref = f'nrf/pull/{prn}'
Expand Down Expand Up @@ -211,19 +213,21 @@ def check_commit(urepo, ubranch, target, sha, merge):
m = re.match(r'^(Revert\s+\")?\[nrf (mergeup|fromtree|fromlist|noup)\]\s+',
title)
if not m:
die(f'{sha}: Title does not contain a sauce tag')
die(f'{sha}: Title does not contain a sauce tag '
f'(mergeup|fromtree|fromlist|noup)')
revert = m.group(1)
tag = m.group(2)
if not tag:
die(f'{sha}: Title does not contain a sauce tag')
die(f'{sha}: Title does not contain a sauce tag '
f'(mergeup|fromtree|fromlist|noup)')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd add:

Suggested change
f'(mergeup|fromtree|fromlist|noup)')
f'([mergeup] |[fromtree] |[fromlist] |[noup]) ')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If [ ] is used, then nrf should be added. And it should be the same in L217 and L222.


if revert:
if tag == 'mergeup':
die('Mergeup cannot be reverted')
die('Mergeup commits cannot be reverted')
Copy link

@thst-nordic thst-nordic Nov 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know reverting merge commits can be tricky if not on the HEAD.
Should we explicitly ban them instead of just omitting it from
https://nordicsemi.atlassian.net/wiki/spaces/NCS/pages/108201225/Pull+Requests#revert

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In reality merge commits are only ever handled by Vestavind in upmerges, because they are only ever allowed as part of an upmerge. So for the "general public" this has no effect whatsoever.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
die('Mergeup commits cannot be reverted')
die('Mergeup commits cannot be reverted. See [documentation](https://nordicsemi.atlassian.net/wiki/spaces/NCS/pages/108201225/Pull+Requests#revert).')

regex = r'^This reverts commit \b([a-f0-9]{40})\b\.'
match = re.search(regex, body, re.MULTILINE)
if not match:
die(f'{sha}: revert commit missing reverted SHA')
die(f'{sha}: revert commit message missing reverted SHA')
stdout(f'revert: {match.group(1)}')
# The SHA to replay is the revert commmit's
usha = sha
Expand All @@ -244,7 +248,7 @@ def check_commit(urepo, ubranch, target, sha, merge):

match = re.search(regex, body, re.MULTILINE)
if not match:
die(f'{sha}: fromlist commit missing an Upstream PR reference')
die(f'{sha}: fromlist commit missing an "Upstream PR #:" reference')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
die(f'{sha}: fromlist commit missing an "Upstream PR #:" reference')
die(f'{sha}: fromlist commit message missing an "Upstream PR #:" reference'
f'See [doc](https://nordicsemi.atlassian.net/wiki/spaces/NCS/pages/108201225/Pull+Requests#fromlist-ref) for explanation.')

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reference to the Development Model exists already in the die() function implementation. I will add the other change.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that is a very long document. i added anchors for relevant sections.
'fromlist-ref'
'revert'


upr = match.group(1)
stdout(f'fromlist: {upr}')
Expand All @@ -263,13 +267,14 @@ def check_commit(urepo, ubranch, target, sha, merge):
break

if not usha:
die(f'{sha}: unable to match any commit from PR {upr}')
die(f'{sha}: unable to match any commit from upstream PR #{upr}')

elif tag == 'fromtree':
regex = r'^\(cherry picked from commit \b([a-f0-9]{40})\b\)'
match = re.search(regex, body, re.MULTILINE)
if not match:
die(f'{sha}: fromtree commit missing cherry-pick reference')
die(f'{sha}: fromtree commit missing cherry-pick reference. '
f'Please use "git cherry-pick -x" when cherry-picking')
#stdout(f'fromtree: {match.group(0)}')

usha = match.group(1)
Expand All @@ -285,7 +290,8 @@ def check_commit(urepo, ubranch, target, sha, merge):
contains = runc_out(f'git -C {target} branch {ref} --contains {usha}')

if not re.match(rf'^.*{ref}.*$', contains):
die(f'Branch {ref} does not contain commit {usha}')
die(f'fromtree: upstream branch {ref} does not contain commit {usha}. '
f'Please check that the commit is merged upstream')

elif tag == 'noup':
stdout('noup')
Expand All @@ -308,14 +314,22 @@ def check_commit(urepo, ubranch, target, sha, merge):
except subprocess.CalledProcessError as e:
pass
# Ignore it and exit forcefully
die(f'ERROR: unable to cherry-pick {usha}')
die(f'Unable to cherry-pick commit {usha}. This means that the upstream '
f'commit does not apply cleanly into the NCS fork. This can happen '
f'if you modified an upstream commit in order to resolve conflicts, '
f'but this is now allowed. Instead, revert any [nrf noup] commits that '

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
f'but this is now allowed. Instead, revert any [nrf noup] commits that '
f'but this is not allowed. Instead, revert any [nrf noup] commits that '

?

f'may be causing the conflict and cherry-pick any additional prior '
f'commits from upstream that may be needed in order to avoid a merge '
f'conflict')

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
f'conflict')
f'conflict. Then you can re-apply the reverted [nrf noup] commits.')


# Execute a diff between the replay branch and the sha to make sure the
# commit has not been modified
diff = runc_out(f'git -C {target} diff {sha}')

if diff:
die(f'SHA {sha} non-empty diff:\n{diff}')
die(f'SHA {sha} non-empty diff between fork and upstream. This likely '
f'means that you modified an upstream commit when cherry-picking. '
f'This is not allowed. Full diff:\n{diff}')

return False

Expand Down