aboutsummaryrefslogtreecommitdiff
path: root/b4/pr.py
diff options
context:
space:
mode:
Diffstat (limited to 'b4/pr.py')
-rw-r--r--b4/pr.py157
1 files changed, 78 insertions, 79 deletions
diff --git a/b4/pr.py b/b4/pr.py
index 5a66180..596d3ad 100644
--- a/b4/pr.py
+++ b/b4/pr.py
@@ -32,12 +32,12 @@ charset.add_charset('utf-8', None)
logger = b4.logger
PULL_BODY_SINCE_ID_RE = [
- re.compile(r'changes since commit ([0-9a-f]{5,40}):', re.M | re.I)
+ re.compile(r'changes since commit ([\da-f]{5,40}):', re.M | re.I)
]
# I like these
PULL_BODY_WITH_COMMIT_ID_RE = [
- re.compile(r'fetch changes up to ([0-9a-f]{5,40}):', re.M | re.I),
+ re.compile(r'fetch changes up to ([\da-f]{5,40}):', re.M | re.I),
]
# I don't like these
@@ -256,6 +256,11 @@ def thanks_record_pr(lmsg):
json.dump(out, fh, ensure_ascii=False, indent=4)
logger.debug('Wrote %s for thanks tracking', filename)
+ config = b4.get_main_config()
+ pwstate = config.get('pw-review-state')
+ if pwstate:
+ b4.patchwork_set_state(lmsg.msgid, pwstate)
+
def explode(gitdir, lmsg, mailfrom=None, retrieve_links=True, fpopts=None):
ecode = fetch_remote(gitdir, lmsg, check_sig=False, ty_track=False)
@@ -286,7 +291,7 @@ def explode(gitdir, lmsg, mailfrom=None, retrieve_links=True, fpopts=None):
if prefix.lower() not in ('git', 'pull'):
prefixes.append(prefix)
- # get our to's and cc's
+ # get our To's and CC's
allto = utils.getaddresses(lmsg.msg.get_all('to', []))
allcc = utils.getaddresses(lmsg.msg.get_all('cc', []))
@@ -313,84 +318,78 @@ def explode(gitdir, lmsg, mailfrom=None, retrieve_links=True, fpopts=None):
# of the archived threads.
linked_ids.add(lmsg.msgid)
- with b4.git_format_patches(gitdir, lmsg.pr_base_commit, 'FETCH_HEAD', prefixes=prefixes, extraopts=fpopts) as pdir:
- if pdir is None:
- raise RuntimeError('Could not run format-patches')
-
- for msgfile in sorted(os.listdir(pdir)):
- with open(os.path.join(pdir, msgfile), 'rb') as fh:
- msg = email.message_from_binary_file(fh)
-
- msubj = b4.LoreSubject(msg.get('subject', ''))
-
- # Is this the cover letter?
- if msubj.counter == 0:
- # We rebuild the message from scratch
- # The cover letter body is the pull request body, plus a few trailers
- body = '%s\n\nbase-commit: %s\nPR-Link: %s\n' % (
- lmsg.body.strip(), lmsg.pr_base_commit, config['linkmask'] % lmsg.msgid)
-
- # Make it a multipart if we're doing retrieve_links
- if retrieve_links:
- cmsg = MIMEMultipart()
- cmsg.attach(MIMEText(body, 'plain'))
- else:
- cmsg = email.message.EmailMessage()
- cmsg.set_payload(body)
+ # FIXME: This is currently broken due to changes to git_range_to_patches
+ msgs = b4.git_range_to_patches(gitdir, lmsg.pr_base_commit, 'FETCH_HEAD', with_cover=True,
+ prefixes=prefixes, extraopts=fpopts)
+ for msg in msgs:
+ msubj = b4.LoreSubject(msg.get('subject', ''))
+
+ # Is this the cover letter?
+ if msubj.counter == 0:
+ # We rebuild the message from scratch
+ # The cover letter body is the pull request body, plus a few trailers
+ body = '%s\n\nbase-commit: %s\nPR-Link: %s\n' % (
+ lmsg.body.strip(), lmsg.pr_base_commit, config['linkmask'] % lmsg.msgid)
+
+ # Make it a multipart if we're doing retrieve_links
+ if retrieve_links:
+ cmsg = MIMEMultipart()
+ cmsg.attach(MIMEText(body, 'plain'))
+ else:
+ cmsg = email.message.EmailMessage()
+ cmsg.set_payload(body)
- cmsg.add_header('From', mailfrom)
- cmsg.add_header('Subject', '[' + ' '.join(msubj.prefixes) + '] ' + lmsg.subject)
- cmsg.add_header('Date', lmsg.msg.get('Date'))
- cmsg.set_charset('utf-8')
- cmsg.replace_header('Content-Transfer-Encoding', '8bit')
+ cmsg.add_header('From', mailfrom)
+ cmsg.add_header('Subject', '[' + ' '.join(msubj.prefixes) + '] ' + lmsg.subject)
+ cmsg.add_header('Date', lmsg.msg.get('Date'))
+ cmsg.set_charset('utf-8')
+ cmsg.replace_header('Content-Transfer-Encoding', '8bit')
- msg = cmsg
+ msg = cmsg
- else:
- # Move the original From and Date into the body
- prepend = list()
- if msg.get('From') != mailfrom:
- cleanfrom = b4.LoreMessage.clean_header(msg['from'])
- prepend.append('From: %s' % ''.join(cleanfrom))
- msg.replace_header('From', mailfrom)
-
- prepend.append('Date: %s' % msg['date'])
- body = '%s\n\n%s' % ('\n'.join(prepend), msg.get_payload(decode=True).decode('utf-8'))
- msg.set_payload(body)
- msg.replace_header('Subject', msubj.full_subject)
-
- if retrieve_links:
- matches = re.findall(r'^Link:\s+https?://.*/(\S+@\S+)[^/]', body, flags=re.M | re.I)
- if matches:
- linked_ids.update(matches)
- matches = re.findall(r'^Message-ID:\s+(\S+@\S+)', body, flags=re.M | re.I)
- if matches:
- linked_ids.update(matches)
-
- # Add a number of seconds equalling the counter, in hopes it gets properly threaded
- newdate = lmsg.date + timedelta(seconds=msubj.counter)
- msg.replace_header('Date', utils.format_datetime(newdate))
-
- # Thread it to the cover letter
- msg.add_header('In-Reply-To', '<b4-exploded-0-%s>' % lmsg.msgid)
- msg.add_header('References', '<b4-exploded-0-%s>' % lmsg.msgid)
-
- msg.add_header('To', format_addrs(allto))
- if allcc:
- msg.add_header('Cc', format_addrs(allcc))
-
- # Set the message-id based on the original pull request msgid
- msg.add_header('Message-Id', '<b4-exploded-%s-%s>' % (msubj.counter, lmsg.msgid))
-
- if mailfrom != lmsg.msg.get('From'):
- msg.add_header('Reply-To', lmsg.msg.get('From'))
- msg.add_header('X-Original-From', lmsg.msg.get('From'))
-
- if lmsg.msg['List-Id']:
- msg.add_header('X-Original-List-Id', b4.LoreMessage.clean_header(lmsg.msg['List-Id']))
- logger.info(' %s', msg.get('Subject'))
- msg.set_charset('utf-8')
- msgs.append(msg)
+ else:
+ # Move the original From and Date into the body
+ prepend = list()
+ if msg.get('From') != mailfrom:
+ cleanfrom = b4.LoreMessage.clean_header(msg['from'])
+ prepend.append('From: %s' % ''.join(cleanfrom))
+ msg.replace_header('From', mailfrom)
+
+ prepend.append('Date: %s' % msg['date'])
+ body = '%s\n\n%s' % ('\n'.join(prepend), msg.get_payload(decode=True).decode('utf-8'))
+ msg.set_payload(body)
+ msg.replace_header('Subject', msubj.full_subject)
+
+ if retrieve_links:
+ matches = re.findall(r'^Link:\s+https?://.*/(\S+@\S+)[^/]', body, flags=re.M | re.I)
+ if matches:
+ linked_ids.update(matches)
+ matches = re.findall(r'^Message-ID:\s+(\S+@\S+)', body, flags=re.M | re.I)
+ if matches:
+ linked_ids.update(matches)
+
+ # Add a number of seconds equalling the counter, in hopes it gets properly threaded
+ newdate = lmsg.date + timedelta(seconds=msubj.counter)
+ msg.replace_header('Date', utils.format_datetime(newdate))
+
+ # Thread it to the cover letter
+ msg.add_header('In-Reply-To', '<b4-exploded-0-%s>' % lmsg.msgid)
+ msg.add_header('References', '<b4-exploded-0-%s>' % lmsg.msgid)
+
+ msg.add_header('To', format_addrs(allto))
+ if allcc:
+ msg.add_header('Cc', format_addrs(allcc))
+
+ # Set the message-id based on the original pull request msgid
+ msg.add_header('Message-Id', '<b4-exploded-%s-%s>' % (msubj.counter, lmsg.msgid))
+
+ if mailfrom != lmsg.msg.get('From'):
+ msg.add_header('Reply-To', lmsg.msg.get('From'))
+ msg.add_header('X-Original-From', lmsg.msg.get('From'))
+
+ if lmsg.msg['List-Id']:
+ msg.add_header('X-Original-List-Id', b4.LoreMessage.clean_header(lmsg.msg['List-Id']))
+ logger.info(' %s', msg.get('Subject'))
logger.info('Exploded %s messages', len(msgs))
if retrieve_links and linked_ids:
@@ -443,7 +442,7 @@ def get_pr_from_github(ghurl: str):
rpull = chunks[-1]
apiurl = f'https://api.github.com/repos/{rproj}/{rrepo}/pulls/{rpull}'
req = requests.session()
- # Do we have a github API key?
+ # Do we have a GitHub API key?
config = b4.get_main_config()
ghkey = config.get('gh-api-key')
if ghkey: