Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions scripts/pkg_in_pipe/pkg_in_pipe.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ def find_previous_build_commit(session, build_tag, build):
]
if not tagged:
return None
previous_build = session.getBuild(tagged[0]['build_id'])
previous_build = get_koji_build(session, tagged[0]['build_id'])
if not previous_build.get('source'):
return None
return parse_source(previous_build['source'])[1]
Expand Down Expand Up @@ -253,6 +253,14 @@ def find_pull_requests(gh, repo, start_sha, end_sha):
prs.update(commit_prs)
return sorted(prs, key=lambda p: p.number, reverse=True)

def get_koji_build(session, build_id) -> dict:
cache_key = f'koji-build-{build_id}'
if not args.re_cache and cache_key in CACHE:
return cast(dict, CACHE[cache_key])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the cast looks necessary just because CACHE itself cannot be properly type-hinted?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes 👍

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thinking twice about it, CACHE could be typed using a TypeDict?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it would fit well.

I could assert isinstance(…) instead of casting if you prefer

else:
build = session.getBuild(build_id)
CACHE.set(cache_key, build, expire=RETENTION_TIME)
return build
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instead of managing such a cache manually, wouldn't get_koji_build = functools.cache(session.getBuild) do the job? I guess other uses of CACHE could also go that same way.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

that's a persistent cache, using diskcache. I don't think functool has anything similar.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, right. Looks like this is a common pattern, though, and there are some libs for this, like:

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is a memoize() decorator in diskcache, but it doesn't fit well with the command line option to refresh the cache

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or maybe I can set the expire property after creating the CACHE object. I'll check


started_at = datetime.now()

Expand Down Expand Up @@ -328,7 +336,7 @@ def find_pull_requests(gh, repo, start_sha, end_sha):
taggeds = (t for t in taggeds if t['package_name'] in args.packages or args.packages == [])
taggeds = sorted(taggeds, key=lambda t: (tag_history[t['build_id']], t['build_id']), reverse=True)
for tagged in taggeds:
build = session.getBuild(tagged['build_id'])
build = get_koji_build(session, tagged['build_id'])
prs: list[PullRequest] = []
maintained_by = None
previous_build_sha = find_previous_build_commit(session, tag, build)
Expand Down