blob: 5ca43f20775c9d8f5a5e44626d6a4198eda23742 [file] [log] [blame]
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -07001#
2# Copyright (C) 2008 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16import os
17import optparse
18import sys
19
Shawn O. Pearcef1a6b142009-06-03 16:01:11 -070020import manifest_loader
21
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070022from error import NoSuchProjectError
23
24class Command(object):
25 """Base class for any command line action in repo.
26 """
27
28 common = False
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070029 _optparse = None
30
Shawn O. Pearcedb45da12009-04-18 13:49:13 -070031 def WantPager(self, opt):
32 return False
33
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070034 @property
35 def OptionParser(self):
36 if self._optparse is None:
37 try:
38 me = 'repo %s' % self.NAME
39 usage = self.helpUsage.strip().replace('%prog', me)
40 except AttributeError:
41 usage = 'repo %s' % self.NAME
42 self._optparse = optparse.OptionParser(usage = usage)
43 self._Options(self._optparse)
44 return self._optparse
45
46 def _Options(self, p):
47 """Initialize the option parser.
48 """
49
50 def Usage(self):
51 """Display usage and terminate.
52 """
53 self.OptionParser.print_usage()
54 sys.exit(1)
55
56 def Execute(self, opt, args):
57 """Perform the action, after option parsing is complete.
58 """
59 raise NotImplementedError
60
Shawn O. Pearcef1a6b142009-06-03 16:01:11 -070061 @property
62 def manifest(self):
63 return self.GetManifest()
64
65 def GetManifest(self, reparse=False):
66 return manifest_loader.GetManifest(self.repodir, reparse)
67
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070068 def GetProjects(self, args, missing_ok=False):
69 """A list of projects that match the arguments.
70 """
71 all = self.manifest.projects
72 result = []
73
74 if not args:
75 for project in all.values():
76 if missing_ok or project.Exists:
77 result.append(project)
78 else:
79 by_path = None
80
81 for arg in args:
82 project = all.get(arg)
83
84 if not project:
85 path = os.path.abspath(arg)
86
87 if not by_path:
88 by_path = dict()
89 for p in all.values():
90 by_path[p.worktree] = p
91
92 if os.path.exists(path):
93 while path \
94 and path != '/' \
95 and path != self.manifest.topdir:
96 try:
97 project = by_path[path]
98 break
99 except KeyError:
100 path = os.path.dirname(path)
101 else:
102 try:
103 project = by_path[path]
104 except KeyError:
105 pass
106
107 if not project:
108 raise NoSuchProjectError(arg)
109 if not missing_ok and not project.Exists:
110 raise NoSuchProjectError(arg)
111
112 result.append(project)
113
114 def _getpath(x):
115 return x.relpath
116 result.sort(key=_getpath)
117 return result
118
119class InteractiveCommand(Command):
120 """Command which requires user interaction on the tty and
121 must not run within a pager, even if the user asks to.
122 """
Shawn O. Pearcedb45da12009-04-18 13:49:13 -0700123 def WantPager(self, opt):
124 return False
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700125
126class PagedCommand(Command):
127 """Command which defaults to output in a pager, as its
128 display tends to be larger than one screen full.
129 """
Shawn O. Pearcedb45da12009-04-18 13:49:13 -0700130 def WantPager(self, opt):
131 return True
Shawn O. Pearcec95583b2009-03-03 17:47:06 -0800132
133class MirrorSafeCommand(object):
134 """Command permits itself to run within a mirror,
135 and does not require a working directory.
136 """