Den tors 7 dec. 2023 kl 09:51 skrev Ruediger Pluem <[email protected]>:
> I stumbled accross a Python 3 compatibility issue in
> tools/hook-scripts/mailer/mailer.py.
>
> The call of self.cfg.which_groups in line 565 passes an empty string as
> first parameter.
> In which_groups this empty string is passed to to_str in line 1489.
> In line 88 to_str does x.decode('utf-8')
> In Python 2 str objects have a decode method at least in later Python 3
> versions they have not. Hence I propose the following patch which fixes the
> issue for me:
>
> Index: mailer.py
> ===================================================================
> --- mailer.py (revision 1914422)
> +++ mailer.py (working copy)
> @@ -562,7 +562,7 @@
>
> # collect the set of groups and the unique sets of params for the
> options
> self.groups = { }
> - for (group, params) in self.cfg.which_groups('', None):
> + for (group, params) in self.cfg.which_groups(b'', None):
> # turn the params into a hashable object and stash it away
> param_list = sorted(params.items())
> self.groups[group, tuple(param_list)] = params
>
>
> If I would get a go ahead here on list I would commit.
>
> Regards
>
> RĂ¼diger
>
There was some work done on mailer.py by Greg Stein, started here:
https://lists.apache.org/thread/v5bh1j8qz8kk0jv1tlctxqt1k454tz0h
However I don't think that touched these parts of the code.
I think there is more to this than that simple fix, but I'm no expert in
Python or in the Python bindings. There are two more calls to
which_groups():
Line 491, called with the return from
svn.repos.ChangeCollector(...).get_changes().items() (first argument in a
tuple). I don't know which encoding this uses.
Line 663, called with the return from sys.stdin.buffer.readlines(), already
processed by to_str() once.
In particular the call on 663 should be double decoded unless I'm missing
something.
So depending on what get_changes() return, maybe we should remove the
to_str() from which_groups() instead?
Note that we are still somewhat supporting Python 2 so we need to make sure
any changes does work on Python 2 as well.
Kind regards,
Daniel