def gen_bconf(
    branch, targets, signkey,
    gluon_tag=None, site_tag=None,
    broken=False, onlyone=False, priority=None
):
    '''
    Provides all information needed by the builder in placing a ``bconf``-file.

    Since we are already collecting information here, the ``info.json``
    is created as well.

    The same arguments as in :func:`prepare` are used here.

    .. seealso:: :func:`common.prepare_args` for command line syntax
    '''
    photon, settings = pinit('gen_bconf')

    if photon.settings.load(
        'siteconf',
        path.join(
            settings['site']['local']['wi'],
            settings['site']['generator_settings']
        )
    ):
        photon.s2m

        gluon, site = ginit(photon)
        gluon_tag = gluon_tag if gluon_tag else gluon.short_commit[0]
        site_tag = site_tag if site_tag else site.short_commit[0]

        broken = '1' if broken else ''
        version = settings['siteconf']['site']['gluon_release_num']
        priority = (
            priority if priority
            else settings['siteconf']['site']['gluon_priority']
        )
        description = '-%s%s' % (
            branch, '-%s' % (get_timestamp(time=False)) if
            not all(settings['common']['branches']['avail'][branch])
            else ''
        )

        # these fields appear in the info.json
        fields = dict(
            broken_flag=broken,
            call_branch=branch,
            communities=onlyone if onlyone else ' '.join(
                settings['common']['communities'].keys()
            ),
            gluon_tag=gluon_tag,
            site_tag=site_tag,
            priority=priority,
            release='%s%s' % (version, description),
            targets=' '.join(targets),
            version=version
        )
        write_json(
            path.join(
                settings['prepare']['stage_dir'],
                settings['prepare']['info']
            ),
            dict(_info=fields)
        )

        # these fields only appear in the bconf
        fields.update(dict(
            build_branch=settings['common']['branches']['build'],
            build_dir=settings['gluon']['local']['dir'],
            info_file=settings['prepare']['info'],
            library_dir=path.join(
                settings['publish']['library_dir'],
                '%s%s' % (version, description)
            ),
            mkcmd=settings['common']['mkcmd'],
            pycmd=settings['common']['pycmd'],
            signkey=signkey,
            stage_dir=settings['prepare']['stage_dir']
        ))

        bconf = photon.template_handler(
            settings['prepare']['bconf']['tpl'],
            fields=fields
        )
        bconf.write(
            settings['prepare']['bconf']['out'],
            append=False
        )
def prepare(
    branch,
    gluon_tag=None, site_tag=None,
    nomodules=False, onlyone=False, priority=None
):
    '''
    Checks out Gluon sources and site-conf repositories at proper commit-ids
    or tags according to the branch to build.
    Generates a site-conf afterwards.
    Automatically invokes :func:`_gen_bconf` afterwards

    .. seealso:: :func:`common.prepare_args` for command line syntax
    '''
    photon, settings = pinit('prepare', clean=True)

    for community in [
        onlyone
    ] if onlyone else settings['common']['communities'].keys():

        change_location(
            settings['gluon']['local'][community],
            False,
            move=True
        )
        tags = settings['common']['branches']['avail'][branch]
        gluon, site = ginit(photon, community=community)

        if gluon_tag:
            if gluon.tag and gluon_tag in gluon.tag:
                gluon.tag = gluon_tag
            elif gluon.commit and (
                gluon_tag in gluon.commit or gluon_tag in gluon.short_commit
            ):
                gluon.commit = gluon_tag
            else:
                photon.m(
                    'Invalid git commit-id or tag specified for gluon',
                    state=True
                )
        else:
            if tags[0]:
                gluon.tag = None
            else:
                gluon.branch = None

        if site_tag:
            if site.tag and site_tag in site.tag:
                site.tag = site_tag
            elif site.commit and (
                site_tag in site.commit or site_tag in site.short_commit
            ):
                site.commit = site_tag
            else:
                photon.m(
                    'Invalid git commit-id or tag specified for site',
                    state=True
                )
        else:
            if tags[1]:
                site.tag = None
            else:
                site.branch = None

        photon.m(
            'generating site for %s' % (community),
            cmdd=dict(
                cmd='%s generate.py %s %s %s' % (
                    settings['common']['pycmd'],
                    community,
                    '--nomodules' if nomodules else '',
                    '--priority %s' % (priority) if priority else ''
                ),
                cwd=settings['site']['local'][community]
            ),
            verbose=True
        )