git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/8] git_remote_helpers: fix input when running under Python 3

From
John Keeping <john@keeping.me.uk>
Date
Jan 14, 2013, 09:47 UTC
Message-ID
<20130114094721.GQ4574@serenity.lan>
In-Reply-To
<50F38E12.6090207@alum.mit.edu>
On Mon, Jan 14, 2013 at 05:48:18AM +0100, Michael Haggerty wrote:
Show 52 quoted lines
> On 01/13/2013 05:17 PM, John Keeping wrote:
>> On Sun, Jan 13, 2013 at 04:26:39AM +0100, Michael Haggerty wrote:
>>> On 01/12/2013 08:23 PM, John Keeping wrote:
>>>> Although 2to3 will fix most issues in Python 2 code to make it run under
>>>> Python 3, it does not handle the new strict separation between byte
>>>> strings and unicode strings.  There is one instance in
>>>> git_remote_helpers where we are caught by this.
>>>>
>>>> Fix it by explicitly decoding the incoming byte string into a unicode
>>>> string.  In this instance, use the locale under which the application is
>>>> running.
>>>>
>>>> Signed-off-by: John Keeping <john@keeping.me.uk>
>>>> ---
>>>>  git_remote_helpers/git/importer.py | 2 +-
>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/git_remote_helpers/git/importer.py b/git_remote_helpers/git/importer.py
>>>> index e28cc8f..6814003 100644
>>>> --- a/git_remote_helpers/git/importer.py
>>>> +++ b/git_remote_helpers/git/importer.py
>>>> @@ -20,7 +20,7 @@ class GitImporter(object):
>>>>          """Returns a dictionary with refs.
>>>>          """
>>>>          args = ["git", "--git-dir=" + gitdir, "for-each-ref", "refs/heads"]
>>>> -        lines = check_output(args).strip().split('\n')
>>>> +        lines = check_output(args).decode().strip().split('\n')
>>>>          refs = {}
>>>>          for line in lines:
>>>>              value, name = line.split(' ')
>>>>
>>>
>>> Won't this change cause an exception if the branch names are not all
>>> valid strings in the current locale's encoding?  I don't see how this
>>> assumption is justified (e.g., see git-check-ref-format(1) for the rules
>>> governing reference names).
>> 
>> Yes it will.  The problem is that for Python 3 we need to decode the
>> byte string into a unicode string, which means we need to know what
>> encoding it is.
>> 
>> I don't think we can just say "git-for-each-ref will print refs in
>> UTF-8" since AFAIK git doesn't care what encoding the refs are in - I
>> suspect that's determined by the filesystem which in the end probably
>> maps to whatever bytes the shell fed git when the ref was created.
>> 
>> That's why I chose the current locale in this case.  I'm hoping someone
>> here will correct me if we can do better, but I don't see any way of
>> avoiding choosing some encoding here if we want to support Python 3
>> (which I think we will, even if we don't right now).
> 
> I'm not just trying to be a nuisance here;

You're not being - I think this is a difficult issue and I don't know myself what the right answer is.

Show 16 quoted lines
>                                            I'm struggling myself to
> understand how a program that cares about strings-vs-bytes (e.g., a
> Python3 script) should coexist with a program that doesn't (e.g., git
> [1]).  I think this will become a big issue if my Python version of the
> commit email script ever gets integrated and then made compatible with
> Python3.
> 
> You claim "for Python 3 we need to decode the byte string into a unicode
> string".  I understand that Python 3 strings are Unicode, but why/when
> is it necessary to decode data into a Unicode string as opposed to
> leaving it as a byte sequence?
> 
> In this particular case (from a cursory look over the code) it seems to
> me that (1) decoding to Unicode will sometimes fail for data that git
> considers valid and (2) there is no obvious reason that the data cannot
> be processed as byte sequences.

I've been thinking about this overnight and I think you're right that treating them as byte strings in Python is most correct. Having said that, when I'm programming in Python I would find it quite surprising that I had to treat ref strings specially - and as soon as I want to use one in a string context (e.g. printing it as part of a message to the user) I'm back to the same problem.

