xref: /aosp_15_r20/external/llvm/utils/git/find-rev (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/python
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerimport os, sys, subprocess
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdef main():
6*9880d681SAndroid Build Coastguard Worker    from optparse import OptionParser, OptionGroup
7*9880d681SAndroid Build Coastguard Worker    parser = OptionParser("usage: %prog [options] <repo> <revision>")
8*9880d681SAndroid Build Coastguard Worker    parser.add_option("", "--branch", dest="branch",
9*9880d681SAndroid Build Coastguard Worker                      help="Ref for the branch to search [%default]",
10*9880d681SAndroid Build Coastguard Worker                      action="store", default="git-svn")
11*9880d681SAndroid Build Coastguard Worker    (opts, args) = parser.parse_args()
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker    if len(args) != 2:
14*9880d681SAndroid Build Coastguard Worker        parser.error("invalid number of arguments")
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker    repo,rev = args
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker    try:
19*9880d681SAndroid Build Coastguard Worker        rev = int(rev)
20*9880d681SAndroid Build Coastguard Worker    except:
21*9880d681SAndroid Build Coastguard Worker        parser.error("invalid revision argument (not an integer)")
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker    os.chdir(repo)
24*9880d681SAndroid Build Coastguard Worker    p = subprocess.Popen(['git', 'rev-list', opts.branch, '--pretty'],
25*9880d681SAndroid Build Coastguard Worker                         stdout=subprocess.PIPE)
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker    bestRev = bestCommit = None
28*9880d681SAndroid Build Coastguard Worker    lastCommit = None
29*9880d681SAndroid Build Coastguard Worker    for ln in p.stdout:
30*9880d681SAndroid Build Coastguard Worker        if ln.startswith('commit '):
31*9880d681SAndroid Build Coastguard Worker            lastCommit = ln.split(' ',2)[1]
32*9880d681SAndroid Build Coastguard Worker        elif ln.startswith('    git-svn-id: '):
33*9880d681SAndroid Build Coastguard Worker            _,repo,_ = ln.strip().split(' ')
34*9880d681SAndroid Build Coastguard Worker            _,lrev = repo.rsplit('@',1)
35*9880d681SAndroid Build Coastguard Worker            lrev = int(lrev)
36*9880d681SAndroid Build Coastguard Worker            if lrev<=rev:
37*9880d681SAndroid Build Coastguard Worker                if bestRev is None or lrev>bestRev:
38*9880d681SAndroid Build Coastguard Worker                    assert lastCommit
39*9880d681SAndroid Build Coastguard Worker                    bestCommit = lastCommit
40*9880d681SAndroid Build Coastguard Worker                    bestRev = lrev
41*9880d681SAndroid Build Coastguard Worker                    if lrev == rev:
42*9880d681SAndroid Build Coastguard Worker                        break
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker    if bestCommit is not None:
45*9880d681SAndroid Build Coastguard Worker        print bestCommit
46*9880d681SAndroid Build Coastguard Worker        sys.exit(0)
47*9880d681SAndroid Build Coastguard Worker    sys.exit(1)
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerif __name__=='__main__':
50*9880d681SAndroid Build Coastguard Worker    main()
51