如何使用Buildbot中的'getChoices'成员函数动态生成选项?

时间:2015-06-02 14:20:30

标签: python buildbot

我已经有一个方法返回特定仓库的分支列表,我想用它根据Buildbot的Web UI中返回的列表动态生成选择。

例如,而不是这个静态列表:

c['schedulers'].append(
    schedulers.ForceScheduler(
        ...,
        branch=util.ChoiceStringParameter(
            ...,
            choices=['master', 'branch1', 'branch2', ...],
            ...

我想要动态生成的东西,比如这个:

def get_branches():
    refs = subprocess.check_output(["git", "ls-remote", "--heads", "git@bitbucket.org:foo/bar.git"])
    branches = []
    for item in refs.split('\n'):
        m = re.match(r"^\w+\trefs/heads/(.*$)", item)
        if m:
            branch = m.group(1)
            branches.append(branch)

    return branches

c['schedulers'].append(
    schedulers.ForceScheduler(
        ...,
        branch=util.ChoiceStringParameter(
            ...,
            choices=get_branches,
            ...

Buildbot文档解释了它可以通过子类化和覆盖'getChoices'成员函数来完成。它还提供了由InheritBuildParameter类的源提供的an example,但我不明白如何使用'getChoices'成员函数。

关于这个主题的文档很少,我不得不问你这个问题!提前谢谢: - )

1 个答案:

答案 0 :(得分:0)

使用作为生成器的类是使动态选择的一种方法:

class Branches(object):
    def __init__(self):
        self.branches = []
        refs = subprocess.check_output(["git", "ls-remote", "--heads", "git@bitbucket.org:foo/bar.git"])
        for item in refs.split('\n'):
            m = re.match(r"^\w+\trefs/heads/(.*)$", item)
            if m:
                branch = m.group(1)
                self.branches.append(branch)
    def __iter__(self):
        self.__init__()
        for b in self.branches:
            yield b

c['schedulers'].append( ForceScheduler(
        ...
        branch=ChoiceStringParameter(name="branch",
                                 choices=Branches(),
                                 default="develop"),
       ...