#!/usr/bin/python
#
# svn_update - Update independent subversion checkouts.
#

import pyutilib.subprocess
import glob
import os
import sys
import urllib2
import optparse

#
# A generic URL for subversion trigger jobs on Sandia's SRN Hudson server
#
url_template = '/job/SubversionTrigger_%s/build/?token=%s&cause=<br/><br/>%s'

parser = optparse.OptionParser(usage='svn_update [OPTIONS] <dirs>')

parser.add_option('-v','--verbose',
    action='store_true',
    dest='verbose',
    default=False,
    help='Print subversion update information')
parser.add_option('--hudson',
    action='store',
    dest='hudson',
    default=None,
    help='Trigger the specified hudson project')
parser.add_option('--hudson_url',
    action='store',
    dest='hudson_url',
    default='http://hudson.sandia.gov:8080',
    help='The base URL for triggering a hudson job')
parser.add_option('--run_hudson',
    action='store_true',
    dest='run_hudson',
    default=False,
    help='Trigger the hudson project even if no packages have been updated')

options, args = parser.parse_args()

if len(args) == 0:
    dirs=[]
    tstr = '*'
    #if options.hudson is None:
    #    tstr = '*'
    #else:
    #    tstr = options.hudson+'*'
    for dir in glob.glob(tstr):
        if not os.path.isdir(dir):
            continue
        dirs.append(dir)

if not options.hudson is None or options.verbose:
    #
    # Perform a verbose update (which is used to trigger hudson)
    #
    hudson_str=''
    update_failed = False
    for dir in dirs:
        if options.verbose:
            print "Updating",dir,"..."
        [rc,output] = pyutilib.subprocess.run('svn update '+dir, tee=options.verbose)
        if rc != 0:
            update_failed = True
        elif not output.startswith('At'):
            hudson_str += 'Updates from '+dir+'\n'
            hudson_str += output + '\n\n'
        if options.verbose:
            print ""
    if update_failed:
        print "Warning: one or more svn updates failed."
        sys.exit(-1)
    if hudson_str:
        print "SCM change detected."
    else:
        print "No SCM changes detected."
        
    if (hudson_str != '' or options.run_hudson) and not options.hudson is None:
	hudson_str = hudson_str.replace('\n', '<br/>')
	hudson_str = hudson_str.replace(' ', '%20')
        url = options.hudson_url + \
              (url_template % (options.hudson, options.hudson, hudson_str))
        print "Launching Hudson job."
        if options.verbose:
            print "Opening url", url
        try:
            urllib2.urlopen(url)
        except urllib2.HTTPError, err:
            if options.verbose:
                print "Received error",str(err)
                sys.exit(-1)
else:
    #
    # Perform a fast, quiet update
    #
    [rc, output] = pyutilib.subprocess.run('svn update -q '+" ".join(dirs))
    print output
