sync: capture all git output by default

The default sync output should show a progress bar only for successful
commands, and the error output for any commands that fail.  Implement
that policy here.

Bug: https://crbug.com/gerrit/11293
Change-Id: I85716032201b6e2b45df876b07dd79cb2c1447a5
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/297905
Reviewed-by: Michael Mortensen <mmortensen@google.com>
Tested-by: Mike Frysinger <vapier@google.com>
This commit is contained in:
Mike Frysinger 2021-02-23 18:38:39 -05:00
parent fbb95a4342
commit 7b586f231b
2 changed files with 22 additions and 6 deletions

View File

@ -1039,6 +1039,7 @@ class Project(object):
def Sync_NetworkHalf(self, def Sync_NetworkHalf(self,
quiet=False, quiet=False,
verbose=False, verbose=False,
output_redir=None,
is_new=None, is_new=None,
current_branch_only=False, current_branch_only=False,
force_sync=False, force_sync=False,
@ -1126,8 +1127,9 @@ class Project(object):
(ID_RE.match(self.revisionExpr) and (ID_RE.match(self.revisionExpr) and
self._CheckForImmutableRevision())): self._CheckForImmutableRevision())):
if not self._RemoteFetch( if not self._RemoteFetch(
initial=is_new, quiet=quiet, verbose=verbose, alt_dir=alt_dir, initial=is_new,
current_branch_only=current_branch_only, quiet=quiet, verbose=verbose, output_redir=output_redir,
alt_dir=alt_dir, current_branch_only=current_branch_only,
tags=tags, prune=prune, depth=depth, tags=tags, prune=prune, depth=depth,
submodules=submodules, force_sync=force_sync, submodules=submodules, force_sync=force_sync,
clone_filter=clone_filter, retry_fetches=retry_fetches): clone_filter=clone_filter, retry_fetches=retry_fetches):
@ -1139,7 +1141,11 @@ class Project(object):
alternates_file = os.path.join(self.gitdir, 'objects/info/alternates') alternates_file = os.path.join(self.gitdir, 'objects/info/alternates')
if os.path.exists(alternates_file): if os.path.exists(alternates_file):
cmd = ['repack', '-a', '-d'] cmd = ['repack', '-a', '-d']
if GitCommand(self, cmd, bare=True).Wait() != 0: p = GitCommand(self, cmd, bare=True, capture_stdout=bool(output_redir),
merge_output=bool(output_redir))
if p.stdout and output_redir:
buf.write(p.stdout)
if p.Wait() != 0:
return False return False
platform_utils.remove(alternates_file) platform_utils.remove(alternates_file)
@ -1951,6 +1957,7 @@ class Project(object):
initial=False, initial=False,
quiet=False, quiet=False,
verbose=False, verbose=False,
output_redir=None,
alt_dir=None, alt_dir=None,
tags=True, tags=True,
prune=False, prune=False,
@ -2128,7 +2135,9 @@ class Project(object):
ok = prune_tried = False ok = prune_tried = False
for try_n in range(retry_fetches): for try_n in range(retry_fetches):
gitcmd = GitCommand(self, cmd, bare=True, ssh_proxy=ssh_proxy, gitcmd = GitCommand(self, cmd, bare=True, ssh_proxy=ssh_proxy,
merge_output=True, capture_stdout=quiet) merge_output=True, capture_stdout=quiet or bool(output_redir))
if gitcmd.stdout and not quiet and output_redir:
output_redir.write(gitcmd.stdout)
ret = gitcmd.Wait() ret = gitcmd.Wait()
if ret == 0: if ret == 0:
ok = True ok = True
@ -2170,7 +2179,7 @@ class Project(object):
# Git died with a signal, exit immediately # Git died with a signal, exit immediately
break break
if not verbose: if not verbose:
print('%s:\n%s' % (self.name, gitcmd.stdout), file=sys.stderr) print('\n%s:\n%s' % (self.name, gitcmd.stdout), file=sys.stderr)
time.sleep(random.randint(30, 45)) time.sleep(random.randint(30, 45))
if initial: if initial:
@ -2189,7 +2198,7 @@ class Project(object):
# Sync the current branch only with depth set to None. # Sync the current branch only with depth set to None.
# We always pass depth=None down to avoid infinite recursion. # We always pass depth=None down to avoid infinite recursion.
return self._RemoteFetch( return self._RemoteFetch(
name=name, quiet=quiet, verbose=verbose, name=name, quiet=quiet, verbose=verbose, output_redir=output_redir,
current_branch_only=current_branch_only and depth, current_branch_only=current_branch_only and depth,
initial=False, alt_dir=alt_dir, initial=False, alt_dir=alt_dir,
depth=None, clone_filter=clone_filter) depth=None, clone_filter=clone_filter)

View File

@ -13,6 +13,7 @@
# limitations under the License. # limitations under the License.
import http.cookiejar as cookielib import http.cookiejar as cookielib
import io
import json import json
import netrc import netrc
from optparse import SUPPRESS_HELP from optparse import SUPPRESS_HELP
@ -354,6 +355,7 @@ later is required to fix a server side protocol bug.
# - We always make sure we unlock the lock if we locked it. # - We always make sure we unlock the lock if we locked it.
start = time.time() start = time.time()
success = False success = False
buf = io.StringIO()
with lock: with lock:
pm.start(project.name) pm.start(project.name)
try: try:
@ -361,6 +363,7 @@ later is required to fix a server side protocol bug.
success = project.Sync_NetworkHalf( success = project.Sync_NetworkHalf(
quiet=opt.quiet, quiet=opt.quiet,
verbose=opt.verbose, verbose=opt.verbose,
output_redir=buf,
current_branch_only=opt.current_branch_only, current_branch_only=opt.current_branch_only,
force_sync=opt.force_sync, force_sync=opt.force_sync,
clone_bundle=opt.clone_bundle, clone_bundle=opt.clone_bundle,
@ -376,6 +379,10 @@ later is required to fix a server side protocol bug.
lock.acquire() lock.acquire()
did_lock = True did_lock = True
output = buf.getvalue()
if opt.verbose and output:
pm.update(inc=0, msg=output.rstrip())
if not success: if not success:
err_event.set() err_event.set()
print('error: Cannot fetch %s from %s' print('error: Cannot fetch %s from %s'