KeypairFromAgent throws fetch into an infinite loop
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 1.7k
- Forks
- 408
- Ø Merge
- 2 T. 57 Min.
- Gemergte PRs (30 T.)
- 7
Beschreibung
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
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit den im Traceback gezeigten Pfaden in remote.py, insbesondere mit RemoteCallbacks._credentials_cb und get_credentials. Reproduziere den Fetch mit einem ssh-agent, der keinen Schlüssel enthält, und verfolge anschließend den Callback sowie die Behandlung des Credential-Fehlers. Erledigt ist es, wenn die fehlgeschlagene Credential-Suche keine weiteren Wiederholungen auslöst und der erwartete GitError den Aufrufer erreicht.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- git, python
- Bereich
- tooling
- Issue-Typ
- Bug
- Schwierigkeit
- 3/5
- Geschätzter Aufwand
- 1-2 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100