/
migrate-black.py
executable file
·95 lines (80 loc) · 2.89 KB
/
migrate-black.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
#!/usr/bin/env python3
# check out every commit added by the current branch, blackify them,
# and generate diffs to reconstruct the original commits, but then
# blackified
import logging
import os
import sys
from subprocess import check_output, run, Popen, PIPE
def git(*args: str) -> str:
return check_output(["git"] + list(args)).decode("utf8").strip()
def blackify(base_branch: str, black_command: str, logger: logging.Logger) -> int:
current_branch = git("branch", "--show-current")
if not current_branch or base_branch == current_branch:
logger.error("You need to check out a feature brach to work on")
return 1
if not os.path.exists(".git"):
logger.error("Run me in the root of your repo")
return 1
merge_base = git("merge-base", "HEAD", base_branch)
if not merge_base:
logger.error(
"Could not find a common commit for current head and %s" % base_branch
)
return 1
commits = git(
"log", "--reverse", "--pretty=format:%H", "%s~1..HEAD" % merge_base
).split()
for commit in commits:
git("checkout", commit, "-b%s-black" % commit)
check_output(black_command, shell=True)
git("commit", "-aqm", "blackify")
git("checkout", base_branch, "-b%s-black" % current_branch)
for last_commit, commit in zip(commits, commits[1:]):
allow_empty = (
b"--allow-empty" in run(["git", "apply", "-h"], stdout=PIPE).stdout
)
quiet = b"--quiet" in run(["git", "apply", "-h"], stdout=PIPE).stdout
git_diff = Popen(
[
"git",
"diff",
"--find-copies",
"%s-black..%s-black" % (last_commit, commit),
],
stdout=PIPE,
)
git_apply = Popen(
[
"git",
"apply",
]
+ (["--quiet"] if quiet else [])
+ [
"-3",
"--intent-to-add",
]
+ (["--allow-empty"] if allow_empty else [])
+ [
"-",
],
stdin=git_diff.stdout,
)
if git_diff.stdout is not None:
git_diff.stdout.close()
git_apply.communicate()
git("commit", "--allow-empty", "-aqC", commit)
for commit in commits:
git("branch", "-qD", "%s-black" % commit)
return 0
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("base_branch")
parser.add_argument("--black_command", default="black -q .")
parser.add_argument("--logfile", type=argparse.FileType("w"), default=sys.stdout)
args = parser.parse_args()
logger = logging.getLogger(__name__)
logger.addHandler(logging.StreamHandler(args.logfile))
logger.setLevel(logging.INFO)
sys.exit(blackify(args.base_branch, args.black_command, logger))