我想得到的善变的修订数量/id(这是一个哈不是一个数字)编程方式在蟒蛇。

其原因是,我想将它添加到css/js文件在我们的网站像这样:

<link rel="stylesheet" href="example.css?{% mercurial_revision "example.css" %}" />

因此,每当一个变化是制的样式表中,它会得到一个新的网址和不再使用的旧缓存的版本。

如果你知道在哪里可以找到很好的文件善变 蟒蛇模块, 那也将是有益的。我似乎找不到任何地方。

我的解决方案

我最终使用子进程只是执行命令,获取的汞的节点。我选择了这个方案,因为api不能保证留相同,但bash接口可能将:

import subprocess

def get_hg_rev(file_path):
    pipe = subprocess.Popen(
        ["hg", "log", "-l", "1", "--template", "{node}", file_path],
        stdout=subprocess.PIPE
        )
    return pipe.stdout.read()

例使用:

> path_to_file = "/home/jim/workspace/lgr/pinax/projects/lgr/site_media/base.css"
> get_hg_rev(path_to_file)
'0ed525cf38a7b7f4f1321763d964a39327db97c4'
有帮助吗?

解决方案

这是真的没有官方的API,但你可以通过阅读其他的扩展,特别是那些与汞捆绑得到一个想法的最佳做法。对于这个特定的问题,我会做这样的事情:

from mercurial import ui, hg
from mercurial.node import hex

repo = hg.repository('/path/to/repo/root', ui.ui())
fctx = repo.filectx('/path/to/file', 'tip')
hexnode = hex(fctx.node())

更新在某些时候参数顺序改变,现在是这样的:

   repo = hg.repository(ui.ui(), '/path/to/repo/root' )

其他提示

你的意思是这个文档?点击 需要注意的是,在该页面声明,没有的官方的API,因为他们仍然保留在任何时候改变它的权利。但是你可以看到,在过去几个版本列表中的改变,这是不是很广泛。

这是更新的,更清洁的子版本,我在我的Django的设置来使用文件的粗端至端部署检查(我转储到HTML注释)(使用.check_output(),在Python 2.7 / 3.1添加):

import subprocess

HG_REV = subprocess.check_output(['hg', 'id', '--id']).strip()

您可以在一个try包裹,如果你不希望一些奇怪的打嗝,以防止启动:

try:
    HG_REV = subprocess.check_output(['hg', 'id', '--id']).strip()
except OSError:
    HG_REV = "? (Couldn't find hg)"
except subprocess.CalledProcessError as e:
    HG_REV = "? (Error {})".format(e.returncode)
except Exception:  # don't use bare 'except', mis-catches Ctrl-C and more
    # should never have to deal with a hangup 
    HG_REV = "???"

给一个尝试关键字扩展程序

如果您使用的是蟒蛇2,你想要使用 hglib.

我不知道使用什么如果你使用Python3,对不起。大概 hgapi.

内容这个答案

  • 善变的Api
  • 如何使用hglib
  • 为什么hglib是最好的选择蟒蛇2的用户
  • 如果你正在写一个钩,劝阻内部接口是非常方便

善变的Api

善变的有两个官方Api。

  1. 善变的命令服务器。你可以跟它从蟒蛇2使用 hglib (维基, PyPI)软件包,这是维持通过的反复无常的团队。
  2. 善变的命令行接口。你可以跟它通过 subprocess, 或 hgapi, 或somesuch.

如何使用hglib

安装:

pip install python-hglib

使用:

import hglib
client = hglib.open("/path/to/repo")

commit = client.log("tip")
print commit.author

更多的使用情况的信息 hglib wiki网页.

为什么hglib是最好的选择蟒蛇2的用户

因为它是维持通过的反复无常的团队,这是什么善变的团队建议对与善变的.

从善变的维基, ,发表声明如下与刺客:

对于绝大多数的第三方代码,最好的办法是使用水银的发布、记录和稳定的API:命令行接口。交替,使用 CommandServer 或图书馆都是根据它得到一个快速、稳定、语言中性的界面。

从命令的服务器网页:

[命令允许服务器]第三方应用和图书馆与水银在一个管道,以消除每命令启动的开销。图书馆然后可以封指令生成和解析提出一个语言相适应的API这些命令。

蟒蛇口善变的命令-服务器,正如所说,是 hglib.

每命令开销的命令线路接口不是开玩笑的方式。我一旦建立了一个非常小的测试套件(只有大约5次测试),使用 hg 通过 subprocess 创建,致力通过提交,少数repos有例如合并的情况。在整个项目,运行时的套房呆了5到30秒钟,几乎所有时间花在 hg 呼叫。

如果你正在写一个钩,劝阻内部接口是非常方便

签名的蟒蛇的钩子函数是像这样:

# 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)

uirepo 是的一部分,上述的非官方泄气 内部API.事实上,他们有权利在功能args使得它们非常方便地使用,例如在这个例子中的一个 preupdate 钩,不允许合并之间的某些分支机构。

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.

如果你挂钩的代码不是那么重要,你不公布的,你可能会选择使用劝阻非官方的内部API。如果你挂钩的一部分扩展,你出版,更好的使用 hglib.

FWIW,避免提取在每一页/认为价值回报,我只是有我的部署放入settings.py文件。然后我可以引用settings.REVISION而无需访问水银和/或另一过程的所有开销。你是否有这样的价值变动W / O重装你的服务器?

我想做的OP想做的事,从脚本得到hg id -i(得到整个版本库的最新修订,而不是在回购单个文件),同样的事情,但我不希望使用POPEN,和从brendan代码让我开始,但不是我想要的。

所以我写了这个...评论/批评欢迎。这得到尖端转十六进制为一个字符串。

from mercurial import ui, hg, revlog
# from mercurial.node import hex  # should I have used this?

def getrepohex(reporoot):
    repo = hg.repository(ui.ui(), reporoot)
    revs = repo.revs('tip')
    if len(revs)==1:
      return str(repo.changectx(revs[0]))
    else:
      raise Exception("Internal failure in getrepohex")
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top