def get_log()

in crashclouseau/hgdata.py [0:0]


def get_log(hgpath, out_path="", last_rev=0, rev="tip", merge=True, files=False):
    """Get pushlog from a local mercurial repo"""
    import hglib

    client = hglib.open(hgpath)
    client.pull(update=True)

    revrange = "{}:{}".format(rev, last_rev)
    entries = [
        "node",
        "author",
        "pushdate|isodate",
        "date|isodate",
        "desc",
        "p1node",
        "p2node",
        "pushid",
    ]
    if files:
        entries += ["file_adds", "file_mods", "file_dels"]

    entries = map(lambda x: "{" + x + "}", entries)
    if sys.version_info >= (3, 0):
        entries = map(lambda x: bytes(x, "utf-8"), entries)
    else:
        entries = map(lambda x: bytes(x), entries)

    entries = list(entries)
    template = b"\\0".join(entries) + b"\\0"
    N = len(entries)
    args = hglib.util.cmdbuilder(
        b"log", r=revrange, template=template, cwd=hgpath, M=merge
    )
    out = client.rawcommand(args)
    client.close()
    out = out.decode("utf-8")
    out = out.split("\0")
    nullid = "0" * 40
    res = []

    if files:
        files = {}
        for i in range(0, len(out) - 1, N):
            (
                node,
                author,
                pushdate,
                date,
                desc,
                p1node,
                p2node,
                pushid,
                adds,
                mods,
                dels,
            ) = out[i:(i + N)]
            parents = [p1node, p2node]
            parents = list(filter(lambda p: p != nullid, parents))
            res.append(
                {
                    "rev": node,
                    "author": author,
                    "pushdate": pushdate,
                    "date": date,
                    "desc": desc,
                    "parents": parents,
                    "pushid": pushid,
                    "added": get_files(adds, files),
                    "modified": get_files(mods, files),
                    "deleted": get_files(dels, files),
                }
            )
        res = {"files": files, "log": res}
    else:
        for i in range(0, len(out) - 1, N):
            node, author, pushdate, date, desc, p1node, p2node, pushid = out[
                i:(i + N)
            ]
            parents = [p1node, p2node]
            parents = list(filter(lambda p: p != nullid, parents))
            res.append(
                {
                    "rev": node,
                    "author": author,
                    "pushdate": pushdate,
                    "date": date,
                    "desc": desc,
                    "parents": parents,
                    "pushid": pushid,
                }
            )

    if out_path:
        with open(out_path, "w") as Out:
            json.dump(res, Out)

    return res