Forum Archive

Stash/git/dulwich and binaries

mikael

Hello again

I can include binary files like images in my Github repo using the web interface. But if I try to push the same file in stash/git, I get a broken pipe error until I rm the file from the staging area.

Do others have the same issue? Any way around it?

Thanks!

JonB

Have you tried using ssh to push? For whatever reason, zi have found it more reliable, but slower. I usually set up origin as the https url, and originssh as the ssh url, the can use git push originssh when things go south.

Another thing that can help is to do a fetch/merge before pushing, as sometimes github won't let you push if your branch is not a direct descendant of the one on github.

Do you have a specific file that you can reproduce this with, in a blank repo? If so, I can take a look... the problem for me has always been figuring out a way to reproduce it, so we can flag the issue in dulwich.

mikael

@JonB, thanks. Unfortunately I am too git-incompetent to know how to set originssh. I am using https urls throughout.

Steps to recreate the issue:

  1. Create a new repository in github, with a README file.
  2. Create a local directory and clone the new repository.
  3. Modify README file and push - successful.
  4. Create a new text file and push - successful.
  5. Add a smallish binary file in the root directory and push - successful.
  6. Add a larger binary file and push - fails with the error below.

Error:

stash: <class 'urllib2.URLError'>: <urlopen error [Errno 32] Broken pipe>

After this failure, the only way I have been able to resume normal git client use is to remove .git and clone again from remote.

Here is a sample smallish 37.5K binary.
Here is a sample larger 1.4M binary.

Above using the latest selfupdated version of stash:

StaSh v0.6.18
Pythonista 3.1 (301016)
iOS 10.3.2 (64-bit iPhone8,2)
root: ~/Documents/site-packages/stash
stash.py: 2017-04-19 11:36:33
SELFUPDATE_BRANCH: master
BIN_PATH:
  ~/Documents/bin
  ~/Documents/stash_extensions/bin
  ~/Documents/site-packages/stash/bin
JonB

very intersting - i was able to reproduce with these files, so that helps. I will play around with dulwich to see if this is reproduced with plain dulwich, then can open an issue against dulwich.

mikael

Did you try with an ssh url, and did it make any difference?

AtomBombed

I don't have Pythonista anymore, so I can't exactly reproduce your issue. But to my understanding, StaSh runs on Python 2. The way 2 and 3 handles networking interfaces is a little different, mainly because Python 3 uses bytes objects instead of normal strings for most networking tasks (like the requests module). So maybe that's part of your problem: the way it's handling your binary?

ccc

The study of requests source code reveals and impressive array of high quality "complexity hiding" techniques. One of the most visible end user manifestations of this is the .text and .content attributes and .json() method of a requests.get() for instance. They return the results of the get() as Unicode, bytes, and json respectively. They do this flawless despite the fact that Python 2 and 3 have different notions of Unicode and bytes/strings. This complexity hiding helps users deliver a lot of functionality in little code.

mikael

@JonB, did you get any results from plain dulwich? I do not have a "plain" Python setup, but can start looking into it if you are otherwise occupied.

JonB

I think i did, but was getting a minimum repeatable failure... I have been on travel so have not gotten back to it...