So I think we should try to solve the problem once rather than forcing everyone who wants to use the library to solve it individually. I just wish it was obvious what we should do!

John
Previous: Michael HaggertyNext: John Keeping
Message 7 of 53 in “Initial support for Python 3”
  1. 0/8 Initial support for Python 3John Keeping, Jan 12, 2013
  2. 1/8 git_remote_helpers: Allow building with Python 3John Keeping, Jan 12, 2013
  3. 2/8 git_remote_helpers: fix input when running under Python 3John Keeping, Jan 12, 2013
  4. Michael HaggertyJan 13, 2013
  5. John KeepingJan 13, 2013
  6. Michael HaggertyJan 14, 2013
  7. John KeepingJan 14, 2013
  8. 2/8 git_remote_helpers: fix input when running under Python 3John Keeping, Jan 15, 2013
  9. Junio C HamanoJan 15, 2013
  10. John KeepingJan 15, 2013
  11. Junio C HamanoJan 15, 2013
  12. 2/8 git_remote_helpers: fix input when running under Python 3John Keeping, Jan 15, 2013
  13. Pete WyckoffJan 16, 2013
  14. John KeepingJan 16, 2013
  15. Pete WyckoffJan 17, 2013
  16. 3/8 git_remote_helpers: Force rebuild if python version changesJohn Keeping, Jan 12, 2013
  17. Pete WyckoffJan 12, 2013
  18. John KeepingJan 13, 2013
  19. Pete WyckoffJan 13, 2013
  20. John KeepingJan 13, 2013
  21. John KeepingJan 15, 2013
  22. Pete WyckoffJan 17, 2013
  23. 4/8 git_remote_helpers: Use 2to3 if building with Python 3John Keeping, Jan 12, 2013
  24. 5/8 svn-fe: allow svnrdump_sim.py to run with Python 3John Keeping, Jan 12, 2013
  25. 6/8 git-remote-testpy: hash bytes explicitlyJohn Keeping, Jan 12, 2013
  26. 7/8 git-remote-testpy: don't do unbuffered text I/OJohn Keeping, Jan 12, 2013
  27. 8/8 git-remote-testpy: call print as a functionJohn Keeping, Jan 12, 2013
  28. Pete WyckoffJan 12, 2013
  29. John KeepingJan 13, 2013
  30. John KeepingJan 13, 2013
  31. Pete WyckoffJan 13, 2013
  32. John KeepingJan 13, 2013
  33. 0/8 Initial Python 3 supportJohn Keeping, Jan 17, 2013
  34. 1/8 git_remote_helpers: allow building with Python 3John Keeping, Jan 17, 2013
  35. 2/8 git_remote_helpers: fix input when running under Python 3John Keeping, Jan 17, 2013
  36. 3/8 git_remote_helpers: force rebuild if python version changesJohn Keeping, Jan 17, 2013
  37. 4/8 git_remote_helpers: use 2to3 if building with Python 3John Keeping, Jan 17, 2013
  38. Sverre RabbelierJan 18, 2013
  39. John KeepingJan 18, 2013
  40. Sverre RabbelierJan 19, 2013
  41. 5/8 svn-fe: allow svnrdump_sim.py to run with Python 3John Keeping, Jan 17, 2013
  42. 6/8 git-remote-testpy: hash bytes explicitlyJohn Keeping, Jan 17, 2013
  43. Junio C HamanoJan 17, 2013
  44. Junio C HamanoJan 17, 2013
  45. John KeepingJan 17, 2013
  46. John KeepingJan 17, 2013
  47. Junio C HamanoJan 17, 2013
  48. John KeepingJan 17, 2013
  49. Junio C HamanoJan 17, 2013
  50. 7/8 git-remote-testpy: don't do unbuffered text I/OJohn Keeping, Jan 17, 2013
  51. Sverre RabbelierJan 18, 2013
  52. 8/8 git-remote-testpy: call print as a functionJohn Keeping, Jan 17, 2013
  53. Sverre RabbelierJan 18, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.