Using SFTP pull on Win32

Alexey Shamrin shamrin at gmail.com
Fri Nov 11 07:11:55 GMT 2005


On 11/11/05, Matt Lavin <matt.lavin at gmail.com> wrote:
> I've recently grabbed the 0.6 version of bzr to test out the new SFTP
> support and I was wondering how well it works on Windows.  Everything
> I've tried so far seems to work, after I applied a single change.
> Whenever bzr connects to my sftp server and tries to prompt me for a
> password I get an error about how getpass() fails when displaying
> unicode characters.  I tracked the problem down to _username, and _host
> are unicode, but putch() only accepts chars.  I should have copied the
> error message before fixing it, but I can reproduce it again if somebody
> needs it.  The change I made to make it work on my machine is to wrap
> the two arguments in str() calls to convert them back to non-unicode
> format.  I'm not sure how well this would work if the username has
> unicode characters, but I thought I should post to the list in case
> somebody else can have a nice solution.  In the end, I changed a line in
> bzrlib/transport/sftp.py from
>
>         password = getpass.getpass('SSH %s@%s password: ' %
> (self._username, self._host))
>
>  to
>
>       password = getpass.getpass('SSH %s@%s password: ' %
> (str(self._username), str(self._host)))

I agree, without the fix "bzr pull" fails (see the end of the message
for traceback).

I think the better way to fix the bug is to encode the arguments using
sys.stdout.encoding, because getpass always write to stoud. Here is
the patch:

=== modified file 'bzrlib\\transport\\sftp.py'
--- bzrlib\transport\sftp.py
+++ bzrlib\transport\sftp.py
@@ -446,7 +446,8 @@
                pass

        # give up and ask for a password
-        password = getpass.getpass('SSH %s@%s password: ' %
(self._username, self._host))
+        enc = sys.stdout.encoding
+        password = getpass.getpass('SSH %s@%s password: ' %
(self._username.encode(enc), self._host.encode(enc)))
        try:
            transport.auth_password(self._username, password)
        except paramiko.SSHException:


This fix not only makes "bzr pull" working, but also "bzr push"!


Error message and a traceback
=====================================

c:\work\prog\soft>bzr pull
Using saved location: sftp://user@li11-40.members.linode.com/home/user/prog
bzr: ERROR: putch() argument 1 must be char, not unicode
 command: 'c:\\soft\\python\\scripts\\bzr' 'pull'
     pwd: u'c:\\work\\prog\soft'
   error: exceptions.TypeError
 at c:\soft\python\lib\getpass.py line 49, in win_getpass()
 see ~/.bzr.log for debug information

Extract from the log:

Traceback (most recent call last):
 File "c:\work\prog\bzr\bzr.dev\bzrlib\commands.py", line 531, in
run_bzr_catch_errors
   return run_bzr(argv)
 File "c:\work\prog\bzr\bzr.dev\bzrlib\commands.py", line 506, in run_bzr
   ret = cmd_obj.run_argv(argv)
 File "c:\work\prog\bzr\bzr.dev\bzrlib\commands.py", line 225, in run_argv
   return self.run(**all_cmd_args)
 File "c:\work\prog\bzr\bzr.dev\bzrlib\builtins.py", line 382, in run
   br_from = Branch.open(location)
 File "c:\work\prog\bzr\bzr.dev\bzrlib\branch.py", line 119, in open
   t = get_transport(base)
 File "C:\work\prog\bzr\bzr.win32\bzrlib\transport\__init__.py", line
352, in get_transport
   return klass(base)
 File "C:\work\prog\bzr\bzr.win32\bzrlib\transport\__init__.py", line
367, in _loader
   return klass(base)
 File "c:\work\prog\bzr\bzr.dev\bzrlib\transport\sftp.py", line 97, in __init__
   self._sftp_connect()
 File "c:\work\prog\bzr\bzr.dev\bzrlib\transport\sftp.py", line 417,
in _sftp_connect
   self._sftp_auth(t, self._username, self._host)
 File "c:\work\prog\bzr\bzr.dev\bzrlib\transport\sftp.py", line 449,
in _sftp_auth
   password = getpass.getpass('SSH %s@%s password: ' %
(self._username, self._host))
 File "c:\soft\python\lib\getpass.py", line 49, in win_getpass
   msvcrt.putch(c)
TypeError: putch() argument 1 must be char, not unicode

--
Alexey




More information about the bazaar mailing list