Mercurial > hg
view hgdemandimport/tracing.py @ 44015:7ca8aa8840c0 stable
subrepo: fix a crash when archiving an svn or git subrepo
Only hgsubrepos have a repository attribute. This is pretty hacky, but probably
the best we can do on stable. Pushing the lfstatus check down into the wrapper
for hgsubrepo (and dropping the check for lfstatus at the top of
`hgsubrepoarchive()`) resulted in various test failures because:
1) hgsubrepoarchive isn't returning the number of files archived at the
bottom, resulting in an error about += NoneType
2) These copypasta archive wrappers don't use progress bars
3) Largefiles are *not* currently archived when using extdiff (68822b7cdd01),
but pushing this context manager down into the subrepo resulted in it
apparently doing so (as evidenced by progress bars being dropped)
The other uses of `lfstatus()` are not in the substate processing loop, so they
shouldn't be an issue.
I initially put testcases in this test for largefiles-{on,off}, and it flagged
a bunch of exit code differences for `cat` and `diff`, so I backed that off.
Differential Revision: https://phab.mercurial-scm.org/D7714
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Tue, 24 Dec 2019 01:38:02 -0500 |
parents | 2372284d9457 |
children | 6000f5b25c9b |
line wrap: on
line source
# Support code for event tracing in Mercurial. Lives in demandimport # so it can also be used in demandimport. # # Copyright 2018 Google LLC. # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from __future__ import absolute_import import contextlib import os _pipe = None _checked = False _session = 'none' def _isactive(): global _pipe, _session, _checked if _pipe is None: if _checked: return False _checked = True if 'HGCATAPULTSERVERPIPE' not in os.environ: return False _pipe = open(os.environ['HGCATAPULTSERVERPIPE'], 'w', 1) _session = os.environ.get('HGCATAPULTSESSION', 'none') return True @contextlib.contextmanager def log(whencefmt, *whenceargs): if not _isactive(): yield return whence = whencefmt % whenceargs try: # Both writes to the pipe are wrapped in try/except to ignore # errors, as we can see mysterious errors in here if the pager # is active. Presumably other conditions could trigger # problems too. try: _pipe.write('START %s %s\n' % (_session, whence)) except IOError: pass yield finally: try: _pipe.write('END %s %s\n' % (_session, whence)) except IOError: pass def counter(label, amount, *labelargs): if not _isactive(): return l = label % labelargs # See above in log() for why this is in a try/except. try: _pipe.write('COUNTER %s %d %s\n' % (_session, amount, l)) except IOError: pass