使用python-hglib提交单个文件

时间:2014-11-16 21:41:11

标签: python mercurial hglib

我正在尝试使用python-hglib实现一个基本的scm 到目前为止,我已经设法连接到一个repo(本地),我想在许多中提交一个文件。 我不知道该怎么做。请考虑以下事项:

client = hglib.open(my_mercurial_repo)
root_repo=hglib.client.hgclient.root(client)
print "%s root" % root_repo
rev, node =client.commit('Simple commit message', addremove=False, user='user1')

这成功连接到 my_mercurial_repo ,但是当我到达提交行时,我收到此错误:

  

' hglib.error.CommandError'>,CommandError(' commit',' -m',   ' Checkpoint',' -u','我自己',' - 调试')

但是,如果我将其更改为:

  

rev,node = client.commit('简单提交消息',addremove = True,   用户='用户1&#39)

工作正常。查看文档,addremove=True会在提交之前将新/丢失的文件标记为添加/删除。

所以我想我的问题是:如何使用python-hglib在n个文件的存储库中提交单个文件?

快速更新,感谢@ kAlmAcetA的响应,我按照建议更新了我的代码

client.add('/tmp/repo/somefile')
rev, node =client.commit('Simple commit message', addremove=False, user='user1')

当我这样做时,错误消失,执行第一次提交。 如果我在我打开的同一个文件上再次执行代码,我仍然会收到错误。 所以我想要做的就是

  • 打开文件(我很好)
  • 将一些文字添加到文件(我很好)
  • 提交文件
  • 将更多文字添加到同一个文件(我很好)
  • 提交文件

我现在正努力为单个文件做提交 - >编辑 - >提交循环。

此致

3 个答案:

答案 0 :(得分:1)

不支持使用hglib.commit提交单个文件,但您可以使用hglib.rawcommand,它在命令行中使用与hg相同的语法:

repo = hglib.open(path_to_your_repository)
repo.rawcommand(args=['commit', 'filename'])

args中的第一个元素必须是hg命令名。其余元素是您在该命令中使用的任何选项。在我的实际代码中,我有:

repo.rawcommand(['commit','-m '+commit_msg, file_name)])

答案 1 :(得分:0)

您必须先使用client's add method将该文件添加到提交中。

...
client.add('/tmp/repo/somefile')
rev, node =client.commit('Simple commit message', addremove=False, user='user1')
...

您必须首次添加文件(成功时您将获得True,否则False),下次修改只需提交

注意:如果您尝试添加相同的文件,很遗憾,您也会获得True,然后提交将失败,但例外情况为:

hglib.error.CommandError: (1, 'nothing changed', '')

最好用try...expect包装提交。

答案 2 :(得分:0)

如果我理解正确,那么无论工作副本中有多少文件可能已更改,您都希望提交单个文件,就像您在命令行中执行一样:

hg commit ${file}

hglib的commit方法似乎没有提供这个:

def commit(self, message=None, logfile=None, addremove=False, closebranch=False,
           date=None, user=None, include=None, exclude=None):
    """
    Commit changes reported by status into the repository.

    message - the commit message
    logfile - read commit message from file
    addremove - mark new/missing files as added/removed before committing
    closebranch - mark a branch as closed, hiding it from the branch list
    date - record the specified date as commit date
    user - record the specified user as committer
    include - include names matching the given patterns
    exclude - exclude names matching the given patterns
    """

似乎不支持提交单个文件。 hglib应该以某种方式包装Mercurial的命令行,而hg命令可以提交一个更改的文件,所以这很奇怪。然后,文档很少到不存在的程度,因此不清楚这是否是设计与否。

我要为此提出错误。