# HG changeset patch # User Yuya Nishihara # Date 2018-11-17 13:10:27 # Node ID ea2688c84e4b911615329dcb06a04a00b99098a3 # Parent 03bca908d9fb8df3baf29d6e4923b216cc93d460 blackbox: just try writing to repo.vfs and update lastlogger on success This is simpler and more robust. Before, an empty ".hg" directory would be created if it's removed after checking vfs.isdir('.'). diff --git a/hgext/blackbox.py b/hgext/blackbox.py --- a/hgext/blackbox.py +++ b/hgext/blackbox.py @@ -121,7 +121,7 @@ def _openlogfile(ui, vfs): newpath='%s.%d' % (path, i)) rotate(oldpath=path, newpath=maxfiles > 0 and path + '.1') - return vfs(name, 'a') + return vfs(name, 'a', makeparentdirs=False) class proxylogger(object): """Forward log events to another logger to be set later""" @@ -143,22 +143,10 @@ class blackboxlogger(object): self._repo = repo self._trackedevents = set(ui.configlist('blackbox', 'track')) - @property - def _bbvfs(self): - vfs = self._repo.vfs - if not vfs.isdir('.'): - vfs = None - return vfs - def tracked(self, event): return b'*' in self._trackedevents or event in self._trackedevents def log(self, ui, event, msg, opts): - if self._bbvfs: - _lastlogger.logger = self - else: - return - default = ui.configdate('devel', 'default-date') date = dateutil.datestr(default, ui.config('blackbox', 'date-format')) user = procutil.getuser() @@ -178,13 +166,15 @@ class blackboxlogger(object): try: fmt = '%s %s @%s%s (%s)%s> %s' args = (date, user, rev, changed, pid, src, msg) - with _openlogfile(ui, self._bbvfs) as fp: + with _openlogfile(ui, self._repo.vfs) as fp: fp.write(fmt % args) except (IOError, OSError) as err: # deactivate this to avoid failed logging again self._trackedevents.clear() ui.debug('warning: cannot write to blackbox.log: %s\n' % encoding.strtolocal(err.strerror)) + return + _lastlogger.logger = self def uipopulate(ui): ui.setlogger(b'blackbox', _lastlogger) diff --git a/tests/test-blackbox.t b/tests/test-blackbox.t --- a/tests/test-blackbox.t +++ b/tests/test-blackbox.t @@ -327,6 +327,29 @@ Test log recursion from dirty status che cleanup $ cd .. +Test missing log directory, which shouldn't be created automatically + + $ cat <<'EOF' > closeremove.py + > def reposetup(ui, repo): + > class rmrepo(repo.__class__): + > def close(self): + > super(rmrepo, self).close() + > self.ui.debug(b'removing %s\n' % self.vfs.base) + > self.vfs.rmtree() + > repo.__class__ = rmrepo + > EOF + + $ hg init gone + $ cd gone + $ cat <<'EOF' > .hg/hgrc + > [extensions] + > closeremove = ../closeremove.py + > EOF + $ hg log --debug + removing $TESTTMP/gone/.hg + warning: cannot write to blackbox.log: $ENOENT$ + $ cd .. + #if chg when using chg, blackbox.log should get rotated correctly