| # 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. |
| |
| import sys |
| |
| from color import Coloring |
| from command import InteractiveCommand |
| from git_command import GitCommand |
| |
| |
| class _ProjectList(Coloring): |
| def __init__(self, gc): |
| Coloring.__init__(self, gc, 'interactive') |
| self.prompt = self.printer('prompt', fg='blue', attr='bold') |
| self.header = self.printer('header', attr='bold') |
| self.help = self.printer('help', fg='red', attr='bold') |
| |
| |
| class Stage(InteractiveCommand): |
| COMMON = True |
| helpSummary = "Stage file(s) for commit" |
| helpUsage = """ |
| %prog -i [<project>...] |
| """ |
| helpDescription = """ |
| The '%prog' command stages files to prepare the next commit. |
| """ |
| |
| def _Options(self, p): |
| g = p.get_option_group('--quiet') |
| g.add_option('-i', '--interactive', |
| dest='interactive', action='store_true', |
| help='use interactive staging') |
| |
| def Execute(self, opt, args): |
| if opt.interactive: |
| self._Interactive(opt, args) |
| else: |
| self.Usage() |
| |
| def _Interactive(self, opt, args): |
| all_projects = [ |
| p for p in self.GetProjects(args, all_manifests=not opt.this_manifest_only) |
| if p.IsDirty()] |
| if not all_projects: |
| print('no projects have uncommitted modifications', file=sys.stderr) |
| return |
| |
| out = _ProjectList(self.manifest.manifestProject.config) |
| while True: |
| out.header(' %s', 'project') |
| out.nl() |
| |
| for i in range(len(all_projects)): |
| project = all_projects[i] |
| out.write('%3d: %s', i + 1, |
| project.RelPath(local=opt.this_manifest_only) + '/') |
| out.nl() |
| out.nl() |
| |
| out.write('%3d: (', 0) |
| out.prompt('q') |
| out.write('uit)') |
| out.nl() |
| |
| out.prompt('project> ') |
| out.flush() |
| try: |
| a = sys.stdin.readline() |
| except KeyboardInterrupt: |
| out.nl() |
| break |
| if a == '': |
| out.nl() |
| break |
| |
| a = a.strip() |
| if a.lower() in ('q', 'quit', 'exit'): |
| break |
| if not a: |
| continue |
| |
| try: |
| a_index = int(a) |
| except ValueError: |
| a_index = None |
| |
| if a_index is not None: |
| if a_index == 0: |
| break |
| if 0 < a_index and a_index <= len(all_projects): |
| _AddI(all_projects[a_index - 1]) |
| continue |
| |
| projects = [ |
| p for p in all_projects |
| if a in [p.name, p.RelPath(local=opt.this_manifest_only)]] |
| if len(projects) == 1: |
| _AddI(projects[0]) |
| continue |
| print('Bye.') |
| |
| |
| def _AddI(project): |
| p = GitCommand(project, ['add', '--interactive'], bare=False) |
| p.Wait() |