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)
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)
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)
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)
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]}
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)