Patchwork [5,of,5] cmdutil: do not duplicate stdout by makefileobj()

login
register
mail settings
Submitter Yuya Nishihara
Date Dec. 17, 2015, 2:09 p.m.
Message ID <a3a19a652fe6c25703a5.1450361365@mimosa>
Download mbox | patch
Permalink /patch/12100/
State Accepted
Headers show

Comments

Yuya Nishihara - Dec. 17, 2015, 2:09 p.m.
# HG changeset patch
# User Yuya Nishihara <yuya@tcha.org>
# Date 1450004839 -32400
#      Sun Dec 13 20:07:19 2015 +0900
# Node ID a3a19a652fe6c25703a5f09be8192ecc5dda013d
# Parent  41f488a682b0c9be578244fd4e95ba7ae09f796f
cmdutil: do not duplicate stdout by makefileobj()

It made output order unpredictable because two separate buffers are flushed
individually. Let's use a thin wrapper that just sends close() to black hole.
Augie Fackler - Dec. 18, 2015, 4:30 p.m.
On Thu, Dec 17, 2015 at 11:09:25PM +0900, Yuya Nishihara wrote:
> # HG changeset patch
> # User Yuya Nishihara <yuya@tcha.org>
> # Date 1450004839 -32400
> #      Sun Dec 13 20:07:19 2015 +0900
> # Node ID a3a19a652fe6c25703a5f09be8192ecc5dda013d
> # Parent  41f488a682b0c9be578244fd4e95ba7ae09f796f
> cmdutil: do not duplicate stdout by makefileobj()

Queued these, thanks

>
> It made output order unpredictable because two separate buffers are flushed
> individually. Let's use a thin wrapper that just sends close() to black hole.
>
> diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
> --- a/mercurial/cmdutil.py
> +++ b/mercurial/cmdutil.py
> @@ -461,12 +461,7 @@ def makefileobj(repo, pat, node=None, de
>              fp = repo.ui.fout
>          else:
>              fp = repo.ui.fin
> -        if util.safehasattr(fp, 'fileno'):
> -            return os.fdopen(os.dup(fp.fileno()), mode)
> -        else:
> -            # if this fp can't be duped properly, return
> -            # a dummy object that can be closed
> -            return _unclosablefile(fp)
> +        return _unclosablefile(fp)
>      if util.safehasattr(pat, 'write') and writable:
>          return pat
>      if util.safehasattr(pat, 'read') and 'r' in mode:
> diff --git a/tests/test-export.t b/tests/test-export.t
> --- a/tests/test-export.t
> +++ b/tests/test-export.t
> @@ -140,6 +140,7 @@ Exporting revision -2 to a file:
>  No filename should be printed if stdout is specified explicitly:
>
>    $ hg export -v 1 -o -
> +  exporting patch:
>    # HG changeset patch
>    # User test
>    # Date 0 0
> @@ -154,7 +155,6 @@ No filename should be printed if stdout
>    @@ -1,1 +1,2 @@
>     foo-0
>    +foo-1
> -  exporting patch:
>
>  Checking if only alphanumeric characters are used in the file name (%m option):
>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -461,12 +461,7 @@  def makefileobj(repo, pat, node=None, de
             fp = repo.ui.fout
         else:
             fp = repo.ui.fin
-        if util.safehasattr(fp, 'fileno'):
-            return os.fdopen(os.dup(fp.fileno()), mode)
-        else:
-            # if this fp can't be duped properly, return
-            # a dummy object that can be closed
-            return _unclosablefile(fp)
+        return _unclosablefile(fp)
     if util.safehasattr(pat, 'write') and writable:
         return pat
     if util.safehasattr(pat, 'read') and 'r' in mode:
diff --git a/tests/test-export.t b/tests/test-export.t
--- a/tests/test-export.t
+++ b/tests/test-export.t
@@ -140,6 +140,7 @@  Exporting revision -2 to a file:
 No filename should be printed if stdout is specified explicitly:
 
   $ hg export -v 1 -o -
+  exporting patch:
   # HG changeset patch
   # User test
   # Date 0 0
@@ -154,7 +155,6 @@  No filename should be printed if stdout 
   @@ -1,1 +1,2 @@
    foo-0
   +foo-1
-  exporting patch:
 
 Checking if only alphanumeric characters are used in the file name (%m option):