Mercurial scripting with python

后端 未结 7 1050
-上瘾入骨i
-上瘾入骨i 2020-12-13 04:23

I am trying to get the mercurial revision number/id (it\'s a hash not a number) programmatically in python.

The reason is that I want to add it to the css/js files on

7条回答
  •  天涯浪人
    2020-12-13 05:12

    If you are using Python 2, you want to use hglib.

    I don't know what to use if you're using Python 3, sorry. Probably hgapi.

    Contents of this answer

    • Mercurial's APIs
    • How to use hglib
    • Why hglib is the best choice for Python 2 users
    • If you're writing a hook, that discouraged internal interface is awfully convenient

    Mercurial's APIs

    Mercurial has two official APIs.

    1. The Mercurial command server. You can talk to it from Python 2 using the hglib (wiki, PyPI) package, which is maintained by the Mercurial team.
    2. Mercurial's command-line interface. You can talk to it via subprocess, or hgapi, or somesuch.

    How to use hglib

    Installation:

    pip install python-hglib
    

    Usage:

    import hglib
    client = hglib.open("/path/to/repo")
    
    commit = client.log("tip")
    print commit.author
    

    More usage information on the hglib wiki page.

    Why hglib is the best choice for Python 2 users

    Because it is maintained by the Mercurial team, and it is what the Mercurial team recommend for interfacing with Mercurial.

    From Mercurial's wiki, the following statement on interfacing with Mercurial:

    For the vast majority of third party code, the best approach is to use Mercurial's published, documented, and stable API: the command line interface. Alternately, use the CommandServer or the libraries which are based on it to get a fast, stable, language-neutral interface.

    From the command server page:

    [The command server allows] third-party applications and libraries to communicate with Mercurial over a pipe that eliminates the per-command start-up overhead. Libraries can then encapsulate the command generation and parsing to present a language-appropriate API to these commands.

    The Python interface to the Mercurial command-server, as said, is hglib.

    The per-command overhead of the command line interface is no joke, by the way. I once built a very small test suite (only about 5 tests) that used hg via subprocess to create, commit by commit, a handful of repos with e.g. merge situations. Throughout the project, the runtime of suite stayed between 5 to 30 seconds, with nearly all time spent in the hg calls.

    If you're writing a hook, that discouraged internal interface is awfully convenient

    The signature of a Python hook function is like so:

    # In the hgrc:
    # [hooks]
    # preupdate.my_hook = python:/path/to/file.py:my_hook
    
    def my_hook(
        ui, repo, hooktype, 
        ... hook-specific args, find them in `hg help config` ..., 
        **kwargs)
    

    ui and repo are part of the aforementioned discouraged unofficial internal API. The fact that they are right there in your function args makes them terribly convenient to use, such as in this example of a preupdate hook that disallows merges between certain branches.

    def check_if_merge_is_allowed(ui, repo, hooktype, parent1, parent2, **kwargs):
        from_ = repo[parent2].branch()
        to_ = repo[parent1].branch()
        ...
        # return True if the hook fails and the merge should not proceed.
    

    If your hook code is not so important, and you're not publishing it, you might choose to use the discouraged unofficial internal API. If your hook is part of an extension that you're publishing, better use hglib.

提交回复
热议问题