# 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 from repo_logging import RepoLogger logger = RepoLogger(__file__) 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 [...] """ 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: logger.error("no projects have uncommitted modifications") 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()