You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

200 lines
7.4 KiB

'use strict';
import { commands, ExtensionContext, extensions, window, workspace } from 'vscode';
import { Commands, registerCommands } from './commands';
import { ViewShowBranchComparison } from './config';
import { Config, configuration, Configuration } from './configuration';
import { CommandContext, extensionQualifiedId, GlobalState, GlyphChars, setCommandContext } from './constants';
import { Container } from './container';
import { GitCommit, GitService, GitUri } from './git/gitService';
import { Logger, TraceLevel } from './logger';
import { Messages } from './messages';
import { Strings, Versions } from './system';
// import { Telemetry } from './telemetry';
export async function activate(context: ExtensionContext) {
const start = process.hrtime();
// Pretend we are enabled (until we know otherwise) and set the view contexts to reduce flashing on load
setCommandContext(CommandContext.Enabled, true);
Logger.configure(context, configuration.get<TraceLevel>(configuration.name('outputLevel').value), o => {
if (GitUri.is(o)) {
return `GitUri(${o.toString(true)}${o.repoPath ? ` repoPath=${o.repoPath}` : ''}${
o.sha ? ` sha=${o.sha}` : ''
})`;
}
if (GitCommit.is(o)) {
return `GitCommit(${o.sha ? ` sha=${o.sha}` : ''}${o.repoPath ? ` repoPath=${o.repoPath}` : ''})`;
}
return undefined;
});
const gitlens = extensions.getExtension(extensionQualifiedId)!;
const gitlensVersion = gitlens.packageJSON.version;
const enabled = workspace.getConfiguration('git', null!).get<boolean>('enabled', true);
if (!enabled) {
Logger.log(`GitLens (v${gitlensVersion}) was NOT activated -- "git.enabled": false`);
setCommandContext(CommandContext.Enabled, false);
void Messages.showGitDisabledErrorMessage();
return;
}
Configuration.configure(context);
const cfg = configuration.get<Config>();
const previousVersion = context.globalState.get<string>(GlobalState.GitLensVersion);
await migrateSettings(context, previousVersion);
try {
await GitService.initialize();
}
catch (ex) {
Logger.error(ex, `GitLens (v${gitlensVersion}) activate`);
setCommandContext(CommandContext.Enabled, false);
if (ex.message.includes('Unable to find git')) {
await window.showErrorMessage(
"GitLens was unable to find Git. Please make sure Git is installed. Also ensure that Git is either in the PATH, or that 'git.path' is pointed to its installed location."
);
}
return;
}
Container.initialize(context, cfg);
registerCommands(context);
const gitVersion = GitService.getGitVersion();
// Telemetry.configure(ApplicationInsightsKey);
// const telemetryContext: { [id: string]: any } = Object.create(null);
// telemetryContext.version = gitlensVersion;
// telemetryContext['git.version'] = gitVersion;
// Telemetry.setContext(telemetryContext);
notifyOnUnsupportedGitVersion(gitVersion);
void showWelcomePage(gitlensVersion, previousVersion);
context.globalState.update(GlobalState.GitLensVersion, gitlensVersion);
// Constantly over my data cap so stop collecting initialized event
// Telemetry.trackEvent('initialized', Objects.flatten(cfg, 'config', true));
Logger.log(
`GitLens (v${gitlensVersion}${cfg.mode.active ? `, mode: ${cfg.mode.active}` : ''}) activated ${
GlyphChars.Dot
} ${Strings.getDurationMilliseconds(start)} ms`
);
}
export function deactivate() {
// nothing to do
}
async function migrateSettings(context: ExtensionContext, previousVersion: string | undefined) {
if (previousVersion === undefined) return;
const previous = Versions.fromString(previousVersion);
try {
if (Versions.compare(previous, Versions.from(9, 8, 5)) !== 1) {
const name = configuration.name('views')('commitFormat').value;
const value = configuration.get<string>(name);
if (!/\btips\b/.test(value)) {
await configuration.updateEffective(name, `\${ tips }${value}`);
}
}
else if (Versions.compare(previous, Versions.from(9, 8, 2)) !== 1) {
const name = configuration.name('views')('repositories')('showBranchComparison').value;
await configuration.migrate(name, name, {
migrationFn: (v: boolean) => (v === false ? false : ViewShowBranchComparison.Working)
});
}
else if (Versions.compare(previous, Versions.from(9, 6, 3)) !== 1) {
const formatMigrationFn = (v: string) => {
if (v == null || v.length === 0) return v;
return (
v
// eslint-disable-next-line no-template-curly-in-string
.replace(/\$\{authorAgo\}/g, '${author}, ${ago}')
// eslint-disable-next-line no-template-curly-in-string
.replace(/\$\{authorAgoOrDate\}/g, '${author}, ${agoOrDate}')
);
};
await Promise.all(
[
configuration.name('blame')('format').value,
configuration.name('currentLine')('format').value,
configuration.name('hovers')('detailsMarkdownFormat').value,
configuration.name('statusBar')('format').value,
configuration.name('views')('commitFormat').value,
configuration.name('views')('commitDescriptionFormat').value,
configuration.name('views')('stashFormat').value,
configuration.name('views')('stashDescriptionFormat').value
].map(s =>
configuration.migrate<string, string>(s, s, {
migrationFn: formatMigrationFn
})
)
);
}
}
catch (ex) {
Logger.error(ex, 'migrateSettings');
}
}
function notifyOnUnsupportedGitVersion(version: string) {
if (GitService.compareGitVersion('2.2.0') !== -1) return;
// If git is less than v2.2.0
void Messages.showGitVersionUnsupportedErrorMessage(version);
}
async function showWelcomePage(version: string, previousVersion: string | undefined) {
try {
if (previousVersion === undefined) {
Logger.log('GitLens first-time install');
if (Container.config.showWhatsNewAfterUpgrades) {
await commands.executeCommand(Commands.ShowWelcomePage);
}
return;
}
if (previousVersion !== version) {
Logger.log(`GitLens upgraded from v${previousVersion} to v${version}`);
}
const [major, minor] = version.split('.');
const [prevMajor, prevMinor] = previousVersion.split('.');
if (
(major === prevMajor && minor === prevMinor) ||
// Don't notify on downgrades
(major < prevMajor || (major === prevMajor && minor < prevMinor))
) {
return;
}
if (Container.config.showWhatsNewAfterUpgrades && major !== prevMajor) {
await commands.executeCommand(Commands.ShowWelcomePage);
}
else {
await Messages.showWhatsNewMessage(version);
}
}
finally {
void (await Messages.showSetupViewLayoutMessage(previousVersion));
}
}