Index.__getitem__ breaks with bytes on Python 3
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
Index.__getitem__ fails on Python when you pass it bytes.
>>> import pygit2
>>> index = pygit2.Index()
>>> index['foo']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/site-packages/pygit2/index.py", line 94, in __getitem__
raise KeyError(key)
KeyError: 'foo'
>>> index[b'foo']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.7/site-packages/pygit2/index.py", line 88, in __getitem__
elif not key >= 0:
TypeError: '>=' not supported between instances of 'bytes' and 'int'
This is because it calls is_string, which on Python 2 checks if it's basestring and on Python 3 checks if it's str. So both text and bytes work on Python 2, but on Python 3, bytes will fall through to elif not key >= 0:, which fails because you can't compare bytes and int like that. Here's an excerpt of the relevant code.
...
if is_string(key):
centry = C.git_index_get_bypath(self._index, to_bytes(key), 0)
elif not key >= 0:
raise ValueError(key)
...
The way I would expect this to work is that if you pass it bytes, it would match directly against the raw bytes of the path in the index. After all, the data in the index file is binary. So passing in bytes should be more explicit than passing in text so it should be allowed.
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 dans pygit2/index.py, au niveau de Index.getitem, et reproduisez l’exemple de bytes de l’issue. Suivez la manière dont les clés bytes sont classées, puis ajoutez une couverture de régression ciblée pour la recherche avec bytes ; le travail est terminé lorsque les chemins bytes sont comparés à l’index sans atteindre la comparaison d’entiers et que les chemins inexistants conservent le comportement d’erreur attendu.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- devtools
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 45/100