Skip to content

repo.remote().fetch("--dry-run") can produce assertion failure #442

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
josefsachsconning opened this issue May 25, 2016 · 12 comments
Closed
Assignees

Comments

@josefsachsconning
Copy link

>>> import git
>>> repo = git.Repo("C:/Users/s2sajs/Documents/GitHub/Reactive.jl")
>>> fr = repo.remote().fetch("--dry-run")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\git\remote.py", line 657, in fetch
    res = self._get_fetch_info_from_stderr(proc, progress or RemoteProgress())
  File "C:\Python27\lib\site-packages\git\remote.py", line 576, in _get_fetch_info_from_stderr
    assert l_fil >= l_fhi, "len(%s) <= len(%s)" % (l_fil, l_fhi)
AssertionError: len(5) <= len(6)
@Byron
Copy link
Member

Byron commented May 25, 2016

Which version of GitPython are you using ?
What is the remote that you are trying to pull ?

In case you are not using the latest version from pypi, please try again with that one.
Thanks

@josefsachsconning
Copy link
Author

I'm using GitPython-2.0.3. That's the latest, right?

C:\Users\s2sajs\Documents\GitHub\Reactive.jl>git config --get remote.origin.url
https://github.com/JuliaLang/Reactive.jl.git

C:\Users\s2sajs\Documents\GitHub\Reactive.jl>git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean

C:\Users\s2sajs\Documents\GitHub\Reactive.jl>git fetch --dry-run
From https://github.com/JuliaLang/Reactive.jl
   4d4417f..0c032a3  master     -> origin/master

@Byron
Copy link
Member

Byron commented May 25, 2016

I was unable to reproduce it. Here is what I tried:

import git
r = git.Repo.clone_from('https://github.com/JuliaLang/Reactive.jl', 'here')
r.remote().fetch()
r.remote().fetch('--dry-run')

Does this work for you ? Maybe there is more to it, like the git version installed on the system.

$ git --version
git version 2.7.4 (Apple Git-66)

@josefsachsconning
Copy link
Author

C:\Users\s2sajs\Documents\GitHub\Reactive.jl>git --version
git version 1.9.5.msysgit.0

The behavior is dependent on the condition of the working copy. If I try the fetch in a freshly cloned working copy, it works just fine.

@Byron
Copy link
Member

Byron commented May 25, 2016

This is what I get when running the command git-python runs from the terminal:

$ git fetch -v origin
From https://github.com/JuliaLang/Reactive.jl
 = [up to date]      master     -> origin/master
 = [up to date]      cjh/cleanup -> origin/cjh/cleanup
 = [up to date]      gh-pages   -> origin/gh-pages
 = [up to date]      next       -> origin/next
 = [up to date]      teh/imageview_warmups -> origin/teh/imageview_warmups

Could you run that on your end ?

@josefsachsconning
Copy link
Author

C:\Users\s2sajs\Documents\GitHub\Reactive.jl>git fetch -v origin
From https://github.com/JuliaLang/Reactive.jl
   4d4417f..0c032a3  master     -> origin/master
 = [up to date]      cjh/cleanup -> origin/cjh/cleanup
 = [up to date]      gh-pages   -> origin/gh-pages
 = [up to date]      next       -> origin/next
 = [up to date]      teh/imageview_warmups -> origin/teh/imageview_warmups

@Byron
Copy link
Member

Byron commented May 25, 2016

I still can't reproduce it - even when manipulating my local repository to update the remote master:

➜  here git:(master) git fetch -v origin --dry-run
From https://github.com/JuliaLang/Reactive.jl
   7a3e5e9..0c032a3  master     -> origin/master
 = [up to date]      cjh/cleanup -> origin/cjh/cleanup
 = [up to date]      gh-pages   -> origin/gh-pages
 = [up to date]      next       -> origin/next
 = [up to date]      teh/imageview_warmups -> origin/teh/imageview_warmups

Maybe it's related to the git version somehow, or to windows. In any case, what you could do is to have a look at the line that throws the assertion, and add some debug-printing yourself. That way you can find out which line it fails to handle correctly. I am not sure what else I can do here, unfortunately.

Personally I'd think it does not matter whether or not you use --dry-run either, as the output should be exactly the same.

@josefsachsconning
Copy link
Author

Thanks for trying. In case it helps anyone, fetch_info_lines is

[u'   4d4417f..0c032a3  master     -> origin/master\n',
 u' = [up to date]      cjh/cleanup -> origin/cjh/cleanup\n',
 u' = [up to date]      gh-pages   -> origin/gh-pages\n',
 u' = [up to date]      next       -> origin/next\n',
 u' = [up to date]      teh/imageview_warmups -> origin/teh/imageview_warmups\n']

and fetch_head_info is

[u"4d4417fd437dd5e11c5c00c0c38e2920f42d1ab5\t\tbranch 'master' of https://github.com/JuliaLang/Reactive.jl\n",
 u"dd4b19f52781ab9b6369b850e5c497b0709daefe\tnot-for-merge\tbranch 'cjh/cleanup' of https://github.com/JuliaLang/Reactive.jl\n",
 u"7fbea37f4fcc20eaf34402de89d7a247be9368cb\tnot-for-merge\tbranch 'gh-pages' of https://github.com/JuliaLang/Reactive.jl\n",
 u"9c5d5d1dc7d30e8eed6deedc9f44493573e5c968\tnot-for-merge\tbranch 'next' of https://github.com/JuliaLang/Reactive.jl\n",
 u"6241b420ac9ae36f7bac4142b9f241970eea2539\tnot-for-merge\tbranch 'teh/imageview_warmups' of https://github.com/JuliaLang/Reactive.jl\n",
 u"d7a2bd36ead56cf1e0bdad6b04af9e6a1803860b\tnot-for-merge\tbranch 'teh/throttle_typ' of https://github.com/JuliaLang/Reactive.jl\n"]

That demonstrates that l_fil < l_fhi.
The problem, apparently, is that teh/throttle_typ is in fetch_head_info but not in fetch_info_lines.

@Byron
Copy link
Member

Byron commented May 25, 2016

Indeed ! This assertion was the cause for many issues in the past, and so far there was no good fix for it. This is the comment at the respective line: # NOTE: We assume to fetch at least enough progress lines to allow matching each fetch head line with it.

The problem is that I never understood why git would sometimes do that, or what the correct behaviour is. Should GitPython provide only partial information, or should it simply ignore the partial data ?

Currently it matches the lines one on one, maybe it's safe to just ignore extra lines in the fetch head info ... and get rid of this issue once and for all.

@josefsachsconning
Copy link
Author

Yes, my inclination would be to ignore extra lines in the fetch head info.

@Byron Byron self-assigned this May 25, 2016
@Byron Byron added this to the v2.0.4 - Bugfixes milestone May 25, 2016
@Byron Byron closed this as completed in b0be02e May 25, 2016
@josefsachsconning
Copy link
Author

Did you get that backwards? Don't you want to ignore extra lines in fetch_head_info, not extra lines in fetch_info_lines?

@Byron
Copy link
Member

Byron commented May 25, 2016

Thanks for the review ! I totally did - fix is on the way.

Byron added a commit that referenced this issue May 25, 2016
Previously, the logic was not correct. Now it should work either way,
truncating the correct list to assure both always have the same length.

Related to #442
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

No branches or pull requests

2 participants