diff --git a/backend/alembic/versions/3934b1bc7b62_update_github_connector_repo_name_to_.py b/backend/alembic/versions/3934b1bc7b62_update_github_connector_repo_name_to_.py new file mode 100644 index 000000000..63b9bc05c --- /dev/null +++ b/backend/alembic/versions/3934b1bc7b62_update_github_connector_repo_name_to_.py @@ -0,0 +1,86 @@ +"""Update GitHub connector repo_name to repo_names + +Revision ID: 3934b1bc7b62 +Revises: b7c2b63c4a03 +Create Date: 2025-03-05 10:50:30.516962 + +""" +from alembic import op +import sqlalchemy as sa +import json + +# revision identifiers, used by Alembic. +revision = "3934b1bc7b62" +down_revision = "b7c2b63c4a03" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # Get all GitHub connectors + conn = op.get_bind() + + # First get all GitHub connectors + github_connectors = conn.execute( + sa.text( + """ + SELECT id, connector_specific_config + FROM connector + WHERE source = 'GITHUB' + """ + ) + ).fetchall() + + # Update each connector's config + for connector_id, config in github_connectors: + if not config or "repo_name" not in config: + continue + + # Create new config with repositories instead of repo_name + new_config = dict(config) + new_config["repositories"] = new_config.pop("repo_name") + + # Update the connector with the new config + conn.execute( + sa.text( + """ + UPDATE connector + SET connector_specific_config = :new_config + WHERE id = :connector_id + """ + ), + {"connector_id": connector_id, "new_config": json.dumps(new_config)}, + ) + + +def downgrade(): + # Get all GitHub connectors + conn = op.get_bind() + github_connectors = conn.execute( + sa.text( + """ + SELECT id, connector_specific_config + FROM connector + WHERE source = 'GITHUB' + """ + ) + ).fetchall() + + # Revert each GitHub connector to use repo_name instead of repositories + for connector_id, config in github_connectors: + if config and "repositories" in config: + # Create new config with repo_name instead of repositories + new_config = dict(config) + new_config["repo_name"] = new_config.pop("repositories") + + # Update the connector with the new config + conn.execute( + sa.text( + """ + UPDATE connector + SET connector_specific_config = :new_config + WHERE id = :connector_id + """ + ), + {"new_config": json.dumps(new_config), "connector_id": connector_id}, + ) diff --git a/backend/onyx/connectors/github/connector.py b/backend/onyx/connectors/github/connector.py index fedea749b..f26ad71b0 100644 --- a/backend/onyx/connectors/github/connector.py +++ b/backend/onyx/connectors/github/connector.py @@ -124,14 +124,14 @@ class GithubConnector(LoadConnector, PollConnector): def __init__( self, repo_owner: str, - repo_name: str | None = None, + repositories: str | None = None, batch_size: int = INDEX_BATCH_SIZE, state_filter: str = "all", include_prs: bool = True, include_issues: bool = False, ) -> None: self.repo_owner = repo_owner - self.repo_name = repo_name + self.repositories = repositories self.batch_size = batch_size self.state_filter = state_filter self.include_prs = include_prs @@ -157,7 +157,7 @@ class GithubConnector(LoadConnector, PollConnector): ) try: - return github_client.get_repo(f"{self.repo_owner}/{self.repo_name}") + return github_client.get_repo(f"{self.repo_owner}/{self.repositories}") except RateLimitExceededException: _sleep_after_rate_limit_exception(github_client) return self._get_github_repo(github_client, attempt_num + 1) @@ -174,7 +174,7 @@ class GithubConnector(LoadConnector, PollConnector): try: repos = [] # Split repo_name by comma and strip whitespace - repo_names = [name.strip() for name in self.repo_name.split(",")] + repo_names = [name.strip() for name in self.repositories.split(",")] for repo_name in repo_names: if repo_name: # Skip empty strings @@ -219,8 +219,8 @@ class GithubConnector(LoadConnector, PollConnector): raise ConnectorMissingCredentialError("GitHub") repos = [] - if self.repo_name: - if "," in self.repo_name: + if self.repositories: + if "," in self.repositories: # Multiple repositories specified repos = self._get_github_repos(self.github_client) else: @@ -303,10 +303,10 @@ class GithubConnector(LoadConnector, PollConnector): ) try: - if self.repo_name: - if "," in self.repo_name: + if self.repositories: + if "," in self.repositories: # Multiple repositories specified - repo_names = [name.strip() for name in self.repo_name.split(",")] + repo_names = [name.strip() for name in self.repositories.split(",")] if not repo_names: raise ConnectorValidationError( "Invalid connector settings: No valid repository names provided." @@ -342,7 +342,7 @@ class GithubConnector(LoadConnector, PollConnector): else: # Single repository (backward compatibility) test_repo = self.github_client.get_repo( - f"{self.repo_owner}/{self.repo_name}" + f"{self.repo_owner}/{self.repositories}" ) test_repo.get_contents("") else: @@ -370,14 +370,14 @@ class GithubConnector(LoadConnector, PollConnector): "Your GitHub token does not have sufficient permissions for this repository (HTTP 403)." ) elif e.status == 404: - if self.repo_name: - if "," in self.repo_name: + if self.repositories: + if "," in self.repositories: raise ConnectorValidationError( f"None of the specified GitHub repositories could be found for owner: {self.repo_owner}" ) else: raise ConnectorValidationError( - f"GitHub repository not found with name: {self.repo_owner}/{self.repo_name}" + f"GitHub repository not found with name: {self.repo_owner}/{self.repositories}" ) else: raise ConnectorValidationError( diff --git a/web/src/lib/connectors/connectors.tsx b/web/src/lib/connectors/connectors.tsx index 52bc4045d..4d3cb45fa 100644 --- a/web/src/lib/connectors/connectors.tsx +++ b/web/src/lib/connectors/connectors.tsx @@ -1360,7 +1360,7 @@ export interface WebConfig { export interface GithubConfig { repo_owner: string; - repo_name: string; // Can be a comma-separated list of repository names + repositories: string; // Comma-separated list of repository names include_prs: boolean; include_issues: boolean; }