#!/usr/bin/python

import os
import subprocess
import sys

PORTS_DIR = '/usr/ports'

# ssh - Lake in the Hills, IL
cvsroot = 'anoncvs@rt.fm:/cvs'
# ssh/pserver - Chicago, IL
#cvsroot = 'anoncvs@mirror.sg.depaul.edu:/cvs'
# ssh/pserver - Boulder, CO
#cvsroot = 'anoncvs@anoncvs3.usa.openbsd.org:/cvs'

rev = 'HEAD'
#rev = 'OPENBSD_4_3'

targets = [
    '/usr/src',
    '/usr/xenocara',
    '/usr/ports'
]

color = True
progname = sys.argv[0]

def print_green(str):
	nl = ''
	if color and str[-1] == '\n':
		nl = '\n'
		str = str[:-1]
	if color:
		sys.stdout.write('\033[01;32m')
	sys.stdout.write(str)
	if color:
		sys.stdout.write('\033[00m')
	sys.stdout.write(nl)

def update(cvsroot, target, revision=None):
	print_green('>>> updating %s\n' % target)
	args = [ 'cvs', '-qd' + cvsroot, 'update', '-Pd' ]
	if revision:
		args.append('-r' + revision)
	sys.stdout.flush()
	status = 0
	try:
		proc = subprocess.Popen(args, cwd=target)
		status = proc.wait()
	except OSError, e:
		sys.stderr.write('%s: could not run `cvs up\' in %s:\n'
		    '%s\n' % (progname, target, e))
		return -1
	if status < 0:
		sys.stderr.write('%s: failed to update %s:\n'
		    '  `cvs up\' terminated by signal %d\n' %
		    (progname, target, -status))
		return -1
	elif status:
		sys.stderr.write('%s: failed to update %s:\n'
		    '  `cvs up\' ended with %d\n' %
		    (progname, target, status))
		return -1
	return 0

def rebuild_index():
	print_green('>>> rebuilding %s\n' % os.path.join(PORTS_DIR, 'INDEX'))
	sys.stdout.flush()
	status = 0
	try:
		proc = subprocess.Popen(('make', 'index'), cwd=PORTS_DIR)
		status = proc.wait()
	except OSError, e:
		sys.stderr.write('%s: could not execute `make index\':\n'
		    '%s\n' % (progname, e))
		return -1
	if status < 0:
		sys.stderr.write('%s: failed to rebuild index:\n'
		    '  `make index\' terminated by signal %d\n' %
		    (progname, -status))
		return -1
	elif status:
		sys.stderr.write('%s: failed to rebuild index:\n'
		    '  `make index\' ended with %d\n' %
		    (progname, status))
		return -1
	return 0

def usage():
	print 'usage: %s [ --help | --nocolor ]' % progname

def main(args):
	global color
	for arg in args[1:]:
		if arg == '--help':
			usage()
			return 1
		elif arg == '--nocolor':	color = False
		elif arg == '--color':		color = True
		else:
			print '%s: unrecognized option: %s' % (progname, arg)
			usage()
			return 1
	
	rebuild = False
	for t in targets:
		if update(cvsroot, t, rev) != 0:
			return 1
		elif t == PORTS_DIR:
			rebuild = True
	if rebuild:
		if rebuild_index() != 0:
			return 1
	return 0

sys.exit(main(sys.argv))
