Forum Archive

git / github workflow in stash

JonB

With the addition (in latest master and dev brsnches) of the new gh command for interfacing with github (create, fork, or issue pull requests), I figure it is time to start writing down some simple git in stash tutorials. This is probably also a good way to expose and work on the remaining bugs in the stash git implementation.

https://github.com/jsbain/stash_git_tutorial/blob/master/stash_git_tutorial.md

Tizzy

hey @jonb If I use version control at all, I tend to make repos in bitbucket since it lets you make private repos unlike github where you have to pay for that privilege. Usually I'm doing ad-hoc stuff with all sorts of either private apis / access keys all over the place so I don't feel comfortable putting stuff into public until it's more or less being wrapped up. Stash will work with other git services like bitbucket correct?

I've been using dropbox syncing constantly for working on apps/scripts between my mac and iOS, and I really would like to move over to using legit version control exclusively for everything, but to be honest I just don't feel like I have enough of a mastery of git to trust myself with it and it feels so finicky in so many ways.

TBH I would love to see version control as a built-in first-party citizen of Pythonista kind of like it is in xCode. Perhaps @jonb @omz collaboration to bake stash into Pythonista?

JonB

stash git should, in theory, work with bitbucket.

If you have the ability to use ssh, this works the best -- slightly slower but more robust. you would then use git+ssh:// type urls instead of https. The gh module is specifically for creating /forking repos in github, if bitbucket has a similar api i suspect we could extend this to a more generic repo provider interface.

dcl

Has any progress been made with interfacing StaSh with Bitbucket? I am trying to share a project between my iPad and iPhone on Pythonista and I would like to use Bitbucket + StaSh to do revision control and be able to push from one device and pull from another. Bitbucket (as mentioned above) allows me to keep the project private without paying monthly for the service, and as this is a non-revenue project I do not wish to pay for monthly hosting.
I have found, however, that StaSh isn't playing nicely with Bitbucket at the moment. Any advice?

I tried the command:
git clone https://myusername@bitbucket.org/myusername/myproj.git localFolder

And got the error:
class 'dulwich.errors.GitProtocolError'>: unexpected http response 401

dcl

Figured out the 401 error. It is complaining about credentials.

I created a new local repo on my iPad and tried to push it to an empty repo on Bitbucket. I added a remote for the Bitbucket repo using:

git remote [name] [URL] 

And then tried to push using:

Git push [name] 
Username: [user]
Password: [pass]

But I got the same error as above

class 'dulwich.errors.GitProtocolError'>: unexpected http response 401

Is there some reason that StaSh can't talk to Bitbucket? Can I use SSH keys? If so, how so I do that?

Also, in the process I added a bad remote to my repo on the iPad. Is there some StaSh command to remove a remote? The help doesn't list one. I suppose I could dig through the source to find how it added one and reverse that... if I had to.


EDIT:

Trashed the repo on the iPad because there is no way to remove remotes.

Went back to Bitbucket and turned the repo off of "Private"

Then I went back to Pythonista -> StaSh window and tried clone repo again using:

git clone [URL]  

And successfully got the repo to clone on my iPad
I then added some files to the repo from the iPad by moving files from another folder in Pythonista and then added to the repo using:

git add *
git commit
Commit Message: [message]
Author Name: [name]
Save [y/n]y
Author Email: [email]
Save [y/n]y

This worked okay too, but then when I tried to push back to the repo using:

git push
Username: [user]
Password: [pass]

I ALWAYS get the same error from before:

class 'dulwich.errors.GitProtocolError'>: unexpected http response 401

And I am certain my credentials are correct for the repo (I have logged into and out of it on the website many times today to verify this). I have tried using my email instead of username. Nothing I try works to allow me to push back to the Bitbucket repo.

Would it be possible for someone to try this and let me know what I am doing wrong, or add Bitbucket capability to dulwich if necessary? Thanks!!

khilnani

I get the same issue with github.com private repos. I cloned a private repo, pull changes, edited a file locally, comit and tried to push. The push fails with 401.

Its able to clone and pull from a private repo, but cant push.

Is anyone able to use stash git with private repos? Wondering if its only a few of us having issues.

