From 7a4e2f40f945f22937db3e366d20e0eb6b49b289 Mon Sep 17 00:00:00 2001 From: Matthias Bussonnier Date: Mon, 8 Jun 2020 21:14:15 -0700 Subject: [PATCH 1/4] log the patch with blacks --- meeseeksdev/meeseeksbox/commands.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/meeseeksdev/meeseeksbox/commands.py b/meeseeksdev/meeseeksbox/commands.py index 62bf4f7..f137e1c 100644 --- a/meeseeksdev/meeseeksbox/commands.py +++ b/meeseeksdev/meeseeksbox/commands.py @@ -128,11 +128,12 @@ def _compute_pwd_changes(whitelist): if p not in whitelist: # we don't touch files not in this PR. continue + patch = whitelist[p] + print('patch is:\n', patch) p = Path(p) old = p.read_text() new = black.format_str(old, mode=black.FileMode()) if new != old: - print("will differ") nl = new.splitlines() ol = old.splitlines() s = SequenceMatcher(None, ol, nl) @@ -216,8 +217,9 @@ def black_suggest(*, session, payload, arguments, local_config=None): "GET", f"https://api.github.com/repos/{org_name}/{repo_name}/pulls/{prnumber}/files", ) - pr_files = [r["filename"] for r in files_response.json()] - print("== PR contains", len(pr_files), "files") + pr_files_patches = {r["filename"]:r["patch"] for r in files_response.json()} + + print("== PR contains", len(pr_files_patches), "files") if os.path.exists(repo_name): print("== Cleaning up previsous work... ") @@ -258,7 +260,7 @@ def black_suggest(*, session, payload, arguments, local_config=None): print("== Computing changes....") os.chdir(repo_name) - changes = _compute_pwd_changes(pr_files) + changes = _compute_pwd_changes(pr_files_patches) os.chdir("..") print("... computed", len(changes), changes) @@ -274,7 +276,7 @@ def black_suggest(*, session, payload, arguments, local_config=None): # ) for path, start, end, body in changes: - print(f"== will suggest the following on {path} {start+1} to {end}\n", body) + print(f"== will suggest the following on lines {path} {start+1} to {end}\n") if start + 1 != end: data = { "body": body, @@ -287,7 +289,7 @@ def black_suggest(*, session, payload, arguments, local_config=None): } try: - resp = session.ghrequest( + session.ghrequest( "POST", f"https://api.github.com/repos/{org_name}/{repo_name}/pulls/{prnumber}/comments", json=data, @@ -307,7 +309,7 @@ def black_suggest(*, session, payload, arguments, local_config=None): } try: - resp = session.ghrequest( + session.ghrequest( "POST", f"https://api.github.com/repos/{org_name}/{repo_name}/pulls/{prnumber}/comments", json=data, @@ -317,7 +319,9 @@ def black_suggest(*, session, payload, arguments, local_config=None): pass if os.path.exists(repo_name): print("== Cleaning up repo... ") - subprocess.run("rm -rf {}".format(repo_name).split(" ")) + import shutil + shutil.rmtree(repo_name) + #subprocess.run("rm -rf {}".format(repo_name).split(" ")) print("== Done cleaning ") From ae8629b819e4b43ec0a797f45332c65d4402b715 Mon Sep 17 00:00:00 2001 From: Matthias Bussonnier Date: Tue, 9 Jun 2020 08:07:46 -0700 Subject: [PATCH 2/4] try to parse rages --- meeseeksdev/meeseeksbox/commands.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/meeseeksdev/meeseeksbox/commands.py b/meeseeksdev/meeseeksbox/commands.py index f137e1c..b0814b7 100644 --- a/meeseeksdev/meeseeksbox/commands.py +++ b/meeseeksdev/meeseeksbox/commands.py @@ -111,6 +111,26 @@ def replyadmin(*, session, payload, arguments, local_config=None): ) +def parsepatch(patch): + """ + Attempt to parse a github patch to tell us on which lines we are able to comment. + """ + ranges = [] + for l in patch.splitlines(): + if not l.startswith('@@'): + continue + s = l.split('@@')[1].strip() + ranges.append([int(x) for x in s.split(' ')[1].split(',')]) + return [(s, s+x-1) for s, x in ranges] + +def in_ranges(needle, haystack): + n1, n2 = needle + for h1, h2 in haystack: + if (h1 < n1) and (n2 < h2): + return True + return False + + def _compute_pwd_changes(whitelist): import black from difflib import SequenceMatcher @@ -129,6 +149,7 @@ def _compute_pwd_changes(whitelist): # we don't touch files not in this PR. continue patch = whitelist[p] + ranges = parsepatch(patch) print('patch is:\n', patch) p = Path(p) old = p.read_text() @@ -138,6 +159,9 @@ def _compute_pwd_changes(whitelist): ol = old.splitlines() s = SequenceMatcher(None, ol, nl) for t, a1, a2, b1, b2 in s.get_opcodes(): + if not in_ranges((a1, a2), ranges): + print(f"-- we won't be able to suggest a change on {p}:{a1}-{a2}") + continue if t == "replace": c = "```suggestion\n" @@ -156,7 +180,6 @@ def black_suggest(*, session, payload, arguments, local_config=None): print("===== reformatting suggestions. =====") prnumber = payload["issue"]["number"] - prtitle = payload["issue"]["title"] org_name = payload["repository"]["owner"]["login"] repo_name = payload["repository"]["name"] @@ -178,7 +201,7 @@ def black_suggest(*, session, payload, arguments, local_config=None): commits_url = pr_data["commits_url"] - commits_data = session.ghrequest("GET", commits_url).json() + # commits_data = session.ghrequest("GET", commits_url).json() # that will likely fail, as if PR, we need to bypass the fact that the # requester has technically no access to committer repo. From fe9510f9f365ae36ea8650e29cc6045ccd46f806 Mon Sep 17 00:00:00 2001 From: Matthias Bussonnier Date: Tue, 9 Jun 2020 08:11:12 -0700 Subject: [PATCH 3/4] Apply format suggestions from core review. Co-authored-by: meeseeksdev[bot] <24485218+meeseeksdev[bot]@users.noreply.github.com> --- meeseeksdev/meeseeksbox/commands.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meeseeksdev/meeseeksbox/commands.py b/meeseeksdev/meeseeksbox/commands.py index b0814b7..bbb2e76 100644 --- a/meeseeksdev/meeseeksbox/commands.py +++ b/meeseeksdev/meeseeksbox/commands.py @@ -150,7 +150,7 @@ def _compute_pwd_changes(whitelist): continue patch = whitelist[p] ranges = parsepatch(patch) - print('patch is:\n', patch) + print("patch is:\n", patch) p = Path(p) old = p.read_text() new = black.format_str(old, mode=black.FileMode()) @@ -240,7 +240,7 @@ def black_suggest(*, session, payload, arguments, local_config=None): "GET", f"https://api.github.com/repos/{org_name}/{repo_name}/pulls/{prnumber}/files", ) - pr_files_patches = {r["filename"]:r["patch"] for r in files_response.json()} + pr_files_patches = {r["filename"]: r["patch"] for r in files_response.json()} print("== PR contains", len(pr_files_patches), "files") @@ -344,7 +344,7 @@ def black_suggest(*, session, payload, arguments, local_config=None): print("== Cleaning up repo... ") import shutil shutil.rmtree(repo_name) - #subprocess.run("rm -rf {}".format(repo_name).split(" ")) + # subprocess.run("rm -rf {}".format(repo_name).split(" ")) print("== Done cleaning ") From 021035fb2657f6a39cf1b5386e52329e87b3f845 Mon Sep 17 00:00:00 2001 From: Matthias Bussonnier Date: Tue, 9 Jun 2020 08:11:37 -0700 Subject: [PATCH 4/4] Apply formatting suggestions. Co-authored-by: meeseeksdev[bot] <24485218+meeseeksdev[bot]@users.noreply.github.com> --- meeseeksdev/meeseeksbox/commands.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/meeseeksdev/meeseeksbox/commands.py b/meeseeksdev/meeseeksbox/commands.py index bbb2e76..b87f0a1 100644 --- a/meeseeksdev/meeseeksbox/commands.py +++ b/meeseeksdev/meeseeksbox/commands.py @@ -117,11 +117,12 @@ def parsepatch(patch): """ ranges = [] for l in patch.splitlines(): - if not l.startswith('@@'): + if not l.startswith("@@"): continue - s = l.split('@@')[1].strip() - ranges.append([int(x) for x in s.split(' ')[1].split(',')]) - return [(s, s+x-1) for s, x in ranges] + s = l.split("@@")[1].strip() + ranges.append([int(x) for x in s.split(" ")[1].split(",")]) + return [(s, s + x - 1) for s, x in ranges] + def in_ranges(needle, haystack): n1, n2 = needle