blob: 6e4e2c57041b940a93cc028194d72497d9114ac2 [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
Shawn O. Pearceabb7a3d2009-07-03 16:16:18 -070065 def GetManifest(self, reparse=False, type=None):
66 return manifest_loader.GetManifest(self.repodir,
67 reparse=reparse,
68 type=type)
Shawn O. Pearcef1a6b142009-06-03 16:01:11 -070069
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070070 def GetProjects(self, args, missing_ok=False):
71 """A list of projects that match the arguments.
72 """
73 all = self.manifest.projects
Shawn O. Pearcece86abb2009-07-03 16:52:28 -070074
75 mp = self.manifest.manifestProject
76 if mp.relpath == '.':
77 all = dict(all)
78 all[mp.name] = mp
79
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070080 result = []
81
82 if not args:
83 for project in all.values():
84 if missing_ok or project.Exists:
85 result.append(project)
86 else:
87 by_path = None
88
89 for arg in args:
90 project = all.get(arg)
91
92 if not project:
93 path = os.path.abspath(arg)
94
95 if not by_path:
96 by_path = dict()
97 for p in all.values():
98 by_path[p.worktree] = p
99
Shawn O. Pearcece86abb2009-07-03 16:52:28 -0700100 try:
101 project = by_path[path]
102 except KeyError:
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700103 while path \
104 and path != '/' \
105 and path != self.manifest.topdir:
106 try:
107 project = by_path[path]
108 break
109 except KeyError:
110 path = os.path.dirname(path)
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700111
112 if not project:
113 raise NoSuchProjectError(arg)
114 if not missing_ok and not project.Exists:
115 raise NoSuchProjectError(arg)
116
117 result.append(project)
118
119 def _getpath(x):
120 return x.relpath
121 result.sort(key=_getpath)
122 return result
123
124class InteractiveCommand(Command):
125 """Command which requires user interaction on the tty and
126 must not run within a pager, even if the user asks to.
127 """
Shawn O. Pearcedb45da12009-04-18 13:49:13 -0700128 def WantPager(self, opt):
129 return False
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700130
131class PagedCommand(Command):
132 """Command which defaults to output in a pager, as its
133 display tends to be larger than one screen full.
134 """
Shawn O. Pearcedb45da12009-04-18 13:49:13 -0700135 def WantPager(self, opt):
136 return True
Shawn O. Pearcec95583b2009-03-03 17:47:06 -0800137
138class MirrorSafeCommand(object):
139 """Command permits itself to run within a mirror,
140 and does not require a working directory.
141 """