status: add -q/--quiet option

The --quiet option reduces the output to just
a list of projects with modified workspaces (and
orphans if -o is specified)

A common use case is when performing a full-workspace
merge.  The integrator will kick-off a merge via:

    repo forall -c git merge <some tag>

And then produce a short list of conflicted projects via:

    repo status -q

The integrator can then iteratively fix and clean up all conficted
components.  The merge is complete when:

    repo status -q

    returns no output.

Change-Id: Ibbba8713eac35befd8287c95948874e23fd5c7e2
This commit is contained in:
Andrew Wheeler 2012-02-27 13:52:22 -06:00
parent 82f67987a3
commit 4d5bb68d58
2 changed files with 14 additions and 6 deletions

View File

@ -911,11 +911,13 @@ class Project(object):
else: else:
return False return False
def PrintWorkTreeStatus(self, output_redir=None): def PrintWorkTreeStatus(self, output_redir=None, quiet=False):
"""Prints the status of the repository to stdout. """Prints the status of the repository to stdout.
Args: Args:
output: If specified, redirect the output to this object. output: If specified, redirect the output to this object.
quiet: If True then only print the project name. Do not print
the modified files, branch name, etc.
""" """
if not os.path.isdir(self.worktree): if not os.path.isdir(self.worktree):
if output_redir is None: if output_redir is None:
@ -941,6 +943,10 @@ class Project(object):
out.redirect(output_redir) out.redirect(output_redir)
out.project('project %-40s', self.relpath + '/ ') out.project('project %-40s', self.relpath + '/ ')
if quiet:
out.nl()
return 'DIRTY'
branch = self.CurrentBranch branch = self.CurrentBranch
if branch is None: if branch is None:
out.nobranch('(*** NO BRANCH ***)') out.nobranch('(*** NO BRANCH ***)')

View File

@ -89,8 +89,10 @@ the following meanings:
p.add_option('-o', '--orphans', p.add_option('-o', '--orphans',
dest='orphans', action='store_true', dest='orphans', action='store_true',
help="include objects in working directory outside of repo projects") help="include objects in working directory outside of repo projects")
p.add_option('-q', '--quiet', action='store_true',
help="only print the name of modified projects")
def _StatusHelper(self, project, clean_counter, sem): def _StatusHelper(self, project, clean_counter, sem, quiet):
"""Obtains the status for a specific project. """Obtains the status for a specific project.
Obtains the status for a project, redirecting the output to Obtains the status for a project, redirecting the output to
@ -104,7 +106,7 @@ the following meanings:
output: Where to output the status. output: Where to output the status.
""" """
try: try:
state = project.PrintWorkTreeStatus() state = project.PrintWorkTreeStatus(quiet=quiet)
if state == 'CLEAN': if state == 'CLEAN':
next(clean_counter) next(clean_counter)
finally: finally:
@ -132,7 +134,7 @@ the following meanings:
if opt.jobs == 1: if opt.jobs == 1:
for project in all_projects: for project in all_projects:
state = project.PrintWorkTreeStatus() state = project.PrintWorkTreeStatus(quiet=opt.quiet)
if state == 'CLEAN': if state == 'CLEAN':
next(counter) next(counter)
else: else:
@ -142,13 +144,13 @@ the following meanings:
sem.acquire() sem.acquire()
t = _threading.Thread(target=self._StatusHelper, t = _threading.Thread(target=self._StatusHelper,
args=(project, counter, sem)) args=(project, counter, sem, opt.quiet))
threads.append(t) threads.append(t)
t.daemon = True t.daemon = True
t.start() t.start()
for t in threads: for t in threads:
t.join() t.join()
if len(all_projects) == next(counter): if not opt.quiet and len(all_projects) == next(counter):
print('nothing to commit (working directory clean)') print('nothing to commit (working directory clean)')
if opt.orphans: if opt.orphans: