#!/usr/bin/env python
# Copyright (c) 2011 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Watch for rietveld issues with the commit bit set but no activity."""

import datetime
import logging
import optparse
import os
import re
import sys
import time

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import find_depot_tools  # pylint: disable=W0611
import breakpad
import rietveld


def seconds(td):
  return td.seconds + td.days * 24 * 3600


def to_epoch(date_str):
  dt = datetime.datetime(*map(int, re.split('[^\d]', date_str)[:-1]))
  return seconds(dt - datetime.datetime(1970, 1, 1))


def main():
  parser = optparse.OptionParser(
      description=sys.modules['__main__'].__doc__)
  parser.add_option('-d', '--delay', default=3*60*60, type='int')
  parser.add_option('-u', '--user')
  parser.add_option('-v', '--verbose', action='store_true')
  options, args = parser.parse_args(None)
  if options.verbose:
    logging.basicConfig(level=logging.DEBUG)
  else:
    logging.basicConfig(level=logging.ERROR)
  if len(args) != 1:
    parser.error('Need 1 arg')

  url = args[0].rstrip('/') + '/'
  if not 'http' in url:
    url = 'http://' + url
  obj = rietveld.Rietveld(args[0], options.user, None)
  notified = []
  while True:
    now = time.time()
    earliest = now - options.delay
    for issue in obj.search(commit='1', closed='2'):
      print '%d' % issue['issue']
      if issue['issue'] in notified:
        continue
      if (not issue['base_url'] or
          to_epoch(issue['modified']) < earliest):
        data = ['%s%d' % (url, issue['issue']), issue['base_url']]
        breakpad.SendStack(str(now), data)
        notified.append(issue['issue'])
    time.sleep(5*60)
  return 0


if __name__ == '__main__':
  sys.exit(main())
