-
Notifications
You must be signed in to change notification settings - Fork 624
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Support GitHub Enterprise Server URL pattern #1270
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,4 +1,5 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import itertools | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import re | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import time | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import hashlib | ||||||||||||||||||||||||||||||||||||||||||||||||||||
from datetime import datetime | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -28,7 +29,14 @@ def __init__(self, pr_url: Optional[str] = None): | |||||||||||||||||||||||||||||||||||||||||||||||||||
self.installation_id = None | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.max_comment_chars = 65000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.base_url = get_settings().get("GITHUB.BASE_URL", "https://api.github.com").rstrip("/") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.base_url_html = self.base_url.split("api/")[0].rstrip("/") if "api/" in self.base_url else "https://github.com" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if self.base_url.endswith("/api/v3"): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# enterprise server with api/v3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.base_url_html = self.base_url[:len("/api/v3")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||
elif self.base_url == "https://api.github.com": | ||||||||||||||||||||||||||||||||||||||||||||||||||||
# github cloud | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.base_url_html = "https://github.com" | ||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.base_url_html = self.base_url | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.base_domain = self.base_url.replace("https://", "").replace("http://", "") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.base_domain_html = self.base_url_html.replace("https://", "").replace("http://", "") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
self.github_client = self._get_github_client() | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -611,51 +619,35 @@ def remove_reaction(self, issue_comment_id: int, reaction_id: str) -> bool: | |||||||||||||||||||||||||||||||||||||||||||||||||||
def _parse_pr_url(self, pr_url: str) -> Tuple[str, int]: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
parsed_url = urlparse(pr_url) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
path_parts = parsed_url.path.strip('/').split('/') | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if self.base_domain in parsed_url.netloc: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(path_parts) < 5 or path_parts[3] != 'pulls': | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("The provided URL does not appear to be a GitHub PR URL") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
repo_name = '/'.join(path_parts[1:3]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
pattern = r'/repos/([^/]+/[^/]+)/pulls?/(\d+)' | ||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. would this format support
for example ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We would like to support a format such as: In GitHub Enterprise Server, the API URLs include the
This approach does not account for the For more information on the URL structure, refer to the GitHub Enterprise Server documentation: pr-agent/pr_agent/servers/github_action_runner.py Lines 91 to 115 in ada0a3d
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. if this PR won't provide complete and total support also for regular github, it cannot be merged. All the issues I stated above should be addressed and fixed. For example, currently |
||||||||||||||||||||||||||||||||||||||||||||||||||||
match = re.match(pattern, parsed_url.path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if match: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
repo_name = match.group(1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
pr_number = int(path_parts[4]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
pr_number = int(match.group(2)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
except ValueError as e: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("Unable to convert PR number to integer") from e | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return repo_name, pr_number | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(path_parts) < 4 or path_parts[2] != 'pull': | ||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("The provided URL does not appear to be a GitHub PR URL") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
repo_name = '/'.join(path_parts[:2]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
pr_number = int(path_parts[3]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
except ValueError as e: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("Unable to convert PR number to integer") from e | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
return repo_name, pr_number | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
def _parse_issue_url(self, issue_url: str) -> Tuple[str, int]: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
parsed_url = urlparse(issue_url) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
path_parts = parsed_url.path.strip('/').split('/') | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if self.base_domain in parsed_url.netloc: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(path_parts) < 5 or path_parts[3] != 'issues': | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("The provided URL does not appear to be a GitHub ISSUE URL") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
repo_name = '/'.join(path_parts[1:3]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
path = parsed_url.path | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
pattern = r'/repos/([^/]+/[^/]+)/issues/(\d+)' | ||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. would this format support:
for example |
||||||||||||||||||||||||||||||||||||||||||||||||||||
match = re.match(pattern, path) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if match: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
repo_name = match.group(1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
issue_number = int(path_parts[4]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
issue_number = int(match.group(2)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
except ValueError as e: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("Unable to convert issue number to integer") from e | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return repo_name, issue_number | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if len(path_parts) < 4 or path_parts[2] != 'issues': | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("The provided URL does not appear to be a GitHub PR issue") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
repo_name = '/'.join(path_parts[:2]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
issue_number = int(path_parts[3]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
except ValueError as e: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("Unable to convert issue number to integer") from e | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
return repo_name, issue_number | ||||||||||||||||||||||||||||||||||||||||||||||||||||
else: | ||||||||||||||||||||||||||||||||||||||||||||||||||||
raise ValueError("The provided URL does not appear to be a GitHub issue URL") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
def _get_github_client(self): | ||||||||||||||||||||||||||||||||||||||||||||||||||||
deployment_type = get_settings().get("GITHUB.DEPLOYMENT_TYPE", "user") | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
explain this change.
why is it needed ?
Give concrete examples - what didn't work before, and is working now due to this change ?