hgext/git/gitutil.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 22 Feb 2023 03:34:48 +0100
changeset 50150 b09a0afcb975
parent 49849 de9ffb82ef4d
child 51863 f4733654f144
permissions -rw-r--r--
keyword: wrap dirstate mutation in `changing_files` context This is the way.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
     1
"""utilities to assist in working with pygit2"""
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
     2
49300
227124098e14 py3: use `x.hex()` instead of `pycompat.sysstr(node.hex(x))`
Manuel Jacob <me@manueljacob.de>
parents: 49290
diff changeset
     3
from mercurial.node import bin, sha1nodeconstants
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
     4
44484
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
     5
pygit2_module = None
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
     6
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
     7
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
     8
def get_pygit2():
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
     9
    global pygit2_module
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
    10
    if pygit2_module is None:
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
    11
        try:
49849
de9ffb82ef4d typing: suppress a bunch of potential import-error cases in extensions
Matt Harbison <matt_harbison@yahoo.com>
parents: 49300
diff changeset
    12
            import pygit2 as pygit2_module  # pytype: disable=import-error
44484
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
    13
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
    14
            pygit2_module.InvalidSpecError
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
    15
        except (ImportError, AttributeError):
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
    16
            pass
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
    17
    return pygit2_module
ec54b3d2af0b git: don't fail import when pygit2 is not install
Martin von Zweigbergk <martinvonz@google.com>
parents: 44477
diff changeset
    18
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    19
45950
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    20
def pygit2_version():
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    21
    mod = get_pygit2()
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    22
    v = "N/A"
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    23
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    24
    if mod:
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    25
        try:
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    26
            v = mod.__version__
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    27
        except AttributeError:
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    28
            pass
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    29
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    30
    return b"(pygit2 %s)" % v.encode("utf-8")
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    31
c7c1efdfd4de git: show the version of `pygit2` with verbose version output
Matt Harbison <matt_harbison@yahoo.com>
parents: 44484
diff changeset
    32
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    33
def togitnode(n):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    34
    """Wrapper to convert a Mercurial binary node to a unicode hexlified node.
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    35
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    36
    pygit2 and sqlite both need nodes as strings, not bytes.
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    37
    """
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    38
    assert len(n) == 20
49300
227124098e14 py3: use `x.hex()` instead of `pycompat.sysstr(node.hex(x))`
Manuel Jacob <me@manueljacob.de>
parents: 49290
diff changeset
    39
    return n.hex()
44477
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    40
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    41
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    42
def fromgitnode(n):
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    43
    """Opposite of togitnode."""
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    44
    assert len(n) == 40
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    45
    return bin(n)
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    46
ad718271a9eb git: skeleton of a new extension to _directly_ operate on git repos
Augie Fackler <augie@google.com>
parents:
diff changeset
    47
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 45950
diff changeset
    48
nullgit = togitnode(sha1nodeconstants.nullid)