199fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar#!/usr/bin/python
299fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar
399fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbarimport os, sys, subprocess
499fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar
599fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbardef main():
699fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    from optparse import OptionParser, OptionGroup
799fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    parser = OptionParser("usage: %prog [options] <repo> <revision>")
8f6893dd44daff07245d59d21968f065b6247a9b2Daniel Dunbar    parser.add_option("", "--branch", dest="branch",
9f6893dd44daff07245d59d21968f065b6247a9b2Daniel Dunbar                      help="Ref for the branch to search [%default]",
10f6893dd44daff07245d59d21968f065b6247a9b2Daniel Dunbar                      action="store", default="git-svn")    
1199fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    (opts, args) = parser.parse_args()
1299fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar
1399fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    if len(args) != 2:
1499fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar        parser.error("invalid number of arguments")
1599fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar
1699fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    repo,rev = args
1799fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar
1899fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    try:
1999fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar        rev = int(rev)
2099fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    except:
2199fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar        parser.error("invalid revision argument (not an integer)")
2299fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar
2399fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    os.chdir(repo)
24f6893dd44daff07245d59d21968f065b6247a9b2Daniel Dunbar    p = subprocess.Popen(['git', 'rev-list', opts.branch, '--pretty'],
2599fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar                         stdout=subprocess.PIPE)
2699fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar
2799fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    bestRev = bestCommit = None
2899fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    lastCommit = None
2999fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    for ln in p.stdout:
3099fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar        if ln.startswith('commit '):
3199fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar            lastCommit = ln.split(' ',2)[1]
3299fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar        elif ln.startswith('    git-svn-id: '):
3399fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar            _,repo,_ = ln.strip().split(' ')
3499fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar            _,lrev = repo.rsplit('@',1)
3599fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar            lrev = int(lrev)
3699fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar            if lrev<=rev:
3799fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar                if bestRev is None or lrev>bestRev:
3899fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar                    assert lastCommit
3999fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar                    bestCommit = lastCommit
4099fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar                    bestRev = lrev
4199fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar                    if lrev == rev:
4299fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar                        break
4399fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    
4499fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    if bestCommit is not None:
4599fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar        print bestCommit
4699fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar        sys.exit(0)
4799fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    sys.exit(1)
4899fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar
4999fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbarif __name__=='__main__':
5099fe6d92d36d1da638e53b8b8403a01b6f0ae9aeDaniel Dunbar    main()
51