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.
 

187 lines
6.0 KiB

'use strict';
import { commands, ExtensionContext, extensions, window, workspace } from 'vscode';
import { Commands, registerCommands } from './commands';
import { ViewShowBranchComparison } from './config';
import { configuration, Configuration } from './configuration';
import { CommandContext, extensionQualifiedId, GlobalState, GlyphChars, setCommandContext } from './constants';
import { Container } from './container';
import { Git, GitCommit } from './git/git';
import { GitService } from './git/gitService';
import { GitUri } from './git/gitUri';
import { Logger } from './logger';
import { Messages } from './messages';
import { Strings, Versions } from './system';
import { ViewNode } from './views/nodes';
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
void setCommandContext(CommandContext.Enabled, true);
Logger.configure(context, configuration.get('outputLevel'), 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}` : ''})`;
}
if (ViewNode.is(o)) {
return o.toString();
}
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`);
void setCommandContext(CommandContext.Enabled, false);
void Messages.showGitDisabledErrorMessage();
return;
}
Configuration.configure(context);
const cfg = configuration.get();
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`);
void setCommandContext(CommandContext.Enabled, false);
const msg: string = ex?.message ?? '';
if (msg.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 = Git.getGitVersion();
notifyOnUnsupportedGitVersion(gitVersion);
void showWelcomeOrWhatsNew(gitlensVersion, previousVersion);
void context.globalState.update(GlobalState.GitLensVersion, gitlensVersion);
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 value = configuration.get('views', 'commitFormat');
if (!/\btips\b/.test(value)) {
await configuration.updateEffective('views', 'commitFormat', `\${ tips }${value}`);
}
} else if (Versions.compare(previous, Versions.from(9, 8, 2)) !== 1) {
const name = configuration.name('views', 'repositories', 'showBranchComparison');
await configuration.migrate(name, 'views', 'repositories', 'showBranchComparison', {
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'),
configuration.name('currentLine', 'format'),
configuration.name('hovers', 'detailsMarkdownFormat'),
configuration.name('statusBar', 'format'),
configuration.name('views', 'commitFormat'),
configuration.name('views', 'commitDescriptionFormat'),
configuration.name('views', 'stashFormat'),
configuration.name('views', 'stashDescriptionFormat'),
].map(s =>
configuration.migrate(s, s as any, {
migrationFn: formatMigrationFn,
}),
),
);
}
} catch (ex) {
Logger.error(ex, 'migrateSettings');
}
}
function notifyOnUnsupportedGitVersion(version: string) {
if (GitService.compareGitVersion('2.7.2') !== -1) return;
// If git is less than v2.7.2
void Messages.showGitVersionUnsupportedErrorMessage(version, '2.7.2');
}
async function showWelcomeOrWhatsNew(version: string, previousVersion: string | undefined) {
if (previousVersion === undefined) {
Logger.log('GitLens first-time install');
await commands.executeCommand(Commands.ShowWelcomePage);
return;
}
if (previousVersion !== version) {
Logger.log(`GitLens upgraded from v${previousVersion} to v${version}`);
}
const [major, minor] = version.split('.').map(v => parseInt(v, 10));
const [prevMajor, prevMinor] = previousVersion.split('.').map(v => parseInt(v, 10));
if (
(major === prevMajor && minor === prevMinor) ||
// Don't notify on downgrades
major < prevMajor ||
(major === prevMajor && minor < prevMinor)
) {
return;
}
// Show the Welcome for v10 since its all new
if (major !== prevMajor && major === 10) {
await commands.executeCommand(Commands.ShowWelcomePage);
}
if (Container.config.showWhatsNewAfterUpgrades && major !== prevMajor) {
await Messages.showWhatsNewMessage(version);
}
}