#!/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 active git branches and code changes in a chromiumos workspace."""

import gclient_utils
import os
import re
import subprocess
import sys


def show_dir(full_name, relative_name, color):
  """Display active work in a single git repo."""

  def show_name():
    """Display the directory name."""

    if color:
      sys.stdout.write('========= %s[44m%s[37m%s%s[0m ========\n' %
                       (chr(27), chr(27), relative_name, chr(27)))
    else:
      sys.stdout.write('========= %s ========\n' % relative_name)

  lines_printed = 0

  cmd = ['git', 'branch', '-v']
  if color:
    cmd.append('--color')

  branch = subprocess.Popen(cmd,
                            cwd=full_name,
                            stdout=subprocess.PIPE).communicate()[0].rstrip()

  if len(branch.splitlines()) > 1:
    if lines_printed == 0:
      show_name()
    lines_printed += 1
    print branch

  status = subprocess.Popen(['git', 'status'],
                            cwd=full_name,
                            stdout=subprocess.PIPE).communicate()[0].rstrip()

  if len(status.splitlines()) > 2:
    if lines_printed == 0:
      show_name()
    if lines_printed == 1:
      print '---------------'
    print status


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

  color = False

  if os.isatty(1):
    color = True

  base = os.path.basename(os.getcwd())
  root, entries = gclient_utils.GetGClientRootAndEntries()

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

  # We want to use the full path for testing, but we want to use the relative
  # path for display.
  fulldirs = map(lambda(p): os.path.normpath(os.path.join(root, p)), raw)
  reldirs = map(lambda(p): re.sub('^' + base, '.', p), raw)

  for full_path, relative_path in zip(fulldirs, reldirs):
    show_dir(full_path, relative_path, color)

if __name__ == '__main__':
  main()