]> git.proxmox.com Git - mirror_frr.git/blame - tools/git-reindent-branch.py
Merge pull request #10323 from opensourcerouting/ospf6-lsa-stats
[mirror_frr.git] / tools / git-reindent-branch.py
CommitLineData
dceb5f8a
DL
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4import sys, os
5import subprocess, argparse, tempfile
6import indent
7
701a0192 8
dceb5f8a 9def 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 16clangfmt = run(["git", "show", "master:.clang-format"])
17
18argp = argparse.ArgumentParser(description="git whitespace-fixing tool")
19argp.add_argument("branch", metavar="BRANCH", type=str, nargs="?", default="HEAD")
dceb5f8a
DL
20args = argp.parse_args()
21
22branch = args.branch
701a0192 23commit = 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 26masterid = run(["git", "rev-list", "-n", "1", "frr-3.1-dev", "--"]).strip()
27masterbase = run(["git", "merge-base", commit, masterid]).strip()
feda3ca3
DL
28
29if masterbase == masterid:
701a0192 30 refbranch = "master"
feda3ca3 31else:
701a0192 32 refbranch = "3.0"
feda3ca3 33
701a0192 34sys.stderr.write("autodetected base: %s (can be 3.0 or master)\n" % refbranch)
feda3ca3 35
701a0192 36beforeid = run(
37 ["git", "rev-list", "-n", "1", "reindent-%s-before" % refbranch, "--"]
38).strip()
39afterid = run(
40 ["git", "rev-list", "-n", "1", "reindent-%s-after" % refbranch, "--"]
41).strip()
dceb5f8a 42
701a0192 43beforebase = run(["git", "merge-base", commit, beforeid]).strip()
44afterbase = run(["git", "merge-base", commit, afterid]).strip()
dceb5f8a
DL
45
46if afterbase == afterid:
701a0192 47 sys.stderr.write("this branch was already rebased\n")
dceb5f8a
DL
48 sys.exit(1)
49
50if 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 56revs = (
57 run(["git", "rev-list", "reindent-%s-before..%s" % (refbranch, commit)])
58 .strip()
59 .split("\n")
60)
92690ee6 61revs.reverse()
dceb5f8a
DL
62
63srcdir = os.getcwd()
701a0192 64tmpdir = tempfile.mkdtemp("frrindent")
dceb5f8a
DL
65os.chdir(tmpdir)
66
701a0192 67sys.stderr.write("using temporary directory %s; %d revisions\n" % (tmpdir, len(revs)))
68run(["git", "clone", "-s", "-b", "reindent-%s-after" % refbranch, srcdir, "repo"])
69os.chdir("repo")
dceb5f8a 70
701a0192 71with open(".clang-format", "w") as fd:
feda3ca3
DL
72 fd.write(clangfmt)
73
dceb5f8a
DL
74prev = beforeid
75for 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 99run(["git", "push", "origin", "HEAD:refs/heads/reindented-branch"])
dceb5f8a 100sys.stderr.write('\n\n"reindented-branch" should now be OK.\n')
701a0192 101sys.stderr.write(
102 'you could use "git reset --hard reindented-branch" to set your current branch to the reindented output\n'
103)
104sys.stderr.write("\033[31;1mplease always double-check the output\033[m\n")