xref: /aosp_15_r20/build/make/core/checktree (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1*9e94795aSAndroid Build Coastguard Worker#!/usr/bin/python -E
2*9e94795aSAndroid Build Coastguard Worker
3*9e94795aSAndroid Build Coastguard Workerimport sys, os, re
4*9e94795aSAndroid Build Coastguard Worker
5*9e94795aSAndroid Build Coastguard Workerexcludes = [r'.*?/\.obj.*?',
6*9e94795aSAndroid Build Coastguard Worker            r'.*?~',
7*9e94795aSAndroid Build Coastguard Worker            r'.*?\/.DS_Store',
8*9e94795aSAndroid Build Coastguard Worker            r'.*?\/.gdb_history',
9*9e94795aSAndroid Build Coastguard Worker            r'.*?\/buildspec.mk',
10*9e94795aSAndroid Build Coastguard Worker            r'.*?/\..*?\.swp',
11*9e94795aSAndroid Build Coastguard Worker            r'.*?/out/.*?',
12*9e94795aSAndroid Build Coastguard Worker            r'.*?/install/.*?']
13*9e94795aSAndroid Build Coastguard Worker
14*9e94795aSAndroid Build Coastguard Workerexcludes_compiled = map(re.compile, excludes)
15*9e94795aSAndroid Build Coastguard Worker
16*9e94795aSAndroid Build Coastguard Workerdef filter_excludes(str):
17*9e94795aSAndroid Build Coastguard Worker    for e in excludes_compiled:
18*9e94795aSAndroid Build Coastguard Worker        if e.match(str):
19*9e94795aSAndroid Build Coastguard Worker            return False
20*9e94795aSAndroid Build Coastguard Worker    return True
21*9e94795aSAndroid Build Coastguard Worker
22*9e94795aSAndroid Build Coastguard Workerdef split_perforce_parts(s):
23*9e94795aSAndroid Build Coastguard Worker    spaces = ((s.count(" ") + 1) / 3) * 2
24*9e94795aSAndroid Build Coastguard Worker    pos = 0
25*9e94795aSAndroid Build Coastguard Worker    while spaces > 0:
26*9e94795aSAndroid Build Coastguard Worker        pos = s.find(" ", pos) + 1
27*9e94795aSAndroid Build Coastguard Worker        spaces = spaces - 1
28*9e94795aSAndroid Build Coastguard Worker    return s[pos:]
29*9e94795aSAndroid Build Coastguard Worker
30*9e94795aSAndroid Build Coastguard Workerdef quotate(s):
31*9e94795aSAndroid Build Coastguard Worker    return '"' + s + '"'
32*9e94795aSAndroid Build Coastguard Worker
33*9e94795aSAndroid Build Coastguard Workerclass PerforceError(Exception):
34*9e94795aSAndroid Build Coastguard Worker    def __init__(self,value):
35*9e94795aSAndroid Build Coastguard Worker        self.value = value
36*9e94795aSAndroid Build Coastguard Worker    def __str__(self):
37*9e94795aSAndroid Build Coastguard Worker        return repr(self.value)
38*9e94795aSAndroid Build Coastguard Worker
39*9e94795aSAndroid Build Coastguard Worker
40*9e94795aSAndroid Build Coastguard Workerdef run(command, regex, filt):
41*9e94795aSAndroid Build Coastguard Worker    def matchit(s):
42*9e94795aSAndroid Build Coastguard Worker        m = regex_compiled.match(s)
43*9e94795aSAndroid Build Coastguard Worker        if m:
44*9e94795aSAndroid Build Coastguard Worker            return m.group(1)
45*9e94795aSAndroid Build Coastguard Worker        else:
46*9e94795aSAndroid Build Coastguard Worker            return ""
47*9e94795aSAndroid Build Coastguard Worker    def filterit(s):
48*9e94795aSAndroid Build Coastguard Worker        if filt_compiled.match(s):
49*9e94795aSAndroid Build Coastguard Worker            return True
50*9e94795aSAndroid Build Coastguard Worker        else:
51*9e94795aSAndroid Build Coastguard Worker            return False
52*9e94795aSAndroid Build Coastguard Worker
53*9e94795aSAndroid Build Coastguard Worker    fd = os.popen(command);
54*9e94795aSAndroid Build Coastguard Worker    lines = fd.readlines()
55*9e94795aSAndroid Build Coastguard Worker    status = fd.close()
56*9e94795aSAndroid Build Coastguard Worker    if status:
57*9e94795aSAndroid Build Coastguard Worker        raise PerforceError("error calling " + command)
58*9e94795aSAndroid Build Coastguard Worker
59*9e94795aSAndroid Build Coastguard Worker    regex_compiled = re.compile(regex)
60*9e94795aSAndroid Build Coastguard Worker    filt_compiled = re.compile(filt)
61*9e94795aSAndroid Build Coastguard Worker
62*9e94795aSAndroid Build Coastguard Worker    if len(lines) >= 1:
63*9e94795aSAndroid Build Coastguard Worker        lines = filter(filterit, lines)
64*9e94795aSAndroid Build Coastguard Worker        if len(lines) >= 1:
65*9e94795aSAndroid Build Coastguard Worker            return map(matchit, lines)
66*9e94795aSAndroid Build Coastguard Worker    return None
67*9e94795aSAndroid Build Coastguard Worker
68*9e94795aSAndroid Build Coastguard Workertry:
69*9e94795aSAndroid Build Coastguard Worker    if len(sys.argv) == 1:
70*9e94795aSAndroid Build Coastguard Worker        do_exclude = True
71*9e94795aSAndroid Build Coastguard Worker    elif len(sys.argv) == 2 and sys.argv[1] == "-a":
72*9e94795aSAndroid Build Coastguard Worker        do_exclude = False
73*9e94795aSAndroid Build Coastguard Worker    else:
74*9e94795aSAndroid Build Coastguard Worker        print "usage: checktree [-a]"
75*9e94795aSAndroid Build Coastguard Worker        print "  -a  don't filter common crud in the tree"
76*9e94795aSAndroid Build Coastguard Worker        sys.exit(1)
77*9e94795aSAndroid Build Coastguard Worker
78*9e94795aSAndroid Build Coastguard Worker    have = run("p4 have ...", r'[^#]+#[0-9]+ - (.*)', r'.*')
79*9e94795aSAndroid Build Coastguard Worker
80*9e94795aSAndroid Build Coastguard Worker    cwd = os.getcwd()
81*9e94795aSAndroid Build Coastguard Worker    files = run("find . -not -type d", r'.(.*)', r'.*')
82*9e94795aSAndroid Build Coastguard Worker    files = map(lambda s: cwd+s, files)
83*9e94795aSAndroid Build Coastguard Worker
84*9e94795aSAndroid Build Coastguard Worker    added_depot_path = run("p4 opened ...", r'([^#]+)#.*', r'.*?#[0-9]+ - add .*');
85*9e94795aSAndroid Build Coastguard Worker    added = []
86*9e94795aSAndroid Build Coastguard Worker    if added_depot_path:
87*9e94795aSAndroid Build Coastguard Worker        added_depot_path = map(quotate, added_depot_path)
88*9e94795aSAndroid Build Coastguard Worker
89*9e94795aSAndroid Build Coastguard Worker        where = "p4 where " + " ".join(added_depot_path)
90*9e94795aSAndroid Build Coastguard Worker        added = run(where, r'(.*)', r'.*')
91*9e94795aSAndroid Build Coastguard Worker        added = map(split_perforce_parts, added)
92*9e94795aSAndroid Build Coastguard Worker
93*9e94795aSAndroid Build Coastguard Worker    extras = []
94*9e94795aSAndroid Build Coastguard Worker
95*9e94795aSAndroid Build Coastguard Worker    # Python 2.3 -- still default on Mac OS X -- does not have set()
96*9e94795aSAndroid Build Coastguard Worker    # Make dict's here to support the "in" operations below
97*9e94795aSAndroid Build Coastguard Worker    have = dict().fromkeys(have, 1)
98*9e94795aSAndroid Build Coastguard Worker    added = dict().fromkeys(added, 1)
99*9e94795aSAndroid Build Coastguard Worker
100*9e94795aSAndroid Build Coastguard Worker    for file in files:
101*9e94795aSAndroid Build Coastguard Worker        if not file in have:
102*9e94795aSAndroid Build Coastguard Worker            if not file in added:
103*9e94795aSAndroid Build Coastguard Worker                extras.append(file)
104*9e94795aSAndroid Build Coastguard Worker
105*9e94795aSAndroid Build Coastguard Worker    if do_exclude:
106*9e94795aSAndroid Build Coastguard Worker        extras = filter(filter_excludes, extras)
107*9e94795aSAndroid Build Coastguard Worker
108*9e94795aSAndroid Build Coastguard Worker    for s in extras:
109*9e94795aSAndroid Build Coastguard Worker        print s.replace(" ", "\\ ")
110*9e94795aSAndroid Build Coastguard Worker
111*9e94795aSAndroid Build Coastguard Workerexcept PerforceError, e:
112*9e94795aSAndroid Build Coastguard Worker    sys.exit(2)
113*9e94795aSAndroid Build Coastguard Worker
114