|
from dataclasses import dataclass |
|
import os |
|
import gradio as gr |
|
from graphql_calls import get_tag_commit_date, get_commits |
|
from github import fetch_github_info |
|
|
|
|
|
@dataclass |
|
class Contributions: |
|
additions: int |
|
deletions: int |
|
descriptions: list[str] |
|
|
|
|
|
def get_release_notes( |
|
tag: str, |
|
branch: str, |
|
contributor_treshhold: int, |
|
ignore_dependabot: bool, |
|
ignore_direct: bool, |
|
): |
|
try: |
|
token = os.getenv("GITHUB_TOKEN") |
|
repo = "huggingface/diffusers" |
|
date = get_tag_commit_date(token, repo, tag) |
|
commits = get_commits(token, repo, branch, date) |
|
except ValueError as e: |
|
return str(e) |
|
|
|
result = "" |
|
contributors = {} |
|
|
|
for commit in commits[::-1]: |
|
if "Hugging Face" not in commit.user.organizations: |
|
if commit.user.name not in contributors: |
|
contributors[commit.user.name] = Contributions( |
|
additions=commit.additions, |
|
deletions=commit.deletions, |
|
descriptions=[commit.message], |
|
) |
|
else: |
|
contributors[commit.user.name].additions += commit.additions |
|
contributors[commit.user.name].deletions += commit.deletions |
|
contributors[commit.user.name].descriptions += [commit.message] |
|
|
|
if "(#" in commit.message: |
|
if ignore_dependabot and commit.user.name == "dependabot[bot]": |
|
continue |
|
|
|
split = commit.message.split("(#") |
|
message = split[0] |
|
number = split[1].strip(")") |
|
|
|
result += f"* {message} by @{commit.user.name} in #{number}\n" |
|
elif not ignore_direct: |
|
result += f"* {commit.message} by @{commit.user.name} (direct commit on {branch})\n" |
|
|
|
significant_contributors = { |
|
k: v |
|
for k, v in contributors.items() |
|
if (v.additions + v.deletions) > contributor_treshhold and k != "<NOT FOUND>" |
|
} |
|
|
|
if len(significant_contributors): |
|
result += ( |
|
"\n## Significant community contributions\n" |
|
"\nThe following contributors have made significant " |
|
"changes to the library over the last release:\n\n" |
|
) |
|
|
|
for significant_contributor, contributions in significant_contributors.items(): |
|
result += f"* @{significant_contributor}\n" |
|
for description in contributions.descriptions: |
|
result += f" * {description}\n" |
|
|
|
return result |
|
|
|
|
|
article = """ |
|
Mostly copied from [lysandre/github-release](https://huggingface.co/spaces/lysandre/github-release) but suited for |
|
Diffusers. |
|
""" |
|
github_info = fetch_github_info("https://github.com/huggingface/diffusers") |
|
|
|
demo = gr.Interface( |
|
title="Automatic release notes for 🤗 Diffusers", |
|
article=article, |
|
description="**See instructions below the form.**", |
|
fn=get_release_notes, |
|
inputs=[ |
|
gr.components.Textbox( |
|
lines=1, |
|
value=github_info["second_last_tag"] if github_info else None, |
|
placeholder="The tag from which to get commit", |
|
), |
|
gr.components.Textbox( |
|
lines=1, |
|
placeholder="The linear branch on which the new version tag will be added", |
|
value=github_info["latest_release_branch"] if github_info else None, |
|
), |
|
gr.components.Slider( |
|
minimum=0, |
|
maximum=2000, |
|
value=500, |
|
label="Threshold for significant contributors", |
|
), |
|
gr.components.Checkbox(label="Ignore dependabot commits"), |
|
gr.components.Checkbox(label="Ignore direct commits"), |
|
], |
|
outputs="text", |
|
allow_flagging="never" |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch(show_error=True) |
|
|