]>
Commit | Line | Data |
---|---|---|
dceb5f8a DL |
1 | #!/usr/bin/env python |
2 | # -*- coding: utf-8 -*- | |
3 | ||
4 | import sys, os | |
5 | import subprocess, argparse, tempfile | |
6 | import indent | |
7 | ||
701a0192 | 8 | |
dceb5f8a | 9 | def run(cmd): |
701a0192 | 10 | proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) |
11 | rv = proc.communicate("")[0].decode("UTF-8") | |
dceb5f8a DL |
12 | proc.wait() |
13 | return rv | |
14 | ||
feda3ca3 | 15 | |
701a0192 | 16 | clangfmt = run(["git", "show", "master:.clang-format"]) |
17 | ||
18 | argp = argparse.ArgumentParser(description="git whitespace-fixing tool") | |
19 | argp.add_argument("branch", metavar="BRANCH", type=str, nargs="?", default="HEAD") | |
dceb5f8a DL |
20 | args = argp.parse_args() |
21 | ||
22 | branch = args.branch | |
701a0192 | 23 | commit = run(["git", "rev-list", "-n", "1", branch, "--"]).strip() |
feda3ca3 DL |
24 | |
25 | # frr-3.1-dev = first commit that is on master but not on stable/3.0 | |
701a0192 | 26 | masterid = run(["git", "rev-list", "-n", "1", "frr-3.1-dev", "--"]).strip() |
27 | masterbase = run(["git", "merge-base", commit, masterid]).strip() | |
feda3ca3 DL |
28 | |
29 | if masterbase == masterid: | |
701a0192 | 30 | refbranch = "master" |
feda3ca3 | 31 | else: |
701a0192 | 32 | refbranch = "3.0" |
feda3ca3 | 33 | |
701a0192 | 34 | sys.stderr.write("autodetected base: %s (can be 3.0 or master)\n" % refbranch) |
feda3ca3 | 35 | |
701a0192 | 36 | beforeid = run( |
37 | ["git", "rev-list", "-n", "1", "reindent-%s-before" % refbranch, "--"] | |
38 | ).strip() | |
39 | afterid = run( | |
40 | ["git", "rev-list", "-n", "1", "reindent-%s-after" % refbranch, "--"] | |
41 | ).strip() | |
dceb5f8a | 42 | |
701a0192 | 43 | beforebase = run(["git", "merge-base", commit, beforeid]).strip() |
44 | afterbase = run(["git", "merge-base", commit, afterid]).strip() | |
dceb5f8a DL |
45 | |
46 | if afterbase == afterid: | |
701a0192 | 47 | sys.stderr.write("this branch was already rebased\n") |
dceb5f8a DL |
48 | sys.exit(1) |
49 | ||
50 | if beforebase != beforeid: | |
701a0192 | 51 | sys.stderr.write( |
52 | 'you need to rebase your branch onto the tag "reindent-%s-before"\n' % refbranch | |
53 | ) | |
dceb5f8a DL |
54 | sys.exit(1) |
55 | ||
701a0192 | 56 | revs = ( |
57 | run(["git", "rev-list", "reindent-%s-before..%s" % (refbranch, commit)]) | |
58 | .strip() | |
59 | .split("\n") | |
60 | ) | |
92690ee6 | 61 | revs.reverse() |
dceb5f8a DL |
62 | |
63 | srcdir = os.getcwd() | |
701a0192 | 64 | tmpdir = tempfile.mkdtemp("frrindent") |
dceb5f8a DL |
65 | os.chdir(tmpdir) |
66 | ||
701a0192 | 67 | sys.stderr.write("using temporary directory %s; %d revisions\n" % (tmpdir, len(revs))) |
68 | run(["git", "clone", "-s", "-b", "reindent-%s-after" % refbranch, srcdir, "repo"]) | |
69 | os.chdir("repo") | |
dceb5f8a | 70 | |
701a0192 | 71 | with open(".clang-format", "w") as fd: |
feda3ca3 DL |
72 | fd.write(clangfmt) |
73 | ||
dceb5f8a DL |
74 | prev = beforeid |
75 | for rev in revs: | |
701a0192 | 76 | filestat = ( |
77 | run(["git", "diff", "-z", "--name-status", prev, rev]).rstrip("\0").split("\0") | |
78 | ) | |
dceb5f8a | 79 | changes = zip(filestat[0::2], filestat[1::2]) |
701a0192 | 80 | sys.stderr.write("%s: %d files\n" % (rev, len(changes))) |
dceb5f8a DL |
81 | |
82 | for typ, name in changes: | |
701a0192 | 83 | if typ == "D": |
84 | run(["git", "rm", name]) | |
85 | elif typ in ["A", "M"]: | |
86 | run(["git", "checkout", rev, "--", name]) | |
87 | if name.endswith(".c") or name.endswith(".h"): | |
88 | for d in ["babeld/", "ldpd/", "nhrpd/"]: | |
dceb5f8a DL |
89 | if name.startswith(d): |
90 | break | |
91 | else: | |
701a0192 | 92 | sys.stderr.write("\t%s\n" % name) |
dceb5f8a | 93 | indent.wrap_file(name) |
701a0192 | 94 | run(["git", "add", name]) |
dceb5f8a | 95 | |
701a0192 | 96 | run(["git", "commit", "-C", rev]) |
dceb5f8a DL |
97 | prev = rev |
98 | ||
701a0192 | 99 | run(["git", "push", "origin", "HEAD:refs/heads/reindented-branch"]) |
dceb5f8a | 100 | sys.stderr.write('\n\n"reindented-branch" should now be OK.\n') |
701a0192 | 101 | sys.stderr.write( |
102 | 'you could use "git reset --hard reindented-branch" to set your current branch to the reindented output\n' | |
103 | ) | |
104 | sys.stderr.write("\033[31;1mplease always double-check the output\033[m\n") |