Skip to content
63 changes: 57 additions & 6 deletions tools/dependency/release_dates.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import exports
import utils

from colorama import Fore, Style
from packaging import version

Expand Down Expand Up @@ -63,16 +62,17 @@ def verify_and_print_latest_release(dep, repo, metadata_version, release_date, c
# check for --check_deps flag, To run this only on github action schedule
# and it does not bloat CI on every push
if create_issue:
create_issues(dep, metadata_version, release_date, latest_release)
create_issues(dep, repo, metadata_version, release_date, latest_release)


# create issue for stale dependency
def create_issues(dep, metadata_version, release_date, latest_release):
def create_issues(dep, package_repo, metadata_version, release_date, latest_release):
"""Create issues in GitHub.

Args:
dep : name of the deps
metadata_version :
package_repo: package Url
metadata_version: current version information
release_date : old release_date
latest_release : latest_release (name and date )
"""
Expand All @@ -86,12 +86,18 @@ def create_issues(dep, metadata_version, release_date, latest_release):
labels.append(label.name)
if len(labels) != len(LABELS):
raise DependencyUpdateError('Unknown labels (expected %s, got %s)' % (LABELS, labels))
body = f'*WARNING* {dep} has a newer release than {metadata_version}@<{release_date}>:{latest_release.tag_name}@<{latest_release.created_at}>'
title = f'Newer release available {dep}: {latest_release.tag_name}'
body = f'''\
Comment thread
ME-ON1 marked this conversation as resolved.
Outdated
Package Name: {dep}
Current Version: {metadata_version}@{release_date}
Available Version: {latest_release.tag_name}@{latest_release.created_at}
Upstream link: https://github.com/{package_repo.full_name}\
'''
title = f'Newer release available `{dep}`: {latest_release.tag_name} (current: {metadata_version})'
Comment thread
ME-ON1 marked this conversation as resolved.
if issues_exist(title, git):
print("Issue with %s already exists" % title)
print(' >> Issue already exists, not posting!')
return
search_old_version_open_issue_exist(title, git, package_repo, latest_release)
print('Creating issues...')
try:
repo.create_issue(title, body=body, labels=LABELS)
Expand All @@ -111,6 +117,51 @@ def issues_exist(title, git):
return issues.totalCount > 0


# search for issue by title and delete old issue if new package version is available
def search_old_version_open_issue_exist(title, git, package_repo, latest_release):
# search for only "Newer release available `{dep}`:" as will be common in dep issue
title_search = title[0:title.index(":")]
query = f'repo:envoyproxy/envoy {title_search} in:title is:open'
Comment thread
ME-ON1 marked this conversation as resolved.
Outdated
# there might be more than one issue
# if current package version == issue package version no need to do anything, right issue is open
# if current package version != issue_title_version means a newer updated version is available
# and close old issue
issues = git.search_issues(query)
for issue in issues:
issue_version = get_package_version_from_issue(issue.title)
if issue_version != latest_release.tag_name:
close_old_issue(git, issue.number, latest_release, package_repo)


def get_package_version_from_issue(issue_title):
# issue title create by github action has two form
if "(" in issue_title:
Comment thread
ME-ON1 marked this conversation as resolved.
Outdated
return issue_title[issue_title.index(":") + 1:issue_title.index("(") - 1]
else:
return issue_title[issue_title.index(":") + 1:len(issue_title)]


def close_old_issue(git, issue_number, latest_release, package_repo):
closing_comment = f'''\
New version is available for this package
Comment thread
ME-ON1 marked this conversation as resolved.
Outdated
Details :-
New Version: {latest_release.tag_name}@{latest_release.created_at}
Upstream Link: https://github.com/{package_repo.full_name}\
'''
repo = git.get_repo('envoyproxy/envoy')
try:
issue = repo.get_issue(number=issue_number)
print(f'Publishing closing comment... ')
publish_comment = issue.create_comment(closing_comment)
print(f'Closing this issue as new package is available')
if publish_comment.completed:
issue.edit(state='closed')
except github.GithubException as e:
print(f'There was a problem in publishing comment or closing this issue')
raise
return


# Print GitHub release date, throw ReleaseDateVersionError on mismatch with metadata release date.
def verify_and_print_release_date(dep, github_release_date, metadata_release_date):
mismatch = ''
Expand Down