find-rev 1.4 KB

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