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