Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
git clone ssh failing
-
That's what I thought, too. But dulwich is nowhere to be found, in any of the 3 site-packages folders. I've restarted Pythonista and tried git clone ssh multiple times. I get the message:
stash: <class 'paramiko.ssh_exception.SSHException'>: No authentication methods available
-
stash by default installs the git dependencies into stash/lib.
Make sure you install your ssh keys into ~/.ssh. This might be a d fferent folder than in py2, so you may want to copy them
cp ~/../.ssh ~/.ssh
. I should have mentioned that whilessh
looks in two places, git only looks in ~/.ssh. -
Also, I will point out that stash actually uses the python2 interpreter within pythonista 3. Also, in recent beta versions, subprocess got mucked up, which breaks the exceptions that get caught in dulwich. The fix is
import subprocess if not hasattr(subprocess,'call'): def Popen(*args,**kwargs): pass def call(*args,**kwargs): return 0 subprocess.Popen=Popen subprocess.call=call
If you try using dulwich directly, just move the dulwich folder from stash/lib to site-packages, and you can then try using dulwich.porcelain.clone.That should work in either the py2 or py3 interpreter. You may need
dulwich.client.get_ssh_vendor = dulwich.client.ParamikoSSHVendor
-
Thanks for the additional detail, @JonB.
I did indeed need that second .ssh folder to get back where I was with Pythonista 2. And I did find the dulwich folder in stash/lib. Oh, and git.py has the ParamikoSSHVendor line. However, I'm back to the same error as before ("The remote server unexpectedly closed the connection.").
I'll try to look into the subprocess issue later today. Is Jelmer aware of it?
-
The subprocess issue is a pythonista issue, not dulwich. Because IOS does not let you spawn a subprocess, the newer betas commented out those parts of the standard lib (earlier versions still had all the named defined, but raised errors). dulwich imports Popen and call, but the normal workflow does not need them. (used for executing hooks, or certain type of local repositories)
BTW, in stash, you can use
stashconf py_pdb 1
to enable pdb when an error is encountered. Orstashconf py_traceback 1
to print a full traceback.You might try importing dulwich and using porcelain. There are some ways to try to request just a single branch for instance, or, say a single commit, just to see if the connection works.
-
Thanks for the tips, @JonB.
Has the subprocess issue been reported? I don't have a beta version of anything I'm using, as far as I know. Which files should I look for?
I tried using dulwich.porcelain.clone('ssh://user@git.myCompany.com/MyRepository.git'). I get the following error. Any ideas?
TypeError: MyRepository.git
-
May be you can get workingcopy and use @ccc's scripts to sync with pythonista.
https://github.com/cclauss/Pythonista-and-Working-Copy -
Thanks, @abcabc. Yes, I have Working Copy successfully cloning as I mentioned earlier. However, I'd like to see if I can get dulwich working properly, since it would be much more convenient for me.
Jelmer says that the TypeError is a known issue with Python 3, and that it is in the bug tracker. So, I may be stuck for now.
-
Use the python 2 interpreter -- either prepend the script with #!python2, or long press and select run with 2.7.
-
@JonB, I get the same TypeError with Python 2 or 3. However, if I run the Python 2 script from the command line, I get the following:
stash: <type 'exceptions.OSError'>: [Errno 1] Operation not permitted
Traceback (most recent call last):
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/stash/system/shruntime.py", line 490, in exec_py_file
execfile(file_path, namespace, namespace)
File "test.py", line 6, in <module>
dulwich.porcelain.clone('ssh://user@git.myCompany.com/MyRepository.git')
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/porcelain.py", line 258, in clone
progress=errstream.write)
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/client.py", line 251, in fetch
def abort():
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/client.py", line 557, in fetch_packFile "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/client.py", line 921, in _connect
raise TypeError(path)
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/client.py", line 877, in run_command
if port is not None:
File "/var/containers/Bundle/Application/297756CD-F73E-44E6-AB25-42E99062FE48/Pythonista3.app/Frameworks/PythonistaKit.framework/pylib/subprocess.py", line 711, in init
errread, errwrite)
File "/var/containers/Bundle/Application/297756CD-F73E-44E6-AB25-42E99062FE48/Pythonista3.app/Frameworks/PythonistaKit.framework/pylib/subprocess.py", line 1205, in _execute_child
self.pid = os.fork()
OSError: [Errno 1] Operation not permitted -
Sorry, should have mentioned, after importing dulwich.client, you need to use
dulwich.client.get_ssh_vendor = dulwich.client.ParamikoSSHVendor
which tells dulwich to use paramiko instead of using the built in ssh
-
Thanks, @JonB. Sorry, I thought I had already done that. OK, now that I have that back in there, I'm getting the same dulwich.errors.HangupException as I started with.
Any other ideas for figuring out what's happening?
-
Can you find out what your company uses for a server?
Let's try going a little lower level, so we can add some logging:
https://gist.github.com/e60abaa38bd5685637e758175d7f2bdareplace
source
with your info.
check the resulting paramikolog.txt for any errors that might indicate a auth error, or other connection error.In the info printed to stdout , verify that you can see the refs from the server, and see if any are successfully downloaded. (you will see a message about Counting Objects done). if so, keep running the script, and figure out which ref is causing issues.
If the first one fails, you might try changing the determine_wants to request a different ref.
Or, is your work repo using submodules? Those are not supported in the dulwich we are using, though there seems to be some pull reqs on this recently.
j
-
Thanks for your continued help, @JonB.
With your script, I don't get a paramikolog.txt at all. Just the same HangupException.
Our company server reports:
Ubuntu 12.04.5 LTS (GNU/Linux 3.13.0-100-generic x86_64)
git version 1.7.9.5I don't believe we use submodules. How do I tell?
-
Do you get any printout from the script? I am surprised you don't get any list of refs...
Perhaps also change the paramikolog.txt to os.path.expanduser('~/Documents/paramikolog.txt')
-
When I run the script with your source, it creates a paramikolog.txt file just fine. But when I use my source, apparently there's nothing to write because the file is never created. And no other output on the command line. All I get is a dulwichtests/.git folder with initialized files and folders.
-
That is surprising, because at a minimum, you should get a "logging started" message which is logged right off the bat by my script.
Then you should see some startup stuff, and the authentication negotiation..
-
Can you post a full traceback of your hangup error?
-
stash: <class 'dulwich.errors.HangupException'>: The remote server unexpectedly closed the connection.
Traceback (most recent call last):
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/stash/system/shruntime.py", line 490, in exec_py_file
execfile(file_path, namespace, namespace)
File "test_dulwich_ssh.py", line 60, in <module>
fetch_one()
File "test_dulwich_ssh.py", line 58, in fetch_one
progress=sys.stdout.write)
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/client.py", line 251, in fetch
progress)
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/client.py", line 559, in fetch_pack
refs, server_capabilities = read_pkt_refs(proto)
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/client.py", line 168, in read_pkt_refs
for pkt in proto.read_pkt_seq():
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/protocol.py", line 201, in read_pkt_seq
pkt = self.read_pkt_line()
File "/private/var/mobile/Containers/Shared/AppGroup/E35AE39A-48FB-44A1-BC2A-EE57EF6EAA4D/Pythonista3/Documents/site-packages/dulwich/protocol.py", line 152, in read_pkt_line
raise HangupException()
HangupException: The remote server unexpectedly closed the connection. -
Can you exit/restart pythonista, then run the script directly(no stash)?
Incidentally, i can reproduce this error if I type in an incorrect repo path. Are you SURE you have the full and proper path? i.e if i change uicomponents to uicomponent, i get thto same error as you.
Try adding this right after the get_transport line, around 34:
proto, can_read = client._connect(b'upload-pack', host_path) import time time.sleep(1.0) okay_to_read=can_read() while okay_to_read: line=proto.read_pkt_line() if line: line=line.replace('\x00','') print(line) okay_to_read=can_read()