Patchwork D9500: procutils: don't try to get `.buffer` if sys.stdin is None

login
register
mail settings
Submitter phabricator
Date Dec. 2, 2020, 6:08 p.m.
Message ID <differential-rev-PHID-DREV-dymnop6n46ynhnb5uheu-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/47782/
State Superseded
Headers show

Comments

phabricator - Dec. 2, 2020, 6:08 p.m.
pulkit created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  While hunting down following test failure of test-chg.t on Python 3, I stumbled
  the case when `.buffer` is not available as sys.stdin is None.
  
  - /home/pulkit/repo/hg-committed/tests/test-chg.t
  
  +++ /home/pulkit/repo/hg-committed/tests/test-chg.t.err
  	@@ -203,7 +203,31 @@
  
    	   $ CHGDEBUG=1 chg version -q 0<&-
    		 chg: debug: * stdio fds are missing (glob)
    	     chg: debug: * execute original hg (glob)
    		 -  Mercurial Distributed SCM * (glob)
    		 +  Traceback (most recent call last):
    		 +    File "/tmp/hgtests.avspvsq4/install/bin/hg", line 43, in <module>
    		 +      dispatch.run()
    		 +    File "/usr/lib/python3.6/importlib/util.py", line 233, in
    		 __getattribute__
    		 +      self.__spec__.loader.exec_module(self)
    		 +    File "<frozen importlib._bootstrap_external>", line 678, in
    		 exec_module
    		 +    File "<frozen importlib._bootstrap>", line 219, in
    		 _call_with_frames_removed
    		 +    File
    		 "/tmp/hgtests.avspvsq4/install/lib/python/mercurial/dispatch.py", line
    		 726, in <module>
    		 +      class lazyaliasentry(object):
    		 +    File
    		 "/tmp/hgtests.avspvsq4/install/lib/python/mercurial/dispatch.py", line
    		 737, in lazyaliasentry
    		 +      @util.propertycache
    		 +    File "/usr/lib/python3.6/importlib/util.py", line 233, in
    		 __getattribute__
    		 +      self.__spec__.loader.exec_module(self)
    		 +    File "<frozen importlib._bootstrap_external>", line 678, in
    		 exec_module
    		 +    File "<frozen importlib._bootstrap>", line 219, in
    		 _call_with_frames_removed
    		 +    File "/tmp/hgtests.avspvsq4/install/lib/python/mercurial/util.py",
    		 line 3473, in <module>
    		 +      f=procutil.stderr,
    		 +    File "/usr/lib/python3.6/importlib/util.py", line 233, in
    		 __getattribute__
    		 +      self.__spec__.loader.exec_module(self)
    		 +    File "<frozen importlib._bootstrap_external>", line 678, in
    		 exec_module
    		 +    File "<frozen importlib._bootstrap>", line 219, in
    		 _call_with_frames_removed
    		 +    File
    		 "/tmp/hgtests.avspvsq4/install/lib/python/mercurial/utils/procutil.py",
    		 line 127, in <module>
    		 +      stdin = sys.stdin.buffer
    		 +  AttributeError: 'NoneType' object has no attribute 'buffer'
    		 +  [1]
    
    		  server lifecycle
    		   ----------------

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D9500

AFFECTED FILES
  mercurial/utils/procutil.py

CHANGE DETAILS




To: pulkit, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/mercurial/utils/procutil.py b/mercurial/utils/procutil.py
--- a/mercurial/utils/procutil.py
+++ b/mercurial/utils/procutil.py
@@ -124,7 +124,9 @@ 
     # Python 3 implements its own I/O streams.
     # TODO: .buffer might not exist if std streams were replaced; we'll need
     # a silly wrapper to make a bytes stream backed by a unicode one.
-    stdin = sys.stdin.buffer
+
+    # sys.stdin can be None
+    stdin = sys.stdin.buffer if sys.stdin else sys.stdin
     stdout = _make_write_all(sys.stdout.buffer)
     stderr = _make_write_all(sys.stderr.buffer)
     if pycompat.iswindows: