Example #1
0
def create_release(event: Dict, _c: Dict) -> Dict:
    """
    Lambda function that responds to new tag events to create a release.

    :param event: lambda expected event object
    :param _c: lambda expected context object (unused)
    :returns: none
    """
    msg = sns.get_sns_msg(event=event, msg_key=GithubEvent.tag.value)
    logger.info({'operation': 'create_release', 'sns_payload': msg})

    if msg.get('X-GitHub-Event') == 'create':
        updated_repo = hub.get_github_repo(
            msg.get('repository', {}).get('full_name'))
        main = updated_repo.get_branch('main')
        tag_name = msg.get('ref')
        ref = updated_repo.get_git_ref(f'tags/{tag_name}')
        tag = updated_repo.get_git_tag(sha=ref.object.sha)
        message = f'### {tag_name}\n\n- {tag.message.lstrip("-").strip()}\n'

        updated_repo.create_git_release(tag=tag_name,
                                        name=tag_name,
                                        message=message,
                                        draft=False,
                                        prerelease=False,
                                        target_commitish=main)
Example #2
0
def update_labels(event: Dict, _c: Dict):
    """
    Lambda function to update repository labels to match config settings.

    :param event: lambda expected event object
    :param _c: lambda expected context object (unused)
    :returns: none
    """
    logger.info({'operation': 'update_labels'})
    msg = sns.get_sns_msg(event=event, msg_key='label')
    repo = hub.get_github_repo(repo=msg.get('full_name'))
    _label_sync(repo=repo)
Example #3
0
def update(event: Dict, _c: Dict):
    """
    Lambda function that responds to repository events.

    :param event: lambda expected event object
    :param _c: lambda expected context object (unused)
    :returns: none
    """
    msg = sns.get_sns_msg(event=event, msg_key=GithubEvent.repository.value)
    logger.info({'operation': 'update', 'sns_payload': msg})

    if msg.get('action') not in {'deleted', 'archived'}:
        full_name = msg.get('repository', {}).get('full_name')
        repo = hub.get_github_repo(repo=full_name)
        _repo_settings_sync(repo=repo)
Example #4
0
def update_readme(event: Dict, _c: Dict) -> Dict:
    """
    Lambda function to update versions section of metadata repo README file.

    :param event: lambda expected event object
    :param _c: lambda expected context object (unused)
    :returns: none
    """
    logger.info({'operation': 'update_readme'})
    readme = 'README.md'
    meta_repo = hub.get_github_repo(METADATA_REPO)
    file = meta_repo.get_contents(readme)
    result = ''

    #: Iterate over all records
    paginator = dynamodb.CLIENT.get_paginator('scan')
    iterator = paginator.paginate(TableName=VERSION_TABLE)
    for itr in iterator:
        items = itr.get('Items')
        for item in items:
            data = dynamodb.deserialize(item)
            repo, versions = data.get('repository'), data.get('versions')

            #: Create a section per repository with all versions listed under dropdown
            url = lambda v: f'https://github.com/{repo}/releases/tag/{v}'
            lis = '\n\t'.join(
                [f'<li><a href="{url(v)}">{v}</a></li>' for v in versions])
            content = f'''
#### `{repo.split("/")[1]}` : [{versions[0]}]({url(versions[0])})

<details>
<summary>All Versions</summary>
    <ul>
        {lis}
    </ul>
</details>
    '''
            result += content
    #: Make sure tags are put back for next update
    result = f'<!-- Tag Start -->\n{result}\n<!-- Tag End -->'
    final_content = re.sub('<!-- Tag Start -->.*?<!-- Tag End -->',
                           result,
                           file.decoded_content.decode('utf-8'),
                           flags=re.DOTALL)
    meta_repo.update_file(path=readme,
                          message='Tag section updated in README',
                          content=final_content,
                          sha=file.sha)
Example #5
0
def _get_tag_data(payload: Dict, repo: Optional[Repository] = None) -> Dict:
    """
    Extract tag data from triggered event.

    :param payload: tag event payload
    :param repo: optional repository object
    :returns: tag data object
    """
    if not repo:
        #: used for version events
        repo_full_name = payload.get('repository', {}).get('full_name')
        repo = hub.get_github_repo(repo_full_name)
    else:
        #: used for out of band syncing repository versions
        repo_full_name = repo.full_name
    tags = repo.get_tags()

    return {'repository': repo_full_name, 'versions': [t.name for t in tags]}
Example #6
0
def update_readme(event: Dict, _c: Dict):
    """
    Lambda function to update pull request section of metadata repo README file.

    :param event: lambda expected event object
    :param _c: lambda expected context object (unused)
    :returns: none
    """
    logger.info({'operation': 'update_readme'})
    readme = 'README.md'
    meta_repo = hub.get_github_repo(METADATA_REPO)
    file = meta_repo.get_contents(readme)

    #: Output is rendered as markdown table
    header = '| Repository | PR | Branch | User | Age (days) |\n| --- | --- | --- | --- | --- |\n'
    rows = ''

    #: Create a row per record/pull request
    paginator = dynamodb.CLIENT.get_paginator('scan')
    iterator = paginator.paginate(TableName=PR_TABLE)
    for itr in iterator:
        items = itr.get('Items')
        for item in items:
            data = dynamodb.deserialize(item)
            days = (datetime.now() -
                    datetime.strptime(data.get('date'), '%Y-%m-%d')).days
            repo, pr = data.get('repository'), data.get('pull_request')
            row = f"|{repo}|[#{pr}]({data.get('url')})|{data.get('branch')}|{data.get('user')}|{days}|\n"
            rows += row
    final = header + rows

    #: Make sure target replacement tags are put back for next update
    result = f'<!-- PR Start -->\n{final}\n<!-- PR End -->'
    final_content = re.sub('<!-- PR Start -->.*?<!-- PR End -->',
                           result,
                           file.decoded_content.decode('utf-8'),
                           flags=re.DOTALL)
    meta_repo.update_file(path=readme,
                          message='Pull request section updated in README',
                          content=final_content,
                          sha=file.sha)