[PATCH 1 of 2] blackbox: prevent failed I/O from causing hg to abort

Bryan O'Sullivan bos at serpentine.com
Tue Mar 19 18:00:37 CDT 2013


# HG changeset patch
# User Bryan O'Sullivan <bryano at fb.com>
# Date 1363734026 25200
# Node ID 9a44c44337c701d6212454b993caa5f778254f56
# Parent  de0601436fb6156c173abc2d7a6099f0c0b6b7cb
blackbox: prevent failed I/O from causing hg to abort

Instead, we simply print a warning message if opening the blackbox log
file fails, or if writing to it fails.

diff --git a/hgext/blackbox.py b/hgext/blackbox.py
--- a/hgext/blackbox.py
+++ b/hgext/blackbox.py
@@ -57,11 +57,20 @@ def wrapui(ui):
                 date = util.datestr(None, '%Y/%m/%d %H:%M:%S')
                 user = getpass.getuser()
                 formattedmsg = msg[0] % msg[1:]
-                blackbox.write('%s %s> %s' % (date, user, formattedmsg))
+                try:
+                    blackbox.write('%s %s> %s' % (date, user, formattedmsg))
+                except IOError, err:
+                    self.warn(_('warning: cannot write to blackbox.log: %s\n') %
+                              err.strerror)
                 lastblackbox = blackbox
 
         def setrepo(self, repo):
-            self._blackbox = repo.opener('blackbox.log', 'a')
+            try:
+                self._blackbox = repo.opener('blackbox.log', 'a')
+            except IOError, err:
+                self.warn(_('warning: cannot write to blackbox.log: %s\n') %
+                          err.strerror)
+                self._blackbox = None
 
     ui.__class__ = blackboxui
 
diff --git a/tests/test-blackbox.t b/tests/test-blackbox.t
--- a/tests/test-blackbox.t
+++ b/tests/test-blackbox.t
@@ -61,6 +61,30 @@ clone, commit, pull
   1970/01/01 00:00:00 bob> 1 incoming changes - new heads: d02f48003e62
   1970/01/01 00:00:00 bob> pull exited None after * seconds (glob)
 
+we must not cause a failure if we cannot write to the log
+
+  $ hg rollback
+  repository tip rolled back to revision 1 (undo pull)
+  $ chmod 000 .hg/blackbox.log
+  $ hg pull
+  warning: cannot write to blackbox.log: Permission denied
+  pulling from $TESTTMP/blackboxtest
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files
+  (run 'hg update' to get a working copy)
+
+a failure reading from the log is fine
+
+  $ hg blackbox -l 3
+  warning: cannot write to blackbox.log: Permission denied
+  abort: Permission denied: $TESTTMP/blackboxtest2/.hg/blackbox.log
+  [255]
+
+  $ chmod 600 .hg/blackbox.log
+
 backup bundles get logged
 
   $ touch d


More information about the Mercurial-devel mailing list