1- import { TreeViewExpansionEvent , window , workspace } from "vscode" ;
2- import { commandRunner } from "../../commandRunner" ;
1+ import {
2+ QuickPickItem ,
3+ TreeViewExpansionEvent ,
4+ window ,
5+ workspace ,
6+ } from "vscode" ;
7+ import { commandRunner , UserCancellationException } from "../../commandRunner" ;
8+ import {
9+ getNwoFromGitHubUrl ,
10+ validGitHubNwo ,
11+ getOwnerFromGitHubUrl ,
12+ validGitHubOwner ,
13+ } from "../../common/github-url-identifier-helper" ;
314import { showAndLogErrorMessage } from "../../helpers" ;
415import { DisposableObject } from "../../pure/disposable-object" ;
516import { DbManager } from "../db-manager" ;
617import { DbTreeDataProvider } from "./db-tree-data-provider" ;
718import { DbTreeViewItem } from "./db-tree-view-item" ;
819
20+ interface RemoteDatabaseQuickPickItem extends QuickPickItem {
21+ kind : string ;
22+ }
23+
924export class DbPanel extends DisposableObject {
1025 private readonly dataProvider : DbTreeDataProvider ;
1126
@@ -39,6 +54,11 @@ export class DbPanel extends DisposableObject {
3954 this . openConfigFile ( ) ,
4055 ) ,
4156 ) ;
57+ this . push (
58+ commandRunner ( "codeQLDatabasesExperimental.addNewDatabase" , ( ) =>
59+ this . addNewRemoteDatabase ( ) ,
60+ ) ,
61+ ) ;
4262 this . push (
4363 commandRunner ( "codeQLDatabasesExperimental.addNewList" , ( ) =>
4464 this . addNewRemoteList ( ) ,
@@ -58,6 +78,77 @@ export class DbPanel extends DisposableObject {
5878 await window . showTextDocument ( document ) ;
5979 }
6080
81+ private async addNewRemoteDatabase ( ) : Promise < void > {
82+ const quickPickItems = [
83+ {
84+ label : "$(repo) From a GitHub repository" ,
85+ detail : "Add a remote repository from GitHub" ,
86+ alwaysShow : true ,
87+ kind : "repo" ,
88+ } ,
89+ {
90+ label : "$(organization) All repositories of a GitHub org or owner" ,
91+ detail :
92+ "Add a remote list of repositories from a GitHub organization/owner" ,
93+ alwaysShow : true ,
94+ kind : "owner" ,
95+ } ,
96+ ] ;
97+ const databaseKind =
98+ await window . showQuickPick < RemoteDatabaseQuickPickItem > ( quickPickItems , {
99+ title : "Add a remote repository" ,
100+ placeHolder : "Select an option" ,
101+ ignoreFocusOut : true ,
102+ } ) ;
103+ if ( ! databaseKind ) {
104+ // We don't need to display a warning pop-up in this case, since the user just escaped out of the operation.
105+ // We set 'true' to make this a silent exception.
106+ throw new UserCancellationException ( "No repository selected" , true ) ;
107+ }
108+ if ( databaseKind . kind === "repo" ) {
109+ await this . addNewRemoteRepo ( ) ;
110+ } else if ( databaseKind . kind === "owner" ) {
111+ await this . addNewRemoteOwner ( ) ;
112+ }
113+ }
114+
115+ private async addNewRemoteRepo ( ) : Promise < void > {
116+ const repoName = await window . showInputBox ( {
117+ title : "Add a remote repository" ,
118+ prompt : "Insert a GitHub repository URL or name with owner" ,
119+ placeHolder : "github.com/<owner>/<repo> or <owner>/<repo>" ,
120+ } ) ;
121+ if ( ! repoName ) {
122+ return ;
123+ }
124+
125+ const nwo = getNwoFromGitHubUrl ( repoName ) || repoName ;
126+ if ( ! validGitHubNwo ( nwo ) ) {
127+ throw new Error ( `Invalid GitHub repository: ${ repoName } ` ) ;
128+ }
129+
130+ await this . dbManager . addNewRemoteRepo ( nwo ) ;
131+ }
132+
133+ private async addNewRemoteOwner ( ) : Promise < void > {
134+ const ownerName = await window . showInputBox ( {
135+ title : "Add all repositories of a GitHub org or owner" ,
136+ prompt : "Insert a GitHub organization or owner name" ,
137+ placeHolder : "github.com/<owner> or <owner>" ,
138+ } ) ;
139+
140+ if ( ! ownerName ) {
141+ return ;
142+ }
143+
144+ const owner = getOwnerFromGitHubUrl ( ownerName ) || ownerName ;
145+ if ( ! validGitHubOwner ( owner ) ) {
146+ throw new Error ( `Invalid user or organization: ${ owner } ` ) ;
147+ }
148+
149+ await this . dbManager . addNewRemoteOwner ( owner ) ;
150+ }
151+
61152 private async addNewRemoteList ( ) : Promise < void > {
62153 const listName = await window . showInputBox ( {
63154 prompt : "Enter a name for the new list" ,
0 commit comments