|
def get_file_content(owner, repo_name, path, branch="main"): |
|
"""Fetches file content from a GitHub repository.""" |
|
url = f"https://raw.githubusercontent.com/{owner}/{repo_name}/{branch}/{path}" |
|
try: |
|
response = requests.get(url) |
|
response.raise_for_status() |
|
return response.text |
|
except requests.exceptions.RequestException as e: |
|
return f"Error fetching file: {e}" |
|
|
|
|
|
def extract_repo_info(url): |
|
"""Extracts owner and repo name from a GitHub URL.""" |
|
match = re.search(r"github\.com/([^/]+)/([^/]+)", url) |
|
return match.group(1), match.group(2) if match else (None, None) |
|
|
|
|
|
def analyze_file_content(content, file_path): |
|
"""Analyzes file content and returns statistics.""" |
|
lines = content.splitlines() |
|
word_count = sum(len(line.split()) for line in lines) |
|
line_count = len(lines) |
|
file_extension = file_path.split('.')[-1].lower() if '.' in file_path else "unknown" |
|
return { |
|
"line_count": line_count, |
|
"word_count": word_count, |
|
"file_extension": file_extension, |
|
} |
|
|
|
|
|
def github_tool( |
|
action: str, |
|
repo_name: str = None, |
|
branch: str = "main", |
|
path: str = None, |
|
content: str = None, |
|
message: str = None, |
|
owner: str = None, |
|
vcs_url: str = None, |
|
title: str = None, |
|
body: str = None, |
|
base: str = None, |
|
head: str = None, |
|
issue_number: int = None, |
|
labels: str = None, |
|
tag: str = None, |
|
name: str = None, |
|
file_url: str = None, |
|
repo_url: str = None, |
|
template_name: str = None, |
|
template_params: dict = None, |
|
diff: str = None, |
|
diff_message: str = None, |
|
new_description: str = None, |
|
issue_title: str = None, |
|
issue_body: str = None, |
|
issue_state: str = None, |
|
**kwargs |
|
): |
|
"""Manages GitHub repositories.""" |
|
user = g.get_user() |
|
|
|
try: |
|
if action == "import_repository": |
|
if not all([owner, repo_name, vcs_url]): |
|
raise ValueError("Missing parameters: owner, repo_name, vcs_url") |
|
try: |
|
user.get_repo(repo_name) |
|
return "Repository already exists." |
|
except GithubException: |
|
pass |
|
|
|
headers = { |
|
'Authorization': f'token {GITHUB_TOKEN}', |
|
'Accept': 'application/vnd.github.v3+json', |
|
} |
|
import_url = f'https://api.github.com/repos/{owner}/{repo_name}/import' |
|
response = requests.put(import_url, json={'vcs_url': vcs_url, 'vcs': 'git'}, headers=headers) |
|
response.raise_for_status() |
|
return "Repository import started." |
|
|
|
elif action == "create_repository": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = user.create_repo(name=repo_name) |
|
return f"Repository **{repo_name}** created! [Open repository]({repo.html_url})" |
|
|
|
elif action == "create_project_from_template": |
|
if not all([repo_name, template_name]): |
|
raise ValueError("Missing parameters: repo_name, template_name") |
|
if template_name not in PROJECT_TEMPLATES: |
|
raise ValueError( |
|
f"Unknown template: {template_name}. Available: {', '.join(PROJECT_TEMPLATES.keys())}" |
|
) |
|
repo = user.create_repo(name=repo_name) |
|
template = PROJECT_TEMPLATES[template_name] |
|
|
|
template_params_final = {} |
|
if "params" in template: |
|
for param_name, param_config in template["params"].items(): |
|
template_params_final[param_name] = template_params.get(param_name, param_config.get("default")) if template_params else param_config.get("default") |
|
|
|
repo_name_snake_case = repo_name.replace("-", "_") |
|
readme_filename = "README.md" |
|
|
|
env = jinja2.Environment() |
|
|
|
for file_path, file_content in template["files"].items(): |
|
final_file_path = file_path |
|
final_file_content = file_content |
|
|
|
if "rename_files" in template: |
|
for old_name, new_name_template in template["rename_files"].items(): |
|
if file_path == old_name: |
|
final_file_path = new_name_template.replace("{{repo_name_snake_case}}", repo_name_snake_case).replace("{{repo_name}}", repo_name).replace("{{readme_filename}}", readme_filename) |
|
|
|
template_render = env.from_string(final_file_content) |
|
final_file_content = template_render.render( |
|
repo_name=repo_name, |
|
repo_name_snake_case=repo_name_snake_case, |
|
readme_filename=readme_filename, |
|
**template_params_final |
|
) |
|
|
|
repo.create_file( |
|
final_file_path, |
|
f"Create {final_file_path} from template {template_name}", |
|
final_file_content, |
|
branch="main", |
|
) |
|
|
|
if "post_process" in template: |
|
post_process_action = template["post_process"] |
|
if post_process_action == "install_dependencies": |
|
print( |
|
f"Post-processing: install_dependencies for {repo_name} (Not fully implemented in this example).") |
|
elif post_process_action == "shadcn_setup": |
|
instructions = f""" |
|
**Konfiguracja Shadcn UI wymaga dodatkowych kroków po stronie klienta!** |
|
|
|
1. **Sklonuj repozytorium:** `git clone https://github.com/{user.login}/{repo_name}.git` |
|
2. **Przejdź do katalogu projektu:** `cd {repo_name}` |
|
3. **Zainstaluj zależności:** `npm install` (lub `yarn install`, `pnpm install`) |
|
4. **Zainicjuj Shadcn UI:** `npx shadcn-ui@latest init` |
|
5. **Uruchom aplikację:** `npm run dev` (lub odpowiednia komenda dla Twojego menedżera pakietów) |
|
|
|
Po wykonaniu tych kroków, Twoja aplikacja Shadcn UI będzie w pełni skonfigurowana i gotowa do rozwoju. |
|
""" |
|
return f"Repository **{repo_name}** created from template **{template_name}**! [Open repository]({repo.html_url})\n\n{instructions}" |
|
else: |
|
print(f"Unknown post-process action: {post_process_action}") |
|
|
|
return f"Repository **{repo_name}** created from template **{template_name}**! [Open repository]({repo.html_url})" |
|
|
|
elif action == "create_file": |
|
if not all([repo_name, path, content, message]): |
|
raise ValueError("Missing parameters: repo_name, path, content, message") |
|
repo = user.get_repo(repo_name) |
|
repo.create_file(path, message, content, branch=branch) |
|
return f"File **`{path}`** created in repository **`{repo_name}`** on branch **`{branch}`**." |
|
|
|
elif action == "get_file": |
|
if not all([repo_name, path]): |
|
raise ValueError("Missing parameters: repo_name, path") |
|
repo = user.get_repo(repo_name) |
|
file_content = repo.get_contents(path, ref=branch) |
|
return ( |
|
f"File content of **`{path}`** from **`{repo_name}`**:\n\n`\n{file_content.decoded_content.decode()}\n`" |
|
) |
|
|
|
elif action == "get_file_content_by_url": |
|
if not file_url: |
|
raise ValueError("Missing parameter: file_url") |
|
file_content = get_file_content(None, None, None, None) |
|
return f"File content from URL **`{file_url}`**:\n\n`\n{file_content}\n`" |
|
|
|
elif action == "delete_file": |
|
if not all([repo_name, path]): |
|
raise ValueError("Missing parameters: repo_name, path") |
|
repo = user.get_repo(repo_name) |
|
file_contents = repo.get_contents(path, ref=branch) |
|
repo.delete_file(path, "Delete file", file_contents.sha, branch=branch) |
|
return f"File **`{path}`** deleted from repository **`{repo_name}`** on branch **`{branch}`**." |
|
|
|
elif action == "update_file": |
|
if not all([repo_name, path, content, message]): |
|
raise ValueError("Missing parameters: repo_name, path, content, message") |
|
repo = user.get_repo(repo_name) |
|
file_contents = repo.get_contents(path, ref=branch) |
|
repo.update_file(path, message, content, file_contents.sha, branch=branch) |
|
return f"File **`{path}`** updated in repository **`{repo_name}`** on branch **`{branch}`**." |
|
|
|
elif action == "update_file_diff": |
|
if not all([repo_name, path, diff, diff_message]): |
|
raise ValueError("Missing parameters: repo_name, path, diff, diff_message") |
|
repo = user.get_repo(repo_name) |
|
file_contents = repo.get_contents(path, ref=branch) |
|
current_content_text = file_contents.decoded_content.decode() |
|
|
|
dmp = diff_match_patch() |
|
|
|
try: |
|
patches = dmp.patch_fromText(diff) |
|
except ValueError: |
|
raise ValueError("Invalid patch format. Please provide a valid patch in 'diff' format.") |
|
|
|
patched_content_tuple = dmp.patch_apply(patches, current_content_text) |
|
patched_content_text = patched_content_tuple[0] |
|
patch_results = patched_content_tuple[1] |
|
|
|
if not any(patch_results): |
|
raise ValueError("Failed to apply patch. Diff might be outdated or invalid.") |
|
|
|
repo.update_file(path, diff_message, patched_content_text, file_contents.sha, branch=branch) |
|
return f"File **`{path}`** updated using diff in repository **`{repo_name}`** on branch **`{branch}`**." |
|
|
|
|
|
elif action == "list_branches": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = user.get_repo(repo_name) |
|
branches = repo.get_branches() |
|
branch_list = "\n".join([f"- `{branch.name}`" for branch in branches]) |
|
return f"Branches in repository **`{repo_name}`**:\n{branch_list}" |
|
|
|
elif action == "create_branch": |
|
if not all([repo_name, base, head]): |
|
raise ValueError("Missing parameters: repo_name, base, head") |
|
repo = user.get_repo(repo_name) |
|
source_branch = repo.get_branch(base) |
|
repo.create_git_ref(ref=f"refs/heads/{head}", sha=source_branch.commit.sha) |
|
return f"Branch **`{head}`** created from **`{base}`** in repository **`{repo_name}`**." |
|
|
|
elif action == "delete_branch": |
|
if not all([repo_name, branch]): |
|
raise ValueError("Missing parameters: repo_name, branch") |
|
repo = user.get_repo(repo_name) |
|
repo.get_git_ref(f"heads/{branch}").delete() |
|
return f"Branch **`{branch}`** deleted from repository **`{repo_name}`**." |
|
|
|
elif action == "create_pull_request": |
|
if not all([repo_name, title, body, base, head]): |
|
raise ValueError("Missing parameters: repo_name, title, body, base, head") |
|
repo = user.get_repo(repo_name) |
|
pr = repo.create_pull(title=title, body=body, base=base, head=head) |
|
return f"Pull request created! [Open Pull Request]({pr.html_url})" |
|
|
|
elif action == "list_open_pull_requests": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = user.get_repo(repo_name) |
|
open_prs = repo.get_pulls(state='open') |
|
if not open_prs: |
|
return f"No open pull requests in repository **`{repo_name}`**." |
|
prs_list = "\n".join([f"- [{pr.title}]({pr.html_url})" for pr in open_prs]) |
|
return f"Open pull requests in repository **`{repo_name}`**:\n{prs_list}" |
|
|
|
elif action == "create_issue": |
|
if not all([repo_name, title, body]): |
|
raise ValueError("Missing parameters: repo_name, title, body") |
|
repo = user.get_repo(repo_name) |
|
issue = repo.create_issue(title=title, body=body) |
|
return f"Issue created! [Open Issue]({issue.html_url})" |
|
|
|
elif action == "list_issues": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = user.get_repo(repo_name) |
|
issues = repo.get_issues(state='open') |
|
if not issues: |
|
return f"No open issues in repository **`{repo_name}`**." |
|
issues_list = "\n".join([f"- [{issue.title}]({issue.html_url})" for issue in issues]) |
|
return f"Open issues in repository **`{repo_name}`**:\n{issues_list}" |
|
|
|
elif action == "add_label_to_issue": |
|
if not all([repo_name, issue_number, labels]): |
|
raise ValueError("Missing parameters: repo_name, issue_number, labels") |
|
repo = user.get_repo(repo_name) |
|
issue = repo.get_issue(number=int(issue_number)) |
|
for label in labels.split(","): |
|
issue.add_to_labels(label.strip()) |
|
return ( |
|
f"Labels **`{labels}`** added to issue **#{issue_number}** in repository **`{repo_name}`**." |
|
) |
|
|
|
elif action == "close_issue": |
|
if not all([repo_name, issue_number]): |
|
raise ValueError("Missing parameters: repo_name, issue_number") |
|
repo = user.get_repo(repo_name) |
|
issue = repo.get_issue(number=int(issue_number)) |
|
issue.edit(state='closed') |
|
return f"Issue **#{issue_number}** closed in repository **`{repo_name}`**." |
|
|
|
elif action == "add_comment_to_issue": |
|
if not all([repo_name, issue_number, message]): |
|
raise ValueError("Missing parameters: repo_name, issue_number, message") |
|
repo = user.get_repo(repo_name) |
|
issue = repo.get_issue(number=int(issue_number)) |
|
issue.create_comment(body=message) |
|
return f"Comment added to issue **#{issue_number}** in repository **`{repo_name}`**." |
|
|
|
elif action == "create_release": |
|
if not all([repo_name, tag, name, message]): |
|
raise ValueError("Missing parameters: repo_name, tag, name, message") |
|
repo = user.get_repo(repo_name) |
|
release = repo.create_git_release(tag=tag, name=name, message=message) |
|
return ( |
|
f"Release **`{name}`** created in repository **`{repo_name}`**! [Open Release]({release.html_url})" |
|
) |
|
|
|
elif action == "list_releases": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = user.get_repo(repo_name) |
|
releases = repo.get_releases() |
|
if not releases: |
|
return f"No releases in repository **`{repo_name}`**." |
|
releases_list = "\n".join([f"- [{release.tag_name}]({release.html_url})" for release in releases]) |
|
return f"Releases in repository **`{repo_name}`**:\n{releases_list}" |
|
|
|
elif action == "fork_repository": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = g.get_repo(repo_name) |
|
fork = user.create_fork(repo) |
|
return f"Repository **`{repo_name}`** forked! [Open fork]({fork.html_url})" |
|
|
|
elif action == "list_forks": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = g.get_repo(repo_name) |
|
forks = repo.get_forks() |
|
if not forks: |
|
return f"No forks of repository **`{repo_name}`**." |
|
forks_list = "\n".join([f"- [{fork.full_name}]({fork.html_url})" for fork in forks]) |
|
return f"Forks of repository **`{repo_name}`**:\n{forks_list}" |
|
|
|
elif action == "list_files": |
|
if not all([owner, repo_name]): |
|
raise ValueError("Missing parameters: owner, repo_name") |
|
repo = g.get_repo(f"{owner}/{repo_name}") |
|
contents = repo.get_contents("" if not path else path) |
|
if not contents: |
|
return f"No files in path **`{path}`** of repository **`{repo_name}`**." |
|
files_list = "\n".join([f"- [{content.name}]({content.download_url})" for content in contents]) |
|
return f"Files in path **`{path}`** of repository **`{repo_name}`**:\n{files_list}" |
|
|
|
elif action == "get_repository_info": |
|
if not all([owner, repo_name]): |
|
raise ValueError("Missing parameters: owner, repo_name") |
|
repo = g.get_repo(f"{owner}/{repo_name}") |
|
info = { |
|
"Name": repo.name, |
|
"Description": repo.description, |
|
"URL": repo.html_url, |
|
"Owner": repo.owner.login, |
|
"Default branch": repo.default_branch, |
|
"Language": repo.language, |
|
"Stars": repo.stargazers_count, |
|
"Forks": repo.forks_count, |
|
"Created at": str(repo.created_at), |
|
"Last updated": str(repo.updated_at), |
|
} |
|
info_md = "\n".join([f"- **{key}**: {value}" for key, value in info.items()]) |
|
return f"Repository info for **`{repo_name}`**:\n{info_md}" |
|
|
|
elif action == "get_file_content": |
|
if not all([owner, repo_name, path]): |
|
raise ValueError("Missing parameters: owner, repo_name, path") |
|
content_text = get_file_content(owner, repo_name, path, branch) |
|
return ( |
|
f"File content of **`{path}`** from repository **`{repo_name}`**:\n\n`\n{content_text}\n`" |
|
) |
|
|
|
elif action == "analyze_repository_by_url": |
|
if not repo_url: |
|
raise ValueError("Missing parameter: repo_url") |
|
owner, repo_name = extract_repo_info(repo_url) |
|
if not owner or not repo_name: |
|
raise ValueError("Invalid repository URL") |
|
|
|
repo = g.get_repo(f"{owner}/{repo_name}") |
|
contents = repo.get_contents("") |
|
file_analyses = [] |
|
for content in contents: |
|
if content.type == "file": |
|
file_content = content.decoded_content.decode() |
|
analysis = analyze_file_content(file_content, content.path) |
|
file_analyses.append({ |
|
"name": content.name, |
|
"path": content.path, |
|
"analysis": analysis, |
|
}) |
|
analysis_md = "Repository file analysis:\n" + "\n".join([ |
|
f"- **{f['path']}**:\n" |
|
f" - Lines: {f['analysis']['line_count']}\n" |
|
f" - Words: {f['analysis']['word_count']}\n" |
|
f" - Extension: {f['analysis']['file_extension']}" |
|
for f in file_analyses |
|
]) |
|
return analysis_md |
|
|
|
elif action == "analyze_repository_content": |
|
if not all([owner, repo_name]): |
|
raise ValueError("Missing parameters: owner, repo_name") |
|
repo = g.get_repo(f"{owner}/{repo_name}") |
|
contents = repo.get_contents("") |
|
file_analyses = [] |
|
for content in contents: |
|
if content.type == "file": |
|
file_content = get_file_content(owner, repo_name, content.path, branch) |
|
analysis = analyze_file_content(file_content, content.path) |
|
file_analyses.append({ |
|
"name": content.name, |
|
"path": content.path, |
|
"analysis": analysis, |
|
}) |
|
analysis_md = "Repository content analysis:\n" + "\n".join([ |
|
f"- **{f['path']}**:\n" |
|
f" - Lines: {f['analysis']['line_count']}\n" |
|
f" - Words: {f['analysis']['word_count']}\n" |
|
f" - Extension: {f['analysis']['file_extension']}" |
|
for f in file_analyses |
|
]) |
|
return analysis_md |
|
|
|
elif action == "delete_repository": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = user.get_repo(repo_name) |
|
repo.delete() |
|
return f"Repository **`{repo_name}`** deleted!" |
|
|
|
elif action == "update_repository_description": |
|
if not all([repo_name, new_description]): |
|
raise ValueError("Missing parameters: repo_name, new_description") |
|
repo = user.get_repo(repo_name) |
|
repo.edit(description=new_description) |
|
return f"Repository **`{repo_name}`** description updated to: \"{new_description}\"" |
|
|
|
elif action == "edit_issue": |
|
if not all([repo_name, issue_number]): |
|
raise ValueError("Missing parameters: repo_name, issue_number") |
|
repo = user.get_repo(repo_name) |
|
issue = repo.get_issue(number=int(issue_number)) |
|
issue_update_params = {} |
|
if issue_title is not None: |
|
issue_update_params['title'] = issue_title |
|
if issue_body is not None: |
|
issue_update_params['body'] = issue_body |
|
if issue_state is not None: |
|
issue_update_params['state'] = issue_state |
|
if not issue_update_params: |
|
raise ValueError("No issue details to update provided (title, body, or state)") |
|
issue.edit(**issue_update_params) |
|
updated_fields = ", ".join(issue_update_params.keys()) |
|
return f"Issue **#{issue_number}** in repository **`{repo_name}`** updated fields: {updated_fields}" |
|
|
|
elif action == "list_closed_issues": |
|
if not repo_name: |
|
raise ValueError("Missing parameter: repo_name") |
|
repo = user.get_repo(repo_name) |
|
issues = repo.get_issues(state='closed') |
|
if not issues: |
|
return f"No closed issues in repository **`{repo_name}`**." |
|
issues_list = "\n".join([f"- [{issue.title}]({issue.html_url})" for issue in issues]) |
|
return f"Closed issues in repository **`{repo_name}`**:\n{issues_list}" |
|
|
|
elif action == "get_issue_details": |
|
if not all([repo_name, issue_number]): |
|
raise ValueError("Missing parameters: repo_name, issue_number") |
|
repo = user.get_repo(repo_name) |
|
issue = repo.get_issue(number=int(issue_number)) |
|
comments = issue.get_comments() |
|
details = f""" |
|
**Issue #{issue.number}: {issue.title}** |
|
State: {issue.state} |
|
Created At: {issue.created_at} |
|
Author: {issue.user.login} |
|
|
|
**Body:** |
|
{issue.body} |
|
|
|
**Comments:** |
|
""" |
|
if comments: |
|
for comment in comments: |
|
details += f""" |
|
--- |
|
**{comment.user.login}** at {comment.created_at}: |
|
{comment.body} |
|
""" |
|
else: |
|
details += "No comments." |
|
|
|
return details |
|
|
|
else: |
|
raise ValueError(f"Unknown action: {action}") |
|
|
|
except GithubException as e: |
|
return f"**GitHub Error:** {e}" |
|
except ValueError as e: |
|
return f"**Error:** {e}" |
|
except requests.exceptions.RequestException as e: |
|
return f"**Connection Error:** {e}" |
|
except Exception as e: |
|
return f"**Unexpected Error:** {e}" |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# GitHub Tool Plugingit (Simplified Interface)") |
|
|
|
with gr.Column(): |
|
action = gr.Dropdown( |
|
choices=[ |
|
"import_repository", "create_repository", "create_project_from_template", |
|
"create_file", "get_file", "get_file_content_by_url", |
|
"delete_file", "update_file", "update_file_diff", |
|
"list_branches", "create_branch", "delete_branch", |
|
"create_pull_request", "list_open_pull_requests", |
|
"create_issue", "list_issues", "list_closed_issues", "get_issue_details", |
|
"add_label_to_issue", "close_issue", "add_comment_to_issue", |
|
"create_release", "list_releases", |
|
"fork_repository", "list_forks", |
|
"list_files", "get_repository_info", |
|
"analyze_repository_by_url", "analyze_repository_content", |
|
"delete_repository", "update_repository_description", "edit_issue" |
|
], |
|
label="Select Action", |
|
) |
|
repo_name = gr.Textbox(label="Repository Name") |
|
template_name = gr.Dropdown( |
|
choices=[""] + list(PROJECT_TEMPLATES.keys()), |
|
label="Project Template", |
|
value="", |
|
allow_custom_value=True, |
|
) |
|
template_params_ui = {} |
|
with gr.Row(): |
|
for template_key, template_config in PROJECT_TEMPLATES.items(): |
|
if "params" in template_config: |
|
with gr.Column(visible=False, elem_classes=f"params_{template_key}") as params_section: |
|
for param_name, param_details in template_config["params"].items(): |
|
if param_details["type"] == "choice": |
|
template_params_ui[param_name] = gr.Dropdown( |
|
choices=param_details["choices"], |
|
label=param_details["description"] or param_name, |
|
value=param_details["default"] |
|
) |
|
else: |
|
template_params_ui[param_name] = gr.Textbox( |
|
label=param_details["description"] or param_name, |
|
value=param_details["default"] if "default" in param_details else "" |
|
) |
|
template_params_ui[template_key] = params_section |
|
|
|
branch = gr.Textbox(label="Branch", value="main") |
|
path = gr.Textbox(label="File Path") |
|
content = gr.Code(label="File Content", lines=5, language='python', visible=True) |
|
diff = gr.Code(label="Diff Content", lines=5, language='diff', visible=False) |
|
message = gr.Textbox(label="Message/Comment", visible=True) |
|
diff_message = gr.Textbox(label="Diff Message", visible=False) |
|
owner = gr.Textbox(label="Owner") |
|
vcs_url = gr.Textbox(label="VCS URL") |
|
title = gr.Textbox(label="Title") |
|
body = gr.Textbox(label="Body") |
|
base = gr.Textbox(label="Base Branch") |
|
head = gr.Textbox(label="Head Branch/New Branch") |
|
issue_number = gr.Number(label="Issue Number", precision=0) |
|
labels = gr.Textbox(label="Labels (comma-separated)") |
|
tag = gr.Textbox(label="Tag") |
|
release_name = gr.Textbox(label="Release Name") |
|
file_url = gr.Textbox(label="File URL") |
|
repo_url = gr.Textbox(label="Repository URL") |
|
new_description = gr.Textbox(label="New Repository Description", visible=False) |
|
issue_title = gr.Textbox(label="New Issue Title", visible=False) |
|
issue_body = gr.Textbox(label="New Issue Body", visible=False, lines=3) |
|
issue_state = gr.Dropdown(label="New Issue State (open/closed)", choices=["open", "closed", None], value=None, allow_none=True, visible=False) |
|
|
|
def show_template_params(template_name): |
|
visibility_map = {key: gr.Column.update(visible=False) for key in PROJECT_TEMPLATES if |
|
"params" in PROJECT_TEMPLATES[key]} |
|
if template_name and template_name in PROJECT_TEMPLATES and "params" in PROJECT_TEMPLATES[template_name]: |
|
visibility_map[template_name] = gr.Column.update(visible=True) |
|
return [visibility_map.get(key, gr.Column.update(visible=False)) for key in PROJECT_TEMPLATES if |
|
"params" in PROJECT_TEMPLATES[key]] |
|
|
|
template_param_visibility_outputs = [template_params_ui[key] for key in PROJECT_TEMPLATES if |
|
"params" in PROJECT_TEMPLATES[key]] |
|
template_name.change( |
|
show_template_params, |
|
inputs=[template_name], |
|
outputs=template_param_visibility_outputs |
|
) |
|
|
|
run_button = gr.Button("Execute") |
|
output = gr.Markdown(label="Result") |
|
|
|
input_components = [ |
|
action, repo_name, branch, path, content, message, owner, vcs_url, title, body, base, head, issue_number, |
|
labels, tag, release_name, file_url, repo_url, template_name, new_description, issue_title, issue_body, |
|
issue_state, diff, diff_message |
|
] |
|
|
|
for template_key in PROJECT_TEMPLATES: |
|
if "params" in PROJECT_TEMPLATES[template_key]: |
|
for param_name in template_params_ui: |
|
if param_name in PROJECT_TEMPLATES[template_key]["params"]: |
|
input_components.append(template_params_ui[param_name]) |
|
|
|
def show_hide_input_fields(action_name): |
|
visibility_map = { |
|
"repo_name": gr.Textbox.update(visible=False), |
|
"branch": gr.Textbox.update(visible=False), |
|
"path": gr.Textbox.update(visible=False), |
|
"content": gr.Code.update(visible=False), |
|
"diff": gr.Code.update(visible=False), |
|
"message": gr.Textbox.update(visible=False), |
|
"diff_message": gr.Textbox.update(visible=False), |
|
"owner": gr.Textbox.update(visible=False), |
|
"vcs_url": gr.Textbox.update(visible=False), |
|
"title": gr.Textbox.update(visible=False), |
|
"body": gr.Textbox.update(visible=False), |
|
"base": gr.Textbox.update(visible=False), |
|
"head": gr.Textbox.update(visible=False), |
|
"issue_number": gr.Number.update(visible=False), |
|
"labels": gr.Textbox.update(visible=False), |
|
"tag": gr.Textbox.update(visible=False), |
|
"release_name": gr.Textbox.update(visible=False), |
|
"file_url": gr.Textbox.update(visible=False), |
|
"repo_url": gr.Textbox.update(visible=False), |
|
"template_name": gr.Dropdown.update(visible=False), |
|
"new_description": gr.Textbox.update(visible=False), |
|
"issue_title": gr.Textbox.update(visible=False), |
|
"issue_body": gr.Textbox.update(visible=False), |
|
"issue_state": gr.Dropdown.update(visible=False), |
|
} |
|
|
|
if action_name in ["import_repository"]: |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "owner": gr.Textbox.update(visible=True), "vcs_url": gr.Textbox.update(visible=True)}) |
|
elif action_name in ["create_repository", "delete_repository", "list_branches", "list_open_pull_requests", "list_issues", "list_closed_issues", "list_releases", "list_forks"]: |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True)}) |
|
elif action_name == "create_project_from_template": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "template_name": gr.Dropdown.update(visible=True)}) |
|
elif action_name in ["create_file", "get_file", "delete_file", "get_file_content"]: |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "path": gr.Textbox.update(visible=True), "branch": gr.Textbox.update(visible=True)}) |
|
if action_name == "create_file": |
|
visibility_map.update({"content": gr.Code.update(visible=True), "message": gr.Textbox.update(visible=True)}) |
|
elif action_name == "update_file": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "path": gr.Textbox.update(visible=True), "branch": gr.Textbox.update(visible=True), "content": gr.Code.update(visible=True), "message": gr.Textbox.update(visible=True)}) |
|
elif action_name == "update_file_diff": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "path": gr.Textbox.update(visible=True), "branch": gr.Textbox.update(visible=True), "diff": gr.Code.update(visible=True), "diff_message": gr.Textbox.update(visible=True)}) |
|
elif action_name == "get_file_content_by_url": |
|
visibility_map.update({"file_url": gr.Textbox.update(visible=True)}) |
|
elif action_name in ["create_branch", "delete_branch"]: |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "branch": gr.Textbox.update(visible=True)}) |
|
if action_name == "create_branch": |
|
visibility_map.update({"base": gr.Textbox.update(visible=True), "head": gr.Textbox.update(visible=True)}) |
|
elif action_name == "create_pull_request": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "title": gr.Textbox.update(visible=True), "body": gr.Textbox.update(visible=True), "base": gr.Textbox.update(visible=True), "head": gr.Textbox.update(visible=True)}) |
|
elif action_name == "create_issue": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "title": gr.Textbox.update(visible=True), "body": gr.Textbox.update(visible=True)}) |
|
elif action_name == "add_label_to_issue": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "issue_number": gr.Number.update(visible=True), "labels": gr.Textbox.update(visible=True)}) |
|
elif action_name in ["close_issue", "add_comment_to_issue", "get_issue_details", "edit_issue"]: |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "issue_number": gr.Number.update(visible=True)}) |
|
if action_name == "add_comment_to_issue": |
|
visibility_map.update({"message": gr.Textbox.update(visible=True)}) |
|
if action_name == "edit_issue": |
|
visibility_map.update({"issue_title": gr.Textbox.update(visible=True), "issue_body": gr.Textbox.update(visible=True), "issue_state": gr.Dropdown.update(visible=True)}) |
|
elif action_name == "create_release": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "tag": gr.Textbox.update(visible=True), "release_name": gr.Textbox.update(visible=True), "message": gr.Textbox.update(visible=True)}) |
|
elif action_name == "fork_repository": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True)}) |
|
elif action_name in ["list_files", "get_repository_info", "analyze_repository_content"]: |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "owner": gr.Textbox.update(visible=True)}) |
|
elif action_name == "analyze_repository_by_url": |
|
visibility_map.update({"repo_url": gr.Textbox.update(visible=True)}) |
|
elif action_name == "update_repository_description": |
|
visibility_map.update({"repo_name": gr.Textbox.update(visible=True), "new_description": gr.Textbox.update(visible=True)}) |
|
|
|
|
|
return [visibility_map.get(key, gr.Textbox.update(visible=False)) for key in visibility_map] |
|
|
|
output_components_visibility = [ |
|
repo_name, branch, path, content, message, owner, vcs_url, title, body, base, head, issue_number, labels, |
|
tag, release_name, file_url, repo_url, template_name, new_description, issue_title, issue_body, |
|
issue_state, diff, diff_message |
|
] |
|
|
|
action.change( |
|
show_hide_input_fields, |
|
inputs=[action], |
|
outputs=output_components_visibility |
|
) |
|
|
|
|
|
run_button.click( |
|
github_tool, |
|
inputs=input_components, |
|
outputs=output, |
|
api_name="github_tool" |
|
) |
|
|
|
demo.launch() |