Thread (1 message) 1 message, 1 author, 2016-06-15

Re: [PATCH] git-remote-hg: set stdout to binary mode on win32

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:57:19

Felipe Contreras [off-list ref] writes:
Sorry Amit, I assumed this patch made it to the list, but I just
realized it didn't; it doesn't allow HTML, and mails and silently
dropped (I hate that).

So I'm sending it so the list can see it:

It seems OK for me, but I would like to try it, and so far I haven't
managed to access Mercurial libraries at all from python scripts in
Windows. What steps did you follow?
Thanks for keeping an eye on this part of the system.  It seems that
having an extra -rc cycle turned out to be not so bad an idea.


On Mon, Jan 28, 2013 at 4:13 PM, Amit Bakshi [off-list ref] wrote:
quoted
git clone hangs on windows (msysgit/cygwin), and
file.write would return errno 22 inside of mercurial's
windows.winstdout wrapper class. This patch sets
stdout's mode to binary, fixing both issues.
---
 contrib/remote-helpers/git-remote-hg | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
diff --git a/contrib/remote-helpers/git-remote-hg
b/contrib/remote-helpers/git-remote-hg
index 328c2dc..95f4c1f 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg
@@ -62,6 +62,24 @@ def get_config(config):
     output, _ = process.communicate()
     return output

+#
+# On Windows (msysgit/cygwin) have to set stdout to binary
+# mode (_O_BINARY is 32768). Otherwise clone hangs, and pushing
+# to remote fails when doing a write to mercurial's wrapper
+# windows.winstdout wrapper class.
+#
+def set_binmode(fd):
+    try:
+        if sys.platform == "win32":
+            import msvcrt
+            msvcrt.setmode(fd, os.O_BINARY)
+        elif sys.platform  == 'cygwin':
+            import ctypes
+            msvcrt = ctypes.CDLL('msvcrt.dll')
+            msvcrt._setmode(fd, 32768) # On Cygwin os.O_BINARY is different
+    except OSError:
+        pass
+
 class Marks:

     def __init__(self, path):
@@ -764,6 +782,9 @@ def main(args):
     else:
         is_tmp = False

+    if sys.platform in ['win32','cygwin']:
+        set_binmode(sys.stdout.fileno())
+
     gitdir = os.environ['GIT_DIR']
     dirname = os.path.join(gitdir, 'hg', alias)
     branches = {}
--
1.8.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help