in src/extension.ts [44:228]
async function init(
context: vscode.ExtensionContext,
git: GitApiImpl,
credentialStore: CredentialStore,
repositories: Repository[],
tree: PullRequestsTreeDataProvider,
liveshareApiPromise: Promise<LiveShare | undefined>,
showPRController: ShowPullRequest
): Promise<void> {
context.subscriptions.push(Logger);
Logger.appendLine('Git repository found, initializing review manager and pr tree view.');
vscode.authentication.onDidChangeSessions(async e => {
if (e.provider.id === 'github') {
await reposManager.clearCredentialCache();
if (reviewManagers) {
reviewManagers.forEach(reviewManager => reviewManager.updateState(true));
}
}
});
context.subscriptions.push(
git.onDidPublish(async e => {
// Only notify on branch publish events
if (!e.branch || PersistentState.fetch(PROMPTS_SCOPE, PROMPT_TO_CREATE_PR_ON_PUBLISH_KEY) === false) {
return;
}
const reviewManager = reviewManagers.find(
manager => manager.repository.rootUri.toString() === e.repository.rootUri.toString(),
);
if (reviewManager?.isCreatingPullRequest) {
return;
}
const folderManager = folderManagers.find(
manager => manager.repository.rootUri.toString() === e.repository.rootUri.toString());
if (!folderManager || folderManager.gitHubRepositories.length === 0) {
return;
}
const defaults = await folderManager.getPullRequestDefaults();
if (defaults.base === e.branch) {
return;
}
const create = 'Create Pull Request...';
const dontShowAgain = "Don't Show Again";
const result = await vscode.window.showInformationMessage(
`Would you like to create a Pull Request for branch '${e.branch}'?`,
create,
dontShowAgain,
);
if (result === create) {
reviewManager?.createPullRequest(e.branch);
} else if (result === dontShowAgain) {
PersistentState.store(PROMPTS_SCOPE, PROMPT_TO_CREATE_PR_ON_PUBLISH_KEY, false);
}
}),
);
context.subscriptions.push(vscode.window.registerUriHandler(uriHandler));
context.subscriptions.push(new FileTypeDecorationProvider());
// Sort the repositories to match folders in a multiroot workspace (if possible).
const workspaceFolders = vscode.workspace.workspaceFolders;
if (workspaceFolders) {
repositories = repositories.sort((a, b) => {
let indexA = workspaceFolders.length;
let indexB = workspaceFolders.length;
for (let i = 0; i < workspaceFolders.length; i++) {
if (workspaceFolders[i].uri.toString() === a.rootUri.toString()) {
indexA = i;
} else if (workspaceFolders[i].uri.toString() === b.rootUri.toString()) {
indexB = i;
}
if (indexA !== workspaceFolders.length && indexB !== workspaceFolders.length) {
break;
}
}
return indexA - indexB;
});
}
const sessionState = new SessionState(context);
const folderManagers = repositories.map(
repository => new FolderRepositoryManager(context, repository, telemetry, git, credentialStore, sessionState),
);
context.subscriptions.push(...folderManagers);
const reposManager = new RepositoriesManager(folderManagers, credentialStore, telemetry, sessionState);
context.subscriptions.push(reposManager);
liveshareApiPromise.then(api => {
if (api) {
// register the pull request provider to suggest PR contacts
api.registerContactServiceProvider('github-pr', new GitHubContactServiceProvider(reposManager));
}
});
const changesTree = new PullRequestChangesTreeDataProvider(context);
context.subscriptions.push(changesTree);
const reviewManagers = folderManagers.map(
folderManager => new ReviewManager(context, folderManager.repository, folderManager, telemetry, changesTree, showPRController, sessionState),
);
const reviewsManager = new ReviewsManager(context, reposManager, reviewManagers, tree, changesTree, telemetry, git);
context.subscriptions.push(reviewsManager);
git.onDidChangeState(() => {
Logger.appendLine(`Git initialization state changed: state=${git.state}`);
reviewManagers.forEach(reviewManager => reviewManager.updateState(true));
});
git.onDidOpenRepository(repo => {
function addRepo() {
// Make sure we don't already have a folder manager for this repo.
const existing = reposManager.getManagerForFile(repo.rootUri);
if (existing) {
Logger.appendLine(`Repo ${repo.rootUri} has already been setup.`);
return;
}
const newFolderManager = new FolderRepositoryManager(context, repo, telemetry, git, credentialStore, sessionState);
reposManager.insertFolderManager(newFolderManager);
const newReviewManager = new ReviewManager(
context,
newFolderManager.repository,
newFolderManager,
telemetry,
changesTree,
showPRController,
sessionState
);
reviewManagers.push(newReviewManager);
tree.refresh();
}
addRepo();
const disposable = repo.state.onDidChange(() => {
Logger.appendLine(`Repo state for ${repo.rootUri} changed.`);
addRepo();
disposable.dispose();
});
});
git.onDidCloseRepository(repo => {
reposManager.removeRepo(repo);
const reviewManagerIndex = reviewManagers.findIndex(
manager => manager.repository.rootUri.toString() === repo.rootUri.toString(),
);
if (reviewManagerIndex) {
const manager = reviewManagers[reviewManagerIndex];
reviewManagers.splice(reviewManagerIndex);
manager.dispose();
}
tree.refresh();
});
tree.initialize(reposManager);
setSyncedKeys(context);
registerCommands(context, sessionState, reposManager, reviewManagers, telemetry, credentialStore, tree);
const layout = vscode.workspace.getConfiguration(SETTINGS_NAMESPACE).get<string>(FILE_LIST_LAYOUT);
await vscode.commands.executeCommand('setContext', 'fileListLayout:flat', layout === 'flat');
const issuesFeatures = new IssueFeatureRegistrar(git, reposManager, reviewManagers, context, telemetry);
context.subscriptions.push(issuesFeatures);
await issuesFeatures.initialize();
context.subscriptions.push(new GitLensIntegration());
await vscode.commands.executeCommand('setContext', 'github:initialized', true);
const experimentationService = await createExperimentationService(context, telemetry);
await experimentationService.initializePromise;
await experimentationService.isCachedFlightEnabled('githubaa');
/* __GDPR__
"startup" : {}
*/
telemetry.sendTelemetryEvent('startup');
}