1

我正在尝试使用 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', 'myself', '--debug')

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

rev, node =client.commit('简单提交消息', addremove=True, user='user1')

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

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

只是一个快速更新,感谢@kAlmAcetA 的回复,我按照建议更新了我的代码以包含

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

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

  • 打开一个文件(我没问题)
  • 在文件中添加一些文本(我可以接受)
  • 提交文件
  • 在同一个文件中添加更多文本(我可以接受)
  • 提交文件

我现在正在努力为单个文件执行 commit-->edit-->commit 循环。

问候

4

3 回答 3

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)])
于 2015-06-24T18:17:40.947 回答
0

您必须首先使用客户端的 add 方法将该文件添加到提交。

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

您只需要在第一次添加True文件(如果成功,您将获得其他情况False),下一次修改只需要commit

注意:如果您尝试添加相同的文件,不幸的是您也会得到True同样的结果,那么提交将失败并出现异常:

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

很可能用它来包装提交try...expect

于 2014-11-16T21:55:41.023 回答
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命令可以提交单个更改的文件,所以这很奇怪。再说一次,文档稀缺到不存在的地步,因此尚不清楚这是否是设计使然。

我会为此提交一个错误。

于 2014-11-16T22:13:33.173 回答