#!/usr/bin/env python
# Copyright (c) 2010 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.

"""Display log of checkins of one particular developer since a particular
date. Only works on git dependencies at the moment."""

from __future__ import print_function

import gclient_utils
import optparse
import os
import re
import subprocess
import sys


def show_log(path, authors, since='1 week ago'):
  """Display log in a single git repo."""

  author_option = ' '.join(['--author=' + author for author in authors])
  command = ' '.join(['git log', author_option, '--since="%s"' % since,
                      'origin/HEAD', '| git shortlog'])
  status = subprocess.Popen(['sh', '-c', command],
                            cwd=path,
                            stdout=subprocess.PIPE).communicate()[0].rstrip()

  if len(status.splitlines()) > 0:
    print('---------- %s ----------' % path)
    print(status)


def main():
  """Take no arguments."""

  option_parser = optparse.OptionParser()
  option_parser.add_option("-a", "--author", action="append", default=[])
  option_parser.add_option("-s", "--since", default="1 week ago")
  options, args = option_parser.parse_args()

  root, entries = gclient_utils.GetGClientRootAndEntries()

  # which entries map to a git repos?
  paths = [k for k, v in entries.items() if not re.search('svn', v)]
  paths.sort()

  for path in paths:
    dir = os.path.normpath(os.path.join(root, path))
    show_log(dir, options.author, options.since)


if __name__ == '__main__':
  main()
