]> git.proxmox.com Git - mirror_frr.git/blob - tools/git-reindent-branch.py
Merge pull request #10925 from qlyoung/fix-grpc-wants-installed-frr
[mirror_frr.git] / tools / git-reindent-branch.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import sys, os
5 import subprocess, argparse, tempfile
6 import indent
7
8
9 def run(cmd):
10 proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
11 rv = proc.communicate("")[0].decode("UTF-8")
12 proc.wait()
13 return rv
14
15
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")
20 args = argp.parse_args()
21
22 branch = args.branch
23 commit = run(["git", "rev-list", "-n", "1", branch, "--"]).strip()
24
25 # frr-3.1-dev = first commit that is on master but not on stable/3.0
26 masterid = run(["git", "rev-list", "-n", "1", "frr-3.1-dev", "--"]).strip()
27 masterbase = run(["git", "merge-base", commit, masterid]).strip()
28
29 if masterbase == masterid:
30 refbranch = "master"
31 else:
32 refbranch = "3.0"
33
34 sys.stderr.write("autodetected base: %s (can be 3.0 or master)\n" % refbranch)
35
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()
42
43 beforebase = run(["git", "merge-base", commit, beforeid]).strip()
44 afterbase = run(["git", "merge-base", commit, afterid]).strip()
45
46 if afterbase == afterid:
47 sys.stderr.write("this branch was already rebased\n")
48 sys.exit(1)
49
50 if beforebase != beforeid:
51 sys.stderr.write(
52 'you need to rebase your branch onto the tag "reindent-%s-before"\n' % refbranch
53 )
54 sys.exit(1)
55
56 revs = (
57 run(["git", "rev-list", "reindent-%s-before..%s" % (refbranch, commit)])
58 .strip()
59 .split("\n")
60 )
61 revs.reverse()
62
63 srcdir = os.getcwd()
64 tmpdir = tempfile.mkdtemp("frrindent")
65 os.chdir(tmpdir)
66
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")
70
71 with open(".clang-format", "w") as fd:
72 fd.write(clangfmt)
73
74 prev = beforeid
75 for rev in revs:
76 filestat = (
77 run(["git", "diff", "-z", "--name-status", prev, rev]).rstrip("\0").split("\0")
78 )
79 changes = zip(filestat[0::2], filestat[1::2])
80 sys.stderr.write("%s: %d files\n" % (rev, len(changes)))
81
82 for typ, name in changes:
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/"]:
89 if name.startswith(d):
90 break
91 else:
92 sys.stderr.write("\t%s\n" % name)
93 indent.wrap_file(name)
94 run(["git", "add", name])
95
96 run(["git", "commit", "-C", rev])
97 prev = rev
98
99 run(["git", "push", "origin", "HEAD:refs/heads/reindented-branch"])
100 sys.stderr.write('\n\n"reindented-branch" should now be OK.\n')
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")