blob: 85c294177f10c6893b22abb776923ab0a7a66a94 [file] [log] [blame]
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -07001#!/bin/sh
2#
3# Copyright (C) 2008 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17magic='--calling-python-from-/bin/sh--'
Shawn O. Pearce7542d662008-10-21 07:11:36 -070018"""exec" python -E "$0" "$@" """#$magic"
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070019if __name__ == '__main__':
20 import sys
21 if sys.argv[-1] == '#%s' % magic:
22 del sys.argv[-1]
23del magic
24
25import optparse
26import os
27import re
28import sys
29
30from command import InteractiveCommand, PagedCommand
31from error import NoSuchProjectError
32from error import RepoChangedException
33from manifest import Manifest
34from pager import RunPager
35
36from subcmds import all as all_commands
37
38global_options = optparse.OptionParser(
39 usage="repo [-p|--paginate|--no-pager] COMMAND [ARGS]"
40 )
41global_options.add_option('-p', '--paginate',
42 dest='pager', action='store_true',
43 help='display command output in the pager')
44global_options.add_option('--no-pager',
45 dest='no_pager', action='store_true',
46 help='disable the pager')
47
48class _Repo(object):
49 def __init__(self, repodir):
50 self.repodir = repodir
51 self.commands = all_commands
52
53 def _Run(self, argv):
54 name = None
55 glob = []
56
57 for i in xrange(0, len(argv)):
58 if not argv[i].startswith('-'):
59 name = argv[i]
60 if i > 0:
61 glob = argv[:i]
62 argv = argv[i + 1:]
63 break
64 if not name:
65 glob = argv
66 name = 'help'
67 argv = []
68 gopts, gargs = global_options.parse_args(glob)
69
70 try:
71 cmd = self.commands[name]
72 except KeyError:
73 print >>sys.stderr,\
74 "repo: '%s' is not a repo command. See 'repo help'."\
75 % name
76 sys.exit(1)
77
78 cmd.repodir = self.repodir
79 cmd.manifest = Manifest(cmd.repodir)
80
81 if not gopts.no_pager and not isinstance(cmd, InteractiveCommand):
82 config = cmd.manifest.globalConfig
83 if gopts.pager:
84 use_pager = True
85 else:
86 use_pager = config.GetBoolean('pager.%s' % name)
87 if use_pager is None:
88 use_pager = isinstance(cmd, PagedCommand)
89 if use_pager:
90 RunPager(config)
91
92 copts, cargs = cmd.OptionParser.parse_args(argv)
93 try:
94 cmd.Execute(copts, cargs)
95 except NoSuchProjectError, e:
96 if e.name:
97 print >>sys.stderr, 'error: project %s not found' % e.name
98 else:
99 print >>sys.stderr, 'error: no project in current directory'
100 sys.exit(1)
101
102def _MyWrapperPath():
103 return os.path.join(os.path.dirname(__file__), 'repo')
104
105def _CurrentWrapperVersion():
106 VERSION = None
107 pat = re.compile(r'^VERSION *=')
108 fd = open(_MyWrapperPath())
109 for line in fd:
110 if pat.match(line):
111 fd.close()
112 exec line
113 return VERSION
114 raise NameError, 'No VERSION in repo script'
115
116def _CheckWrapperVersion(ver, repo_path):
117 if not repo_path:
118 repo_path = '~/bin/repo'
119
120 if not ver:
121 print >>sys.stderr, 'no --wrapper-version argument'
122 sys.exit(1)
123
124 exp = _CurrentWrapperVersion()
125 ver = tuple(map(lambda x: int(x), ver.split('.')))
126 if len(ver) == 1:
127 ver = (0, ver[0])
128
129 if exp[0] > ver[0] or ver < (0, 4):
130 exp_str = '.'.join(map(lambda x: str(x), exp))
131 print >>sys.stderr, """
132!!! A new repo command (%5s) is available. !!!
133!!! You must upgrade before you can continue: !!!
134
135 cp %s %s
136""" % (exp_str, _MyWrapperPath(), repo_path)
137 sys.exit(1)
138
139 if exp > ver:
140 exp_str = '.'.join(map(lambda x: str(x), exp))
141 print >>sys.stderr, """
142... A new repo command (%5s) is available.
143... You should upgrade soon:
144
145 cp %s %s
146""" % (exp_str, _MyWrapperPath(), repo_path)
147
148def _CheckRepoDir(dir):
149 if not dir:
150 print >>sys.stderr, 'no --repo-dir argument'
151 sys.exit(1)
152
153def _PruneOptions(argv, opt):
154 i = 0
155 while i < len(argv):
156 a = argv[i]
157 if a == '--':
158 break
159 if a.startswith('--'):
160 eq = a.find('=')
161 if eq > 0:
162 a = a[0:eq]
163 if not opt.has_option(a):
164 del argv[i]
165 continue
166 i += 1
167
168def _Main(argv):
169 opt = optparse.OptionParser(usage="repo wrapperinfo -- ...")
170 opt.add_option("--repo-dir", dest="repodir",
171 help="path to .repo/")
172 opt.add_option("--wrapper-version", dest="wrapper_version",
173 help="version of the wrapper script")
174 opt.add_option("--wrapper-path", dest="wrapper_path",
175 help="location of the wrapper script")
176 _PruneOptions(argv, opt)
177 opt, argv = opt.parse_args(argv)
178
179 _CheckWrapperVersion(opt.wrapper_version, opt.wrapper_path)
180 _CheckRepoDir(opt.repodir)
181
182 repo = _Repo(opt.repodir)
183 try:
184 repo._Run(argv)
185 except KeyboardInterrupt:
186 sys.exit(1)
187 except RepoChangedException:
188 # If the repo or manifest changed, re-exec ourselves.
189 #
190 try:
191 os.execv(__file__, sys.argv)
192 except OSError, e:
193 print >>sys.stderr, 'fatal: cannot restart repo after upgrade'
194 print >>sys.stderr, 'fatal: %s' % e
195 sys.exit(128)
196
197if __name__ == '__main__':
198 _Main(sys.argv[1:])