KeypairFromAgent throws fetch into an infinite loop
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 1.7k
- Forks
- 408
- Merge moyen
- 2 j 57 min
- PR mergées (30 j)
- 7
Description
I'm not sure I'm using it right, but the following code throws git_remote_fetch into some sort of infinite loop in case the agent can't find an appropriate key.
import pygit2
class MyCallbacks(pygit2.RemoteCallbacks):
def credentials(self, url, username_from_url, allowed_types):
# print('Credentials callback called')
return pygit2.KeypairFromAgent(username_from_url)
repo = pygit2.Repository('foo')
repo.remotes['origin'].fetch(callbacks=MyCallbacks())
print("OK")
Here's an example:
$ git clone git@<some-ssh-repository> foo
Cloning into 'foo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ python3 test.py # Using my regular ssh agent which has the correct key
OK
$ eval $(ssh-agent) # Create a new ssh-agent with no key and update env variables
$ python3 test.py # Never returns...
If I uncomment the print statement in the python snippet above, I can see that my callback is called over and over.
There's one more thing that is odd but might help: when I interrupt the script with ctrl-c, I don't always get the same traceback. In the second case bellow it seems that the "correct" exception (_pygit2.GitError: callback failed to initialize SSH credentials) is raised at some point but just doesn't reach my code:
❯❯❯ python3 test.py
# ^C
Traceback (most recent call last):
File "test.py", line 11, in <module>
repo.remotes['origin'].fetch(callbacks=MyCallbacks())
File "/home/gregoire/.local/lib/python3.7/site-packages/pygit2/remote.py", line 406, in fetch
err = C.git_remote_fetch(self._remote, arr, fetch_opts, to_bytes(message))
KeyboardInterrupt
❯❯❯ python3 test.py
# ^C
From cffi callback <function RemoteCallbacks._credentials_cb at 0x7f5e027700d0>:
Traceback (most recent call last):
File "/home/gregoire/.local/lib/python3.7/site-packages/pygit2/remote.py", line 304, in _credentials_cb
ccred = get_credentials(credentials, url, username, allowed)
File "/home/gregoire/.local/lib/python3.7/site-packages/pygit2/remote.py", line 515, in get_credentials
if pubkey is None and privkey is None:
KeyboardInterrupt
Traceback (most recent call last):
File "test.py", line 11, in <module>
repo.remotes['origin'].fetch(callbacks=MyCallbacks())
File "/home/gregoire/.local/lib/python3.7/site-packages/pygit2/remote.py", line 409, in fetch
check_error(err)
File "/home/gregoire/.local/lib/python3.7/site-packages/pygit2/errors.py", line 64, in check_error
raise GitError(message)
_pygit2.GitError: callback failed to initialize SSH credentials
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par les chemins de remote.py indiqués dans la trace d’erreur, en particulier RemoteCallbacks._credentials_cb et get_credentials. Reproduisez le fetch avec un ssh-agent ne contenant aucune clé, puis suivez le callback et la gestion de l’erreur d’identifiants. Le travail est terminé lorsque la recherche d’identifiants échouée cesse d’être réessayée et que le GitError attendu parvient à l’appelant.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- git, python
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100