Initial Contribution
diff --git a/main.py b/main.py
new file mode 100755
index 0000000..5609299
--- /dev/null
+++ b/main.py
@@ -0,0 +1,198 @@
+#!/bin/sh
+#
+# Copyright (C) 2008 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+magic='--calling-python-from-/bin/sh--'
+"""exec" python2.4 -E "$0" "$@" """#$magic"
+if __name__ == '__main__':
+ import sys
+ if sys.argv[-1] == '#%s' % magic:
+ del sys.argv[-1]
+del magic
+
+import optparse
+import os
+import re
+import sys
+
+from command import InteractiveCommand, PagedCommand
+from error import NoSuchProjectError
+from error import RepoChangedException
+from manifest import Manifest
+from pager import RunPager
+
+from subcmds import all as all_commands
+
+global_options = optparse.OptionParser(
+ usage="repo [-p|--paginate|--no-pager] COMMAND [ARGS]"
+ )
+global_options.add_option('-p', '--paginate',
+ dest='pager', action='store_true',
+ help='display command output in the pager')
+global_options.add_option('--no-pager',
+ dest='no_pager', action='store_true',
+ help='disable the pager')
+
+class _Repo(object):
+ def __init__(self, repodir):
+ self.repodir = repodir
+ self.commands = all_commands
+
+ def _Run(self, argv):
+ name = None
+ glob = []
+
+ for i in xrange(0, len(argv)):
+ if not argv[i].startswith('-'):
+ name = argv[i]
+ if i > 0:
+ glob = argv[:i]
+ argv = argv[i + 1:]
+ break
+ if not name:
+ glob = argv
+ name = 'help'
+ argv = []
+ gopts, gargs = global_options.parse_args(glob)
+
+ try:
+ cmd = self.commands[name]
+ except KeyError:
+ print >>sys.stderr,\
+ "repo: '%s' is not a repo command. See 'repo help'."\
+ % name
+ sys.exit(1)
+
+ cmd.repodir = self.repodir
+ cmd.manifest = Manifest(cmd.repodir)
+
+ if not gopts.no_pager and not isinstance(cmd, InteractiveCommand):
+ config = cmd.manifest.globalConfig
+ if gopts.pager:
+ use_pager = True
+ else:
+ use_pager = config.GetBoolean('pager.%s' % name)
+ if use_pager is None:
+ use_pager = isinstance(cmd, PagedCommand)
+ if use_pager:
+ RunPager(config)
+
+ copts, cargs = cmd.OptionParser.parse_args(argv)
+ try:
+ cmd.Execute(copts, cargs)
+ except NoSuchProjectError, e:
+ if e.name:
+ print >>sys.stderr, 'error: project %s not found' % e.name
+ else:
+ print >>sys.stderr, 'error: no project in current directory'
+ sys.exit(1)
+
+def _MyWrapperPath():
+ return os.path.join(os.path.dirname(__file__), 'repo')
+
+def _CurrentWrapperVersion():
+ VERSION = None
+ pat = re.compile(r'^VERSION *=')
+ fd = open(_MyWrapperPath())
+ for line in fd:
+ if pat.match(line):
+ fd.close()
+ exec line
+ return VERSION
+ raise NameError, 'No VERSION in repo script'
+
+def _CheckWrapperVersion(ver, repo_path):
+ if not repo_path:
+ repo_path = '~/bin/repo'
+
+ if not ver:
+ print >>sys.stderr, 'no --wrapper-version argument'
+ sys.exit(1)
+
+ exp = _CurrentWrapperVersion()
+ ver = tuple(map(lambda x: int(x), ver.split('.')))
+ if len(ver) == 1:
+ ver = (0, ver[0])
+
+ if exp[0] > ver[0] or ver < (0, 4):
+ exp_str = '.'.join(map(lambda x: str(x), exp))
+ print >>sys.stderr, """
+!!! A new repo command (%5s) is available. !!!
+!!! You must upgrade before you can continue: !!!
+
+ cp %s %s
+""" % (exp_str, _MyWrapperPath(), repo_path)
+ sys.exit(1)
+
+ if exp > ver:
+ exp_str = '.'.join(map(lambda x: str(x), exp))
+ print >>sys.stderr, """
+... A new repo command (%5s) is available.
+... You should upgrade soon:
+
+ cp %s %s
+""" % (exp_str, _MyWrapperPath(), repo_path)
+
+def _CheckRepoDir(dir):
+ if not dir:
+ print >>sys.stderr, 'no --repo-dir argument'
+ sys.exit(1)
+
+def _PruneOptions(argv, opt):
+ i = 0
+ while i < len(argv):
+ a = argv[i]
+ if a == '--':
+ break
+ if a.startswith('--'):
+ eq = a.find('=')
+ if eq > 0:
+ a = a[0:eq]
+ if not opt.has_option(a):
+ del argv[i]
+ continue
+ i += 1
+
+def _Main(argv):
+ opt = optparse.OptionParser(usage="repo wrapperinfo -- ...")
+ opt.add_option("--repo-dir", dest="repodir",
+ help="path to .repo/")
+ opt.add_option("--wrapper-version", dest="wrapper_version",
+ help="version of the wrapper script")
+ opt.add_option("--wrapper-path", dest="wrapper_path",
+ help="location of the wrapper script")
+ _PruneOptions(argv, opt)
+ opt, argv = opt.parse_args(argv)
+
+ _CheckWrapperVersion(opt.wrapper_version, opt.wrapper_path)
+ _CheckRepoDir(opt.repodir)
+
+ repo = _Repo(opt.repodir)
+ try:
+ repo._Run(argv)
+ except KeyboardInterrupt:
+ sys.exit(1)
+ except RepoChangedException:
+ # If the repo or manifest changed, re-exec ourselves.
+ #
+ try:
+ os.execv(__file__, sys.argv)
+ except OSError, e:
+ print >>sys.stderr, 'fatal: cannot restart repo after upgrade'
+ print >>sys.stderr, 'fatal: %s' % e
+ sys.exit(128)
+
+if __name__ == '__main__':
+ _Main(sys.argv[1:])