ccc

Have you tried Working Copy? https://workingcopyapp.com

JonB

@khilnani
It occurs to me that when we add the use/pass to the repo for push, we might not be honorng an existing password, thus end up with something like
https://user:pass@user:pass@github.com.....

Can you try creating a new remote which points to the bare url without any buser/pass info? (i.e https://github.com/owner/repo.git), then push to that url?

JonB

also, i should add that ssh might be better for private repos in general. you iust have to set up the keys and then it just works.

khilnani

@ccc said:

Have you tried Working Copy? https://workingcopyapp.com

I already have that but wanted to find something inside pythonista since i have projects with many files to open in app back and forth :(

Good suggestion tho.

khilnani

@JonB said:

also, i should add that ssh might be better for private repos in general. you iust have to set up the keys and then it just works.

Hmmm.. For some reason i didnt try ssh when i use that everywhere else. I guess, i assumed it wouldnt work since Pythonista is an 'app'.

I did try your other suggestion and that didnt work. Seems like on ssh keys work with git@ urls and not https at all.

Might send a PR to https://github.com/jsbain/stash_git_tutorial/blob/master/stash_git_tutorial.md ... Noticed it mentions ssh in an upcoming update :)

Thanks for helping!!! @JonB

JonB

did ssh work for you?
Here is the section of an updated git tutorial (though i can't push it because I am in the midst of removing the gittle dependencies in stash git, so dont have a fully working git)

Setting up ssh keys

In some cases, you may need or want to use ssh instead of https. This is a somewhat more reliable way of pushing, though it can be a little slower. This might also work for private repos.

With guthub, the process is facilitated by the gh command in stash:

[git_tutorial]$ gh create_key stash 

creates a key, and adds it to your github account. Note this command uses the stored github password, so you will have to create a key in your keychain, or better yet just use git push on an existing repo.

If you are using a non-github ssh, bitbucket, etc, you can create an ssh key

$ ssh-keygen -trsa -b2048
pbcopy ~/.ssh/id_rsa.pub 

creates a key, and copies the public key to the clipboard. You can then paste this into whatever you use for setting up the keys on the server.

Next, we need to add a remote to an existing repo:

[git_tutorial]$ git remote originssh ssh://git@github.com/jsbain/stash_git_tutorial.git

Now you can fetch/push,etc from originssh
```bash
[git_tutorial] git push originssh

khilnani

@JonB ssh keys worked after setting up in pythonista and github. Thanks!

Am still working through a few scenarios:
1 - moving files. Noticed there is no git mv command.
2 - adding directories with sub directories. Seems like need to add complete relative path of the files in each directory (* works) while in the main dir with .git
3 - files deleted without git rm. eg. deleting from pythonista GUI. git status, git pull etc. all fail with a IO exception
4 - Files deleted remotely - after a git pull, any file deleted remotely is auto staged to be added instead of being removed locally

JonB

yes, removing files is probably not handled well... how does git handle rm without git rm?

i actually recommend against git pull in most cases, it will happily onliterate any local changes. i tend to use git fetch followed by git merge, which at least tries to do sane things (though is not exactly like the real git merge). iirc git reset can be helpful when files get deleted without git rm.

I am in the process of removing gittle dependencies, and will then be able to use the most recent dulwich. Some improvements have already been made to dulwich.porcelain, and this would let us make pull requests to dulwich...

khilnani

@JonB said:

yes, removing files is probably not handled well... how does git handle rm without git rm?

from what ive seen, it treats them as if git rm was called and auto stages the removes

i actually recommend against git pull in most cases, it will happily onliterate any local changes. i tend to use git fetch followed by git merge, which at least tries to do sane things (though is not exactly like the real git merge). iirc git reset can be helpful when files get deleted without git rm.

git fetch OR git fetch origin OR even fit fetch git@gihub... gives an error -

stash: <type 'exceptions.Exception'>: url must match a remote name, or must start with http:// or https://

i tried git reset after manually deleting a file. didnt seem to help. Still get

stash: <type 'exceptions.OSError'>: [Errno 2] No such file or directory: '/private/var/mobile/Containers/Shared/AppGroup/A90BB332.......ACD7F/Pythonista3/Documents/pythonista-scripts/test'

I am in the process of removing gittle dependencies, and will then be able to use the most recent dulwich. Some improvements have already been made to dulwich.porcelain, and this would let us make pull requests to dulwich...

cool !!!!

Thanks so much for helping out!!!

mikael

Tried gh create_key stash, which failed because it could not import jwt. Tried pip installing jwt, which partially failed installing dependency typing. Trying the original command again, which failed with syntax error in jwk.py (which makes sense if it depends on typing).

This with latest vanilla version of Pythonista 3 and an updated version of stash.

JonB

hmm, @mikael, can you post the traceback? I don't have jwt installed, must be a module collision somewhere

mikael

@JonB, not sure how to get a traceback. Here's what happens:

gh create_key stash
no github found in /private/var/mobile/Containers/Shared/AppGroup/447A26CB-FA57-4E8A-8C34-082F55AD274F/Pythonista3/Documents/site-packages/stash/lib
Installing pygithub master ...
Opening: https://github.com/pygithub/pygithub/archive/master.zip
Save as: /private/var/mobile/Containers/Data/Application/33F31BE9-F7A7-4092-8AFE-9E3C77723213/tmp//pygithub.zip 
   3168996
Done
stash: <type 'exceptions.ImportError'>: No module named jwt
JonB

stashconf py_traceback 1

then run the command

mikael

Thanks. As I started stash to do this, I got a tip with that exact same line for enabling tracebacks. Funny - or scary, depending on how you see the world.

Here's the trace:

Traceback (most recent call last):
  File "/private/var/mobile/Containers/Shared/AppGroup/447A26CB-FA57-4E8A-8C34-082F55AD274F/Pythonista3/Documents/site-packages/stash/system/shruntime.py", line 498, in exec_py_file
    exec code in namespace, namespace
  File "site-packages/stash/bin/gh.py", line 44, in <module>
    import github
  File "/private/var/mobile/Containers/Shared/AppGroup/447A26CB-FA57-4E8A-8C34-082F55AD274F/Pythonista3/Documents/site-packages/stash/lib/github/__init__.py", line 37, in <module>
    from MainClass import Github, GithubIntegration
  File "/private/var/mobile/Containers/Shared/AppGroup/447A26CB-FA57-4E8A-8C34-082F55AD274F/Pythonista3/Documents/site-packages/stash/lib/github/MainClass.py", line 34, in <module>
    import jwt
ImportError: No module named jwt
JonB

Hmm, okay, pygithub now depends on pyjwt. It used to be dependency free, so could just install it directly.

pip install pyjwt

should fix the issue, though i will have to update gh to maybe use pip to install pygithub (or install a specific version).

mikael

@JonB, thanks, installing pyjwt - not jwt - fixed the issue.

JonB

Does gh actually work for you? I note that jwt requires cryptography for certain algorithms, you can be forced to use pycrypto/ecsda instead. Just curious if anything we are using requires that.

mikael

@JonB, yes, it worked, to the extent that new key was added to the github account. Further testing later.

shtek

just tried git push.
first generate rsa key using ssh-keygen

,
then add the generated pub key to my site,
then push:

[pythonistascripts]$ git push
Attempting to push to: git@code.mysite.net:shtek/pythonistascripts.git, branch: refs/heads/master
stash: <type 'exceptions.TypeError'>: expected a string or other character buffer object

I don't know what this error means, but after I check the code site, I find that everything has been successfully pushed.

so this is an ignorable error?

zrzka

Yes, it is. Or just update StaSh to dev (selfupdate -f dev) where this is fixed already.

zrzka

Also be aware that ...

  • git status doesn't show untracked files (#265)
  • git push doesn't warn you that you have to sync your repo with remote and simply overwrites history (#268)

... I constantly forget to git add files, when I edit readme on GH and forget to pull before push, my GH changes are lost.

shtek

edit readme on GH and forget to pull before push, my GH changes are lost

tested on my git site, same problem.

never thought this could happen. maybe sometimes this is useful ...... I don't need to delete the repo and rebuild it to change history :)

zrzka

It's a bug. Never ever do this in repos where someone else has access as well.