#!/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 v and 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()
