summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXimin Luo <infinity0@debian.org>2017-07-17 10:02:43 (GMT)
committerXimin Luo <infinity0@debian.org>2017-07-17 10:02:43 (GMT)
commitfe57c99828060ae77af2784961d47beb44eb74f5 (patch)
tree89f6f564f1df235a7825f2c71ffb9b791a7e2c46
parent01391f5cfb0fbb1142a67ed7be7a0d31db50a00e (diff)
main, logging: restore old logger settings to avoid pytest vomiting in certain situations
-rw-r--r--diffoscope/logging.py11
-rw-r--r--diffoscope/main.py11
2 files changed, 16 insertions, 6 deletions
diff --git a/diffoscope/logging.py b/diffoscope/logging.py
index 38bb9bf..3668aa3 100644
--- a/diffoscope/logging.py
+++ b/diffoscope/logging.py
@@ -17,11 +17,14 @@
# You should have received a copy of the GNU General Public License
# along with diffoscope. If not, see <https://www.gnu.org/licenses/>.
+import contextlib
import logging
+@contextlib.contextmanager
def setup_logging(debug, log_handler):
logger = logging.getLogger()
+ oldLevel = logger.getEffectiveLevel()
logger.setLevel(logging.DEBUG if debug else logging.WARNING)
ch = log_handler or logging.StreamHandler()
@@ -33,3 +36,11 @@ def setup_logging(debug, log_handler):
'%Y-%m-%d %H:%M:%S',
)
ch.setFormatter(formatter)
+ try:
+ yield logger
+ finally:
+ # restore old logging settings. this helps pytest not spew out errors
+ # like "ValueError: I/O operation on closed file", see
+ # https://github.com/pytest-dev/pytest/issues/14#issuecomment-272243656
+ logger.removeHandler(ch)
+ logger.setLevel(oldLevel)
diff --git a/diffoscope/main.py b/diffoscope/main.py
index b91f8b5..60e6600 100644
--- a/diffoscope/main.py
+++ b/diffoscope/main.py
@@ -322,11 +322,7 @@ def maybe_set_limit(config, parsed_args, key):
elif parsed_args.no_default_limits:
setattr(config, key, float("inf"))
-
-def run_diffoscope(parsed_args, post_parse):
- log_handler = ProgressManager().setup(parsed_args)
- setup_logging(parsed_args.debug, log_handler)
- post_parse(parsed_args)
+def run_diffoscope(parsed_args):
ProfileManager().setup(parsed_args)
PresenterManager().configure(parsed_args)
logger.debug("Starting diffoscope %s", VERSION)
@@ -394,7 +390,10 @@ def main(args=None):
with profile('main', 'parse_args'):
parser, post_parse = create_parser()
parsed_args = parser.parse_args(args)
- sys.exit(run_diffoscope(parsed_args, post_parse))
+ log_handler = ProgressManager().setup(parsed_args)
+ with setup_logging(parsed_args.debug, log_handler) as logger:
+ post_parse(parsed_args)
+ sys.exit(run_diffoscope(parsed_args))
except KeyboardInterrupt:
logger.info('Keyboard Interrupt')
sys.exit(2)