[PATCH] client: handle commit messages with \0 characters

Augie Fackler raf at durin42.com
Thu Mar 9 17:42:12 UTC 2023


This seems fine - note that we probably need to check individual commands to make sure they responded to -Tjson at least as far back as 3.7 (that’s how far back the hglib test suite looks right now, perhaps due to Python 3 obsoleting anything older?)

Queued for hglib

> On Mar 8, 2023, at 10:24, Mathias De Mare <mathias.de_mare at nokia.com> wrote:
> 
> # HG changeset patch
> # User Mathias De Mare <mathias.de_mare at nokia.com>
> # Date 1678288941 -3600
> #      Wed Mar 08 16:22:21 2023 +0100
> # Node ID b5616919f129d028699764153cab594038f884fa
> # Parent  e3e9e403927565cb9440576065274688e26ab78f
> client: handle commit messages with \0 characters
> 
> Mercurial allows commit messages containing \0 characters,
> but hglib does not properly handle them.
> 
> By using the json template, these characters are correctly escaped.
> 
> Note: initial change only modifies this for the 'log' command,
> I'll follow-up for other commands if this is ok.
> 
> diff --git a/hglib/client.py b/hglib/client.py
> --- a/hglib/client.py
> +++ b/hglib/client.py
> @@ -1,4 +1,4 @@
> -import struct, re, datetime
> +import struct, re, datetime, json
> import hglib
> from hglib import error, util, templates, merge, context
> 
> @@ -172,6 +172,19 @@ class hgclient(object):
>                                  rev[4], rev[5], dt))
>         return revs
> 
> +    @staticmethod
> +    def _parsejsonrevs(jsonrevs):
> +        revs = []
> +        for rev in jsonrevs:
> +            # truncate the timezone and convert to a local datetime
> +            posixtime = float(rev["date"][0])
> +            dt = datetime.datetime.fromtimestamp(posixtime)
> +            revs.append(revision(str(rev["rev"]).encode(), rev["node"].encode(),
> +                                 ' '.join(rev["tags"]).encode(),
> +                                 rev["branch"].encode(), rev["user"].encode(),
> +                                 rev["desc"].encode(), dt))
> +        return revs
> +
>     def runcommand(self, args, inchannels, outchannels):
>         def writeblock(data):
>             if self._protocoltracefn is not None:
> @@ -1094,7 +1107,7 @@ class hgclient(object):
>         """
>         if hidden is None:
>             hidden = self.hidden
> -        args = cmdbuilder(b('log'), template=templates.changeset,
> +        args = cmdbuilder(b('log'), template="json",
>                           r=revrange, f=follow, follow_first=followfirst,
>                           d=date, C=copies, k=keyword, removed=removed,
>                           m=onlymerges, u=user, b=branch, P=prune,
> @@ -1102,9 +1115,9 @@ class hgclient(object):
>                           hidden=hidden, *files)
> 
>         out = self.rawcommand(args)
> -        out = out.split(b('\0'))[:-1]
> +        json_out = json.loads(out)
> 
> -        return self._parserevs(out)
> +        return self._parsejsonrevs(json_out)
> 
>     def manifest(self, rev=None, all=False):
>         """Yields (nodeid, permission, executable, symlink, file path) tuples
> 
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at lists.mercurial-scm.org
> https://lists.mercurial-scm.org/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list