#!/usr/bin/env ruby -wKU
$LOAD_PATH << File.expand_path(File.dirname(__FILE__))
$LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')

require 'repository'
require "rubygems"
require "etc"

require 'options'

args = Choice.choices

if File.exist?(File.expand_path(args[:repository_map]))
  paths = Hash.new
  IO.foreach(File.expand_path(args[:repository_map])) do |line|
    paths[$1.strip] = $2.strip if line =~ /([^=]*)=(.*)/
  end
else
  paths = {
    'osgi-test-stubs' => 'osgi-test-stubs',
    'osgi-extensions' => 'osgi-extensions',
    'util' => 'util',
    'test' => 'test',
    'medic' => 'medic',
    'artifact-repository' => 'artifact-repository',
    'kernel' => 'kernel',
    'kernel-tools' => 'kernel-tools',
    'web' => 'web',
    'snaps' => 'snaps',
    'apps' => 'apps',
    'documentation' => 'documentation',
    'web-server' => 'web-server',
    'jetty-server' => 'jetty-server',
    'performance-test' => 'performance-test',
    'system-verification-tests' => 'system-verification-tests',
    'kernel-system-verification-tests' => 'kernel-system-verification-tests',
    'sample-greenpages' => 'sample-greenpages',
    'sample-configuration-properties' => 'sample-configuration-properties',
    'sample-formtags' => 'sample-formtags',
    'sample-osgi-examples' => 'sample-osgi-examples'
  }
end

update_branch = args[:branch_name]
gemini_update_branch = args[:gemini_branch_name]

local_repo_root = 'git@git.springsource.org:virgo/'
virgo_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/virgo/org.eclipse.virgo.'
gemini_web_repo_root = 'ssh://' + args[:remote_user] + '@git.eclipse.org/gitroot/gemini.web/org.eclipse.gemini.web.'

VIRGO_PERMISSION_REPOS = [
  Repository.new(virgo_repo_root, 'sample-greenpages',                     paths['sample-greenpages'],                nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'sample-configuration-properties',       paths['sample-configuration-properties'],  nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'sample-formtags',                       paths['sample-formtags'],                  nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'sample-osgi-examples',                  paths['sample-osgi-examples'],             nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'web-server',                            paths['web-server'],                       nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'jetty-server',                          paths['jetty-server'],                     nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'documentation',                         paths['documentation'],                    nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'apps',                                  paths['apps'],                             nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'snaps',                                 paths['snaps'],                            nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'web',                                   paths['web'],                              nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'kernel',                                paths['kernel'],                           nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'artifact-repository',                   paths['artifact-repository'],              nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'medic',                                 paths['medic'],                            nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'test',                                  paths['test'],                             nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'util',                                  paths['util'],                             nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'osgi-extensions',                       paths['osgi-extensions'],                  nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'osgi-test-stubs',                       paths['osgi-test-stubs'],                  nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'performance-test',                      paths['performance-test'],                 nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'system-verification-tests',             paths['system-verification-tests'],        nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'kernel-system-verification-tests',      paths['kernel-system-verification-tests'], nil, nil, update_branch),
  Repository.new(virgo_repo_root, 'kernel-tools',                          paths['kernel-tools'],                     nil, nil, update_branch)
]

 
ALL_REPOS = VIRGO_PERMISSION_REPOS

start_time = Time.new

ALL_REPOS.each do |repo|
  puts 'Updating ' + repo.name
  puts '  Checkout with "' + repo.clone_command + '"' 
  repo.checkout
  repo.update_virgo_build(args[:build_version])
  puts ''
end

puts 'Execution Time: ' + Time.at(Time.new - start_time).utc.strftime('%R:%S')

print 'Do you want to push? (y/n) '
commit_ok = STDIN.gets.chomp
if commit_ok =~ /y.*/
  ALL_REPOS.each do |repo|
    begin
      if repo.name == 'gemini-web-container'
        repo.push(args[:gemini_branch_name])
      else
        repo.push(args[:branch_name])
      end
    rescue SystemExit
      if VIRGO_PERMISSION_REPOS.include?(repo)
        abort("\nFATAL: Push failed for #{repo.name}")
      end
      puts "\nWARNING: Push failed for #{repo.name}"
    end
  end
end


