#!/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/master', '| 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()
