import gradio as gr from datetime import datetime, timedelta import google.generativeai as genai from github import Github, GithubException from urllib.parse import urlparse def generate_release_notes(github_url, github_token, gemini_api_key, start_date, end_date): try: # Initialize GitHub client with the token g = Github(github_token) # Parse the full GitHub URL parsed_url = urlparse(github_url) path_parts = parsed_url.path.strip('/').split('/') owner = path_parts[0] repo_name = '/'.join(path_parts[1:]).rstrip('.git') # Get the repository repo = g.get_repo(f"{owner}/{repo_name}") # Get commits between start_date and end_date start_date = datetime.strptime(start_date, "%Y-%m-%d") end_date = datetime.strptime(end_date, "%Y-%m-%d") commits = list(repo.get_commits(since=start_date, until=end_date)) # Prepare commit messages commit_messages = [commit.commit.message for commit in commits] commit_text = "\n".join(commit_messages) if not commit_text: return "No commits found in the specified date range." # Use Gemini AI to generate release notes genai.configure(api_key=gemini_api_key) model = genai.GenerativeModel('gemini-pro') prompt = f"""Based on the following commit messages, generate comprehensive release notes: {commit_text} Please organize the release notes into sections such as: 1. New Features 2. Bug Fixes 3. Improvements 4. Breaking Changes (if any) Provide a concise summary for each item.""" response = model.generate_content(prompt) return response.text except GithubException as e: if e.status == 401: return "Error: Invalid GitHub token or insufficient permissions." elif e.status == 404: return f"Error: Repository not found. Please check the GitHub URL. Attempted to access: {owner}/{repo_name}" else: return f"GitHub API error: {str(e)}" except Exception as e: return f"An error occurred: {str(e)}" # Set default dates default_end_date = datetime.now() default_start_date = default_end_date - timedelta(days=7) # One week ago # Create Gradio interface iface = gr.Interface( fn=generate_release_notes, inputs=[ gr.Textbox(label="GitHub Repository URL", placeholder="https://github.com/username/repo.git"), gr.Textbox(label="GitHub Personal Access Token", type="password"), gr.Textbox(label="Gemini API Key", type="password"), gr.Textbox( label="Start Date", placeholder="YYYY-MM-DD", value=default_start_date.strftime("%Y-%m-%d"), ), gr.Textbox( label="End Date", placeholder="YYYY-MM-DD", value=default_end_date.strftime("%Y-%m-%d"), ) ], outputs=gr.Textbox(label="Generated Release Notes"), title="Automated Release Notes Generator", description="Generate release notes based on GitHub commits using Gemini AI. Enter start and end dates (YYYY-MM-DD) to define the time range for commits.", allow_flagging="never", theme="default", analytics_enabled=False, ) # Launch the app iface.launch()