#!/usr/bin/python
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Script to setup push configuration in a git-repo checkout."""

import sys
from chromite.buildbot import configure_repo
from chromite.buildbot import repository
from chromite.lib import cros_build_lib


def _Usage(handle):
  print >>handle, (
     "Tool to fix git configuration and add push configuration to a repo.")
  print >>handle
  print >>handle, (
"""Fix git configuration, and enable git pushing to the remote.

To run this script, either invoke it from within a repo checkout, or pass it
the path of a repo checkout you'd like to configure.

Once that has been done, what would've been (for example):

git push ssh://gerrit.chromium.org:29418/chromiumos/chromite\
 HEAD:refs/for/master

Can now be done as:

git push cros HEAD:refs/for/master
""")

def main(argv):
  if len(argv) > 1:
    _Usage(sys.stderr)
    return 1
  if not argv:
    path = cros_build_lib.FindRepoCheckoutRoot()
    if path is None:
      _Usage(sys.stderr)
      print >>sys.stderr, "We're not in a repo checkout."
      return 1
  else:
    if argv[0] in ('-h', '--help', '--usage'):
      _Usage(sys.stderr)
      return 0
    path = argv[0]
    if not repository.IsARepoRoot(path):
      _Usage(sys.stderr)
      print >>sys.stderr, ("Path %s doesn't point to the root of a repository."
                           % (argv[0],))
      return 1

  print "Cleaning stale git configuration from %s" % (path,)
  configure_repo.FixBrokenExistingRepos(path)
  print "\nAdding git push configuration to %s" % (path,)
  configure_repo.FixExternalRepoPushUrls(path)
