3 Commits

Author SHA1 Message Date
Eric Amodio
535e627048 Preps v3.5.0-beta.2 2017-05-24 13:02:02 -04:00
Eric Amodio
8a74950708 Fixes #40 - encoding issues
This is only a partial fix, as vscode doesn't allow enough controls to fix everything
2017-05-24 12:52:47 -04:00
Eric Amodio
3502bdf6c7 Adds more linting rules
Fixes lint issues
2017-05-23 18:48:04 -04:00
35 changed files with 201 additions and 115 deletions

21
.vscode/tasks.json vendored
View File

@@ -9,24 +9,33 @@
// A task runner that calls a custom npm script that compiles the extension. // A task runner that calls a custom npm script that compiles the extension.
{ {
"version": "2.0.0", "version": "2.0.0",
"showOutput": "always", "showOutput": "silent",
"tasks": [ "tasks": [
{ {
"taskName": "compile", "taskName": "compile",
"command": "npm run compile", "command": "npm run compile --silent",
"isBuildCommand": true, "isBuildCommand": true,
"isShellCommand": true, "isShellCommand": true,
"problemMatcher": [ "$tsc", "$tslint5" ] "problemMatcher": [
"$tsc",
{
"base": "$tslint5",
"fileLocation": "relative"
}
]
}, },
{ {
"taskName": "lint", "taskName": "lint",
"command": "npm run lint", "command": "npm run lint --silent",
"isShellCommand": true, "isShellCommand": true,
"problemMatcher": "$tslint5" "problemMatcher": {
"base": "$tslint5",
"fileLocation": "relative"
}
}, },
{ {
"taskName": "watch", "taskName": "watch",
"command": "npm run watch", "command": "npm run watch --silent",
"isBackground": true, "isBackground": true,
"isShellCommand": true, "isShellCommand": true,
"problemMatcher": "$tsc-watch" "problemMatcher": "$tsc-watch"

View File

@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
## [3.5.0-beta.2] - 2017-05-23
### Fixed
- Fixes [#40](https://github.com/eamodio/vscode-gitlens/issues/40) - Encoding issues
- Given the limitations of the vscode api, I'm unable to fix all the encoding issues, but many of them should now be squashed
- `files.encoding` is now honored for the cases where the encoding cannot currently be gleaned
## [3.5.0-beta] - 2017-05-23 ## [3.5.0-beta] - 2017-05-23
### Added ### Added
- Improves performance - Improves performance
@@ -11,7 +17,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
- Caches many more git commands to reduce git command roundtrips and parsing - Caches many more git commands to reduce git command roundtrips and parsing
- Increases the debounce (delay) on cursor movement to reduce lag when navigating around a file - Increases the debounce (delay) on cursor movement to reduce lag when navigating around a file
- Adds diff information (previous line's code) into the active line hover when the current line is uncommitted - Adds diff information (previous line's code) into the active line hover when the current line is uncommitted
- Adds `gitlens.statusBar.alignment` settings to control the alignment of the status bar -- thanks to Zack Schuster (@zackschuster)! - Adds `gitlens.statusBar.alignment` settings to control the alignment of the status bar -- thanks to [PR #72](https://github.com/eamodio/vscode-gitlens/pull/72) by Zack Schuster ([@zackschuster](https://github.com/zackschuster))!
- Adds `Open Branch in Remote` command (`gitlens.openBranchInRemote`) - opens the current branch commits in the supported remote service - Adds `Open Branch in Remote` command (`gitlens.openBranchInRemote`) - opens the current branch commits in the supported remote service
- Adds `Open Repository in Remote` command (`gitlens.openRepoInRemote`) - opens the repository in the supported remote service - Adds `Open Repository in Remote` command (`gitlens.openRepoInRemote`) - opens the repository in the supported remote service
- Adds support to the `Search commits` command (`gitlens.showCommitSearch`) to work without any active editor - Adds support to the `Search commits` command (`gitlens.showCommitSearch`) to work without any active editor

View File

@@ -219,3 +219,10 @@ GitLens is highly customizable and provides many configuration settings to allow
- If the `Copy to * clipboard` commands don't work on Linux -- `xclip` needs to be installed. You can install it via `sudo apt-get install xclip` - If the `Copy to * clipboard` commands don't work on Linux -- `xclip` needs to be installed. You can install it via `sudo apt-get install xclip`
- Visible whitespace causes issues ([vscode issue #11485](https://github.com/Microsoft/vscode/issues/11485)) with the `expanded` and `compact` blame annotation styles when using a non-monospace font -- set `"gitlens.advanced.toggleWhitespace.enabled": true` if you are using a non-monospace font - Visible whitespace causes issues ([vscode issue #11485](https://github.com/Microsoft/vscode/issues/11485)) with the `expanded` and `compact` blame annotation styles when using a non-monospace font -- set `"gitlens.advanced.toggleWhitespace.enabled": true` if you are using a non-monospace font
## Contributors
A big thanks to the people that have contributed to this project:
- Aurelio Ogliari ([@nobitagit](https://github.com/nobitagit)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=nobitagit)
- Zack Schuster ([@zackschuster](https://github.com/zackschuster)) — [contributions](https://github.com/eamodio/vscode-gitlens/commits?author=zackschuster)

View File

@@ -1,6 +1,6 @@
{ {
"name": "gitlens", "name": "gitlens",
"version": "3.5.0-beta", "version": "3.5.0-beta.2",
"author": { "author": {
"name": "Eric Amodio", "name": "Eric Amodio",
"email": "eamodio@gmail.com" "email": "eamodio@gmail.com"
@@ -902,23 +902,25 @@
"dependencies": { "dependencies": {
"applicationinsights": "0.20.0", "applicationinsights": "0.20.0",
"copy-paste": "1.3.0", "copy-paste": "1.3.0",
"iconv-lite": "0.4.17",
"ignore": "3.3.3", "ignore": "3.3.3",
"lodash.debounce": "4.0.8", "lodash.debounce": "4.0.8",
"lodash.escaperegexp": "4.1.2", "lodash.escaperegexp": "4.1.2",
"lodash.isequal": "4.5.0", "lodash.isequal": "4.5.0",
"lodash.once": "4.1.1", "lodash.once": "4.1.1",
"moment": "2.18.1", "moment": "2.18.1",
"spawn-rx": "2.0.10", "spawn-rx": "2.0.11",
"tmp": "0.0.31" "tmp": "0.0.31"
}, },
"devDependencies": { "devDependencies": {
"@types/applicationinsights": "0.15.33", "@types/applicationinsights": "0.15.33",
"@types/copy-paste": "1.1.30", "@types/copy-paste": "1.1.30",
"@types/iconv-lite": "0.0.1",
"@types/mocha": "2.2.41", "@types/mocha": "2.2.41",
"@types/node": "7.0.22", "@types/node": "7.0.22",
"@types/tmp": "0.0.33", "@types/tmp": "0.0.33",
"mocha": "3.4.1", "mocha": "3.4.2",
"tslint": "5.3.0", "tslint": "5.3.2",
"typescript": "2.3.3", "typescript": "2.3.3",
"vscode": "1.1.0" "vscode": "1.1.0"
} }

View File

@@ -57,4 +57,3 @@ export class ActiveEditorTracker extends Disposable {
return editor; return editor;
} }
} }

View File

@@ -1,6 +1,6 @@
'use strict'; 'use strict';
import { Functions, Objects } from './system'; import { Functions, Objects } from './system';
import { DecorationOptions, DecorationInstanceRenderOptions, DecorationRenderOptions, Disposable, ExtensionContext, Range, StatusBarAlignment, StatusBarItem, TextEditor, TextEditorDecorationType, TextEditorSelectionChangeEvent, window, workspace } from 'vscode'; import { DecorationInstanceRenderOptions, DecorationOptions, DecorationRenderOptions, Disposable, ExtensionContext, Range, StatusBarAlignment, StatusBarItem, TextEditor, TextEditorDecorationType, TextEditorSelectionChangeEvent, window, workspace } from 'vscode';
import { BlameAnnotationController } from './blameAnnotationController'; import { BlameAnnotationController } from './blameAnnotationController';
import { BlameAnnotationFormat, BlameAnnotationFormatter } from './blameAnnotationFormatter'; import { BlameAnnotationFormat, BlameAnnotationFormatter } from './blameAnnotationFormatter';
import { TextEditorComparer } from './comparers'; import { TextEditorComparer } from './comparers';
@@ -54,7 +54,7 @@ export class BlameActiveLineController extends Disposable {
private _onConfigurationChanged() { private _onConfigurationChanged() {
const cfg = workspace.getConfiguration().get<IConfig>(ExtensionKey)!; const cfg = workspace.getConfiguration().get<IConfig>(ExtensionKey)!;
let changed: boolean = false; let changed = false;
if (!Objects.areEquivalent(cfg.statusBar, this._config && this._config.statusBar)) { if (!Objects.areEquivalent(cfg.statusBar, this._config && this._config.statusBar)) {
changed = true; changed = true;
@@ -89,7 +89,7 @@ export class BlameActiveLineController extends Disposable {
if (!changed) return; if (!changed) return;
let trackActiveLine = cfg.statusBar.enabled || cfg.blame.annotation.activeLine !== 'off'; const trackActiveLine = cfg.statusBar.enabled || cfg.blame.annotation.activeLine !== 'off';
if (trackActiveLine && !this._activeEditorLineDisposable) { if (trackActiveLine && !this._activeEditorLineDisposable) {
const subscriptions: Disposable[] = []; const subscriptions: Disposable[] = [];

View File

@@ -5,7 +5,7 @@ import { BlameAnnotationProvider } from './blameAnnotationProvider';
import { TextDocumentComparer, TextEditorComparer } from './comparers'; import { TextDocumentComparer, TextEditorComparer } from './comparers';
import { IBlameConfig } from './configuration'; import { IBlameConfig } from './configuration';
import { ExtensionKey } from './constants'; import { ExtensionKey } from './constants';
import { BlameabilityChangeEvent, GitService, GitUri, GitContextTracker } from './gitService'; import { BlameabilityChangeEvent, GitContextTracker, GitService, GitUri } from './gitService';
import { Logger } from './logger'; import { Logger } from './logger';
import { WhitespaceController } from './whitespaceController'; import { WhitespaceController } from './whitespaceController';
@@ -199,7 +199,7 @@ export class BlameAnnotationController extends Disposable {
async toggleBlameAnnotation(editor: TextEditor, shaOrLine?: string | number): Promise<boolean> { async toggleBlameAnnotation(editor: TextEditor, shaOrLine?: string | number): Promise<boolean> {
if (!editor || !editor.document || !this.git.isEditorBlameable(editor)) return false; if (!editor || !editor.document || !this.git.isEditorBlameable(editor)) return false;
let provider = this._annotationProviders.get(editor.viewColumn || -1); const provider = this._annotationProviders.get(editor.viewColumn || -1);
if (!provider) return this.showBlameAnnotation(editor, shaOrLine); if (!provider) return this.showBlameAnnotation(editor, shaOrLine);
await this.clear(provider.editor.viewColumn || -1); await this.clear(provider.editor.viewColumn || -1);

View File

@@ -46,7 +46,7 @@ export class BlameAnnotationFormatter {
return message; return message;
} }
static getAnnotationHover(config: IBlameConfig, line: IGitCommitLine, commit: GitCommit): string | Array<string> { static getAnnotationHover(config: IBlameConfig, line: IGitCommitLine, commit: GitCommit): string | string[] {
const message = `> \`${commit.message.replace(/\n/g, '\`\n>\n> \`')}\``; const message = `> \`${commit.message.replace(/\n/g, '\`\n>\n> \`')}\``;
if (commit.isUncommitted) { if (commit.isUncommitted) {
return `\`${'0'.repeat(8)}\` &nbsp; __Uncommitted change__`; return `\`${'0'.repeat(8)}\` &nbsp; __Uncommitted change__`;
@@ -103,7 +103,7 @@ export class BlameAnnotationFormatter {
static getMessage(config: IBlameConfig, commit: GitCommit, truncateTo: number = 0, force: boolean = false) { static getMessage(config: IBlameConfig, commit: GitCommit, truncateTo: number = 0, force: boolean = false) {
if (!force && !config.annotation.message) return ''; if (!force && !config.annotation.message) return '';
let message = commit.isUncommitted ? 'Uncommitted change' : commit.message; const message = commit.isUncommitted ? 'Uncommitted change' : commit.message;
if (truncateTo && message.length > truncateTo) { if (truncateTo && message.length > truncateTo) {
return `${message.substring(0, truncateTo - 1)}\u2026`; return `${message.substring(0, truncateTo - 1)}\u2026`;
} }

View File

@@ -5,7 +5,7 @@ import { ActiveEditorCommand, Commands, getCommandUri } from './common';
import { BuiltInCommands } from '../constants'; import { BuiltInCommands } from '../constants';
import { GitService } from '../gitService'; import { GitService } from '../gitService';
import { Logger } from '../logger'; import { Logger } from '../logger';
import { CommandQuickPickItem, BranchesQuickPick } from '../quickPicks'; import { BranchesQuickPick, CommandQuickPickItem } from '../quickPicks';
export interface DiffDirectoryCommandCommandArgs { export interface DiffDirectoryCommandCommandArgs {
shaOrBranch1?: string; shaOrBranch1?: string;

View File

@@ -4,7 +4,7 @@ import { ActiveEditorCommand, Commands, getCommandUri } from './common';
import { BuiltInCommands } from '../constants'; import { BuiltInCommands } from '../constants';
import { GitService, GitUri } from '../gitService'; import { GitService, GitUri } from '../gitService';
import { Logger } from '../logger'; import { Logger } from '../logger';
import { CommandQuickPickItem, BranchesQuickPick } from '../quickPicks'; import { BranchesQuickPick, CommandQuickPickItem } from '../quickPicks';
import * as path from 'path'; import * as path from 'path';
export interface DiffWithBranchCommandArgs { export interface DiffWithBranchCommandArgs {

View File

@@ -16,8 +16,11 @@ export const keys: Keys[] = [
'.' '.'
]; ];
export declare type KeyMapping = { [id: string]: (QuickPickItem | (() => Promise<QuickPickItem>) | undefined) }; export declare interface KeyMapping {
let mappings: KeyMapping[] = []; [id: string]: (QuickPickItem | (() => Promise<QuickPickItem>) | undefined);
}
const mappings: KeyMapping[] = [];
let _instance: Keyboard; let _instance: Keyboard;

View File

@@ -29,7 +29,7 @@ export class OpenInRemoteCommand extends ActiveEditorCommand {
return command.execute(); return command.execute();
} }
let placeHolder: string = ''; let placeHolder = '';
switch (args.resource.type) { switch (args.resource.type) {
case 'branch': case 'branch':
// Check to see if the remote is in the branch // Check to see if the remote is in the branch

View File

@@ -12,7 +12,7 @@ import { ShowBlameCommand, ToggleBlameCommand } from './commands';
import { ShowBlameHistoryCommand, ShowFileHistoryCommand } from './commands'; import { ShowBlameHistoryCommand, ShowFileHistoryCommand } from './commands';
import { ShowLastQuickPickCommand } from './commands'; import { ShowLastQuickPickCommand } from './commands';
import { ShowQuickBranchHistoryCommand, ShowQuickCurrentBranchHistoryCommand, ShowQuickFileHistoryCommand } from './commands'; import { ShowQuickBranchHistoryCommand, ShowQuickCurrentBranchHistoryCommand, ShowQuickFileHistoryCommand } from './commands';
import { ShowQuickCommitDetailsCommand, ShowQuickCommitFileDetailsCommand, ShowCommitSearchCommand } from './commands'; import { ShowCommitSearchCommand, ShowQuickCommitDetailsCommand, ShowQuickCommitFileDetailsCommand } from './commands';
import { ShowQuickRepoStatusCommand, ShowQuickStashListCommand } from './commands'; import { ShowQuickRepoStatusCommand, ShowQuickStashListCommand } from './commands';
import { StashApplyCommand, StashDeleteCommand, StashSaveCommand } from './commands'; import { StashApplyCommand, StashDeleteCommand, StashSaveCommand } from './commands';
import { ToggleCodeLensCommand } from './commands'; import { ToggleCodeLensCommand } from './commands';

View File

@@ -5,6 +5,7 @@ import { spawnPromise } from 'spawn-rx';
import * as fs from 'fs'; import * as fs from 'fs';
import * as path from 'path'; import * as path from 'path';
import * as tmp from 'tmp'; import * as tmp from 'tmp';
import * as iconv from 'iconv-lite';
export { IGit }; export { IGit };
export * from './models/models'; export * from './models/models';
@@ -21,25 +22,43 @@ let git: IGit;
const defaultLogParams = [`log`, `--name-status`, `--full-history`, `-M`, `--date=iso8601`, `--format=%H -%nauthor %an%nauthor-date %ai%nparents %P%nsummary %B%nfilename ?`]; const defaultLogParams = [`log`, `--name-status`, `--full-history`, `-M`, `--date=iso8601`, `--format=%H -%nauthor %an%nauthor-date %ai%nparents %P%nsummary %B%nfilename ?`];
const defaultStashParams = [`stash`, `list`, `--name-status`, `--full-history`, `-M`, `--format=%H -%nauthor-date %ai%nreflog-selector %gd%nsummary %B%nfilename ?`]; const defaultStashParams = [`stash`, `list`, `--name-status`, `--full-history`, `-M`, `--format=%H -%nauthor-date %ai%nreflog-selector %gd%nsummary %B%nfilename ?`];
async function gitCommand(cwd: string, ...args: any[]) { let defaultEncoding = 'utf8';
export function setDefaultEncoding(encoding: string) {
defaultEncoding = iconv.encodingExists(encoding) ? encoding : 'utf8';
}
const GitWarnings = [
/Not a git repository/,
/is outside repository/,
/no such path/,
/does not have any commits/
];
async function gitCommand(options: { cwd: string, encoding?: string }, ...args: any[]) {
try { try {
// Fixes https://github.com/eamodio/vscode-gitlens/issues/73 // Fixes https://github.com/eamodio/vscode-gitlens/issues/73
// See https://stackoverflow.com/questions/4144417/how-to-handle-asian-characters-in-file-names-in-git-on-os-x // See https://stackoverflow.com/questions/4144417/how-to-handle-asian-characters-in-file-names-in-git-on-os-x
args.splice(0, 0, '-c', 'core.quotepath=false'); args.splice(0, 0, '-c', 'core.quotepath=false');
const s = await spawnPromise(git.path, args, { cwd: cwd }); const opts = { encoding: 'utf8', ...options };
Logger.log('git', ...args, ` cwd='${cwd}'`); const s = await spawnPromise(git.path, args, { cwd: options.cwd, encoding: (opts.encoding === 'utf8') ? 'utf8' : 'binary' });
return s; Logger.log('git', ...args, ` cwd='${options.cwd}'`);
if (opts.encoding === 'utf8' || opts.encoding === 'binary') return s;
return iconv.decode(Buffer.from(s, 'binary'), opts.encoding);
} }
catch (ex) { catch (ex) {
const msg = ex && ex.toString(); const msg = ex && ex.toString();
if (msg && (msg.includes('Not a git repository') || msg.includes('is outside repository') || msg.includes('no such path') || msg.includes('does not have any commits'))) { if (msg) {
Logger.warn('git', ...args, ` cwd='${cwd}'`, msg && `\n ${msg.replace(/\r?\n|\r/g, ' ')}`); for (const warning of GitWarnings) {
if (warning.test(msg)) {
Logger.warn('git', ...args, ` cwd='${options.cwd}'`, msg && `\n ${msg.replace(/\r?\n|\r/g, ' ')}`);
return ''; return '';
} }
else {
Logger.error(ex, 'git', ...args, ` cwd='${cwd}'`, msg && `\n ${msg.replace(/\r?\n|\r/g, ' ')}`);
} }
}
Logger.error(ex, 'git', ...args, ` cwd='${options.cwd}'`, msg && `\n ${msg.replace(/\r?\n|\r/g, ' ')}`);
throw ex; throw ex;
} }
} }
@@ -62,14 +81,14 @@ export class Git {
static async getRepoPath(cwd: string | undefined) { static async getRepoPath(cwd: string | undefined) {
if (cwd === undefined) return ''; if (cwd === undefined) return '';
const data = await gitCommand(cwd, 'rev-parse', '--show-toplevel'); const data = await gitCommand({ cwd }, 'rev-parse', '--show-toplevel');
if (!data) return ''; if (!data) return '';
return data.replace(/\r?\n|\r/g, '').replace(/\\/g, '/'); return data.replace(/\r?\n|\r/g, '').replace(/\\/g, '/');
} }
static async getVersionedFile(repoPath: string | undefined, fileName: string, branchOrSha: string) { static async getVersionedFile(repoPath: string | undefined, fileName: string, branchOrSha: string) {
const data = await Git.show(repoPath, fileName, branchOrSha); const data = await Git.show(repoPath, fileName, branchOrSha, 'binary');
const suffix = Git.isSha(branchOrSha) ? branchOrSha.substring(0, 8) : branchOrSha; const suffix = Git.isSha(branchOrSha) ? branchOrSha.substring(0, 8) : branchOrSha;
const ext = path.extname(fileName); const ext = path.extname(fileName);
@@ -82,7 +101,7 @@ export class Git {
} }
Logger.log(`getVersionedFile('${repoPath}', '${fileName}', ${branchOrSha}); destination=${destination}`); Logger.log(`getVersionedFile('${repoPath}', '${fileName}', ${branchOrSha}); destination=${destination}`);
fs.appendFile(destination, data, err => { fs.appendFile(destination, data, { encoding: 'binary' }, err => {
if (err) { if (err) {
reject(err); reject(err);
return; return;
@@ -144,7 +163,7 @@ export class Git {
params.push(sha); params.push(sha);
} }
return gitCommand(root, ...params, `--`, file); return gitCommand({ cwd: root }, ...params, `--`, file);
} }
static branch(repoPath: string, all: boolean) { static branch(repoPath: string, all: boolean) {
@@ -153,19 +172,19 @@ export class Git {
params.push(`-a`); params.push(`-a`);
} }
return gitCommand(repoPath, ...params); return gitCommand({ cwd: repoPath }, ...params);
} }
static async config_get(key: string, repoPath?: string) { static async config_get(key: string, repoPath?: string) {
try { try {
return await gitCommand(repoPath || '', `config`, `--get`, key); return await gitCommand({ cwd: repoPath || '' }, `config`, `--get`, key);
} }
catch (ex) { catch (ex) {
return ''; return '';
} }
} }
static diff(repoPath: string, fileName: string, sha1?: string, sha2?: string) { static diff(repoPath: string, fileName: string, sha1?: string, sha2?: string, encoding?: string) {
const params = [`diff`, `--diff-filter=M`, `-M`]; const params = [`diff`, `--diff-filter=M`, `-M`];
if (sha1) { if (sha1) {
params.push(sha1); params.push(sha1);
@@ -174,7 +193,7 @@ export class Git {
params.push(sha2); params.push(sha2);
} }
return gitCommand(repoPath, ...params, '--', fileName); return gitCommand({ cwd: repoPath, encoding: encoding || defaultEncoding }, ...params, '--', fileName);
} }
static diff_nameStatus(repoPath: string, sha1?: string, sha2?: string) { static diff_nameStatus(repoPath: string, sha1?: string, sha2?: string) {
@@ -186,7 +205,7 @@ export class Git {
params.push(sha2); params.push(sha2);
} }
return gitCommand(repoPath, ...params); return gitCommand({ cwd: repoPath }, ...params);
} }
static difftool_dirDiff(repoPath: string, sha1: string, sha2?: string) { static difftool_dirDiff(repoPath: string, sha1: string, sha2?: string) {
@@ -195,7 +214,7 @@ export class Git {
params.push(sha2); params.push(sha2);
} }
return gitCommand(repoPath, ...params); return gitCommand({ cwd: repoPath }, ...params);
} }
static log(repoPath: string, sha?: string, maxCount?: number, reverse: boolean = false) { static log(repoPath: string, sha?: string, maxCount?: number, reverse: boolean = false) {
@@ -213,7 +232,7 @@ export class Git {
params.push(sha); params.push(sha);
} }
} }
return gitCommand(repoPath, ...params); return gitCommand({ cwd: repoPath }, ...params);
} }
static log_file(repoPath: string, fileName: string, sha?: string, maxCount?: number, reverse: boolean = false, startLine?: number, endLine?: number) { static log_file(repoPath: string, fileName: string, sha?: string, maxCount?: number, reverse: boolean = false, startLine?: number, endLine?: number) {
@@ -250,7 +269,7 @@ export class Git {
params.push(`--`); params.push(`--`);
params.push(file); params.push(file);
return gitCommand(root, ...params); return gitCommand({ cwd: root }, ...params);
} }
static log_search(repoPath: string, search: string[] = [], maxCount?: number) { static log_search(repoPath: string, search: string[] = [], maxCount?: number) {
@@ -259,12 +278,12 @@ export class Git {
params.push(`-n${maxCount}`); params.push(`-n${maxCount}`);
} }
return gitCommand(repoPath, ...params, ...search); return gitCommand({ cwd: repoPath }, ...params, ...search);
} }
static async ls_files(repoPath: string, fileName: string): Promise<string> { static async ls_files(repoPath: string, fileName: string): Promise<string> {
try { try {
return await gitCommand(repoPath, 'ls-files', fileName); return await gitCommand({ cwd: repoPath }, 'ls-files', fileName);
} }
catch (ex) { catch (ex) {
return ''; return '';
@@ -272,33 +291,33 @@ export class Git {
} }
static remote(repoPath: string): Promise<string> { static remote(repoPath: string): Promise<string> {
return gitCommand(repoPath, 'remote', '-v'); return gitCommand({ cwd: repoPath }, 'remote', '-v');
} }
static remote_url(repoPath: string, remote: string): Promise<string> { static remote_url(repoPath: string, remote: string): Promise<string> {
return gitCommand(repoPath, 'remote', 'get-url', remote); return gitCommand({ cwd: repoPath }, 'remote', 'get-url', remote);
} }
static show(repoPath: string | undefined, fileName: string, branchOrSha: string) { static show(repoPath: string | undefined, fileName: string, branchOrSha: string, encoding?: string) {
const [file, root] = Git.splitPath(fileName, repoPath); const [file, root] = Git.splitPath(fileName, repoPath);
branchOrSha = branchOrSha.replace('^', ''); branchOrSha = branchOrSha.replace('^', '');
if (Git.isUncommitted(branchOrSha)) return Promise.reject(new Error(`sha=${branchOrSha} is uncommitted`)); if (Git.isUncommitted(branchOrSha)) return Promise.reject(new Error(`sha=${branchOrSha} is uncommitted`));
return gitCommand(root, 'show', `${branchOrSha}:./${file}`); return gitCommand({ cwd: root, encoding: encoding || defaultEncoding }, 'show', `${branchOrSha}:./${file}`);
} }
static stash_apply(repoPath: string, stashName: string, deleteAfter: boolean) { static stash_apply(repoPath: string, stashName: string, deleteAfter: boolean) {
if (!stashName) return undefined; if (!stashName) return undefined;
return gitCommand(repoPath, 'stash', deleteAfter ? 'pop' : 'apply', stashName); return gitCommand({ cwd: repoPath }, 'stash', deleteAfter ? 'pop' : 'apply', stashName);
} }
static stash_delete(repoPath: string, stashName: string) { static stash_delete(repoPath: string, stashName: string) {
if (!stashName) return undefined; if (!stashName) return undefined;
return gitCommand(repoPath, 'stash', 'drop', stashName); return gitCommand({ cwd: repoPath }, 'stash', 'drop', stashName);
} }
static stash_list(repoPath: string) { static stash_list(repoPath: string) {
return gitCommand(repoPath, ...defaultStashParams); return gitCommand({ cwd: repoPath }, ...defaultStashParams);
} }
static stash_save(repoPath: string, message?: string, unstagedOnly: boolean = false) { static stash_save(repoPath: string, message?: string, unstagedOnly: boolean = false) {
@@ -309,18 +328,18 @@ export class Git {
if (message) { if (message) {
params.push(message); params.push(message);
} }
return gitCommand(repoPath, ...params); return gitCommand({ cwd: repoPath }, ...params);
} }
static status(repoPath: string, porcelainVersion: number = 1): Promise<string> { static status(repoPath: string, porcelainVersion: number = 1): Promise<string> {
const porcelain = porcelainVersion >= 2 ? `--porcelain=v${porcelainVersion}` : '--porcelain'; const porcelain = porcelainVersion >= 2 ? `--porcelain=v${porcelainVersion}` : '--porcelain';
return gitCommand(repoPath, 'status', porcelain, '--branch'); return gitCommand({ cwd: repoPath }, 'status', porcelain, '--branch');
} }
static status_file(repoPath: string, fileName: string, porcelainVersion: number = 1): Promise<string> { static status_file(repoPath: string, fileName: string, porcelainVersion: number = 1): Promise<string> {
const [file, root] = Git.splitPath(fileName, repoPath); const [file, root] = Git.splitPath(fileName, repoPath);
const porcelain = porcelainVersion >= 2 ? `--porcelain=v${porcelainVersion}` : '--porcelain'; const porcelain = porcelainVersion >= 2 ? `--porcelain=v${porcelainVersion}` : '--porcelain';
return gitCommand(root, 'status', porcelain, file); return gitCommand({ cwd: root }, 'status', porcelain, file);
} }
} }

View File

@@ -1,7 +1,7 @@
'use strict'; 'use strict';
import { Uri } from 'vscode'; import { Uri } from 'vscode';
import { GitCommit, GitCommitType, IGitCommitLine } from './commit'; import { GitCommit, GitCommitType, IGitCommitLine } from './commit';
import { IGitStatusFile, GitStatusFileStatus } from './status'; import { GitStatusFileStatus, IGitStatusFile } from './status';
import * as path from 'path'; import * as path from 'path';
export class GitLogCommit extends GitCommit { export class GitLogCommit extends GitCommit {

View File

@@ -1,7 +1,7 @@
'use strict'; 'use strict';
import { IGitCommitLine } from './commit'; import { IGitCommitLine } from './commit';
import { GitLogCommit } from './logCommit'; import { GitLogCommit } from './logCommit';
import { IGitStatusFile, GitStatusFileStatus } from './status'; import { GitStatusFileStatus, IGitStatusFile } from './status';
export class GitStashCommit extends GitLogCommit { export class GitStashCommit extends GitLogCommit {

View File

@@ -41,7 +41,7 @@ export class GitBlameParser {
let entry: IBlameEntry | undefined = undefined; let entry: IBlameEntry | undefined = undefined;
let position = -1; let position = -1;
while (++position < lines.length) { while (++position < lines.length) {
let lineParts = lines[position].split(' '); const lineParts = lines[position].split(' ');
if (lineParts.length < 2) { if (lineParts.length < 2) {
continue; continue;
} }
@@ -122,7 +122,7 @@ export class GitBlameParser {
const authors: Map<string, IGitAuthor> = new Map(); const authors: Map<string, IGitAuthor> = new Map();
const commits: Map<string, GitCommit> = new Map(); const commits: Map<string, GitCommit> = new Map();
const lines: Array<IGitCommitLine> = []; const lines: IGitCommitLine[] = [];
let relativeFileName = repoPath && fileName; let relativeFileName = repoPath && fileName;

View File

@@ -1,6 +1,6 @@
'use strict'; 'use strict';
import { Range } from 'vscode'; import { Range } from 'vscode';
import { Git, GitStatusFileStatus, GitLogCommit, GitCommitType, IGitAuthor, IGitLog, IGitStatusFile } from './../git'; import { Git, GitCommitType, GitLogCommit, GitStatusFileStatus, IGitAuthor, IGitLog, IGitStatusFile } from './../git';
// import { Logger } from '../../logger'; // import { Logger } from '../../logger';
import * as moment from 'moment'; import * as moment from 'moment';
import * as path from 'path'; import * as path from 'path';

View File

@@ -1,5 +1,5 @@
'use strict'; 'use strict';
import { Git, GitStatusFileStatus, GitStatusFile, IGitStatus } from './../git'; import { Git, GitStatusFile, GitStatusFileStatus, IGitStatus } from './../git';
interface IFileStatusEntry { interface IFileStatusEntry {
staged: boolean; staged: boolean;
@@ -61,7 +61,7 @@ export class GitStatusParser {
else { else {
let entry: IFileStatusEntry; let entry: IFileStatusEntry;
const rawStatus = line.substring(0, 2); const rawStatus = line.substring(0, 2);
let fileName = line.substring(3); const fileName = line.substring(3);
if (rawStatus[0] === 'R') { if (rawStatus[0] === 'R') {
const [file1, file2] = fileName.replace(/\"/g, '').split('->'); const [file1, file2] = fileName.replace(/\"/g, '').split('->');
entry = this._parseFileEntry(rawStatus, file2.trim(), file1.trim()); entry = this._parseFileEntry(rawStatus, file2.trim(), file1.trim());
@@ -98,7 +98,7 @@ export class GitStatusParser {
} }
} }
else { else {
let lineParts = line.split(' '); const lineParts = line.split(' ');
let entry: IFileStatusEntry | undefined = undefined; let entry: IFileStatusEntry | undefined = undefined;
switch (lineParts[0][0]) { switch (lineParts[0][0]) {
case '1': // normal case '1': // normal

View File

@@ -21,7 +21,7 @@ export class BitbucketService extends RemoteProvider {
} }
protected getUrlForFile(fileName: string, branch?: string, sha?: string, range?: Range): string { protected getUrlForFile(fileName: string, branch?: string, sha?: string, range?: Range): string {
let line: string = ''; let line = '';
if (range) { if (range) {
if (range.start.line === range.end.line) { if (range.start.line === range.end.line) {
line = `#${fileName}-${range.start.line}`; line = `#${fileName}-${range.start.line}`;

View File

@@ -21,7 +21,7 @@ export class GitHubService extends RemoteProvider {
} }
protected getUrlForFile(fileName: string, branch?: string, sha?: string, range?: Range): string { protected getUrlForFile(fileName: string, branch?: string, sha?: string, range?: Range): string {
let line: string = ''; let line = '';
if (range) { if (range) {
if (range.start.line === range.end.line) { if (range.start.line === range.end.line) {
line = `#L${range.start.line}`; line = `#L${range.start.line}`;

View File

@@ -21,7 +21,7 @@ export class VisualStudioService extends RemoteProvider {
} }
protected getUrlForFile(fileName: string, branch?: string, sha?: string, range?: Range): string { protected getUrlForFile(fileName: string, branch?: string, sha?: string, range?: Range): string {
let line: string = ''; let line = '';
if (range) { if (range) {
if (range.start.line === range.end.line) { if (range.start.line === range.end.line) {
line = `&line=${range.start.line}`; line = `&line=${range.start.line}`;

View File

@@ -3,7 +3,7 @@ import { Functions, Iterables, Strings } from './system';
import { CancellationToken, CodeLens, CodeLensProvider, Command, commands, DocumentSelector, Event, EventEmitter, ExtensionContext, Position, Range, SymbolInformation, SymbolKind, TextDocument, Uri, workspace } from 'vscode'; import { CancellationToken, CodeLens, CodeLensProvider, Command, commands, DocumentSelector, Event, EventEmitter, ExtensionContext, Position, Range, SymbolInformation, SymbolKind, TextDocument, Uri, workspace } from 'vscode';
import { Commands, DiffWithPreviousCommandArgs, ShowBlameHistoryCommandArgs, ShowFileHistoryCommandArgs, ShowQuickCommitDetailsCommandArgs, ShowQuickCommitFileDetailsCommandArgs, ShowQuickFileHistoryCommandArgs } from './commands'; import { Commands, DiffWithPreviousCommandArgs, ShowBlameHistoryCommandArgs, ShowFileHistoryCommandArgs, ShowQuickCommitDetailsCommandArgs, ShowQuickCommitFileDetailsCommandArgs, ShowQuickFileHistoryCommandArgs } from './commands';
import { BuiltInCommands, DocumentSchemes, ExtensionKey } from './constants'; import { BuiltInCommands, DocumentSchemes, ExtensionKey } from './constants';
import { CodeLensCommand, CodeLensLocation, IConfig, ICodeLensLanguageLocation } from './configuration'; import { CodeLensCommand, CodeLensLocation, ICodeLensLanguageLocation, IConfig } from './configuration';
import { GitCommit, GitService, GitUri, IGitBlame, IGitBlameLines } from './gitService'; import { GitCommit, GitService, GitUri, IGitBlame, IGitBlameLines } from './gitService';
import { Logger } from './logger'; import { Logger } from './logger';
import * as moment from 'moment'; import * as moment from 'moment';
@@ -115,7 +115,7 @@ export class GitCodeLensProvider implements CodeLensProvider {
} }
private _validateSymbolAndGetBlameRange(document: TextDocument, symbol: SymbolInformation, languageLocation: ICodeLensLanguageLocation): Range | undefined { private _validateSymbolAndGetBlameRange(document: TextDocument, symbol: SymbolInformation, languageLocation: ICodeLensLanguageLocation): Range | undefined {
let valid: boolean = false; let valid = false;
let range: Range | undefined; let range: Range | undefined;
switch (languageLocation.location) { switch (languageLocation.location) {
case CodeLensLocation.All: case CodeLensLocation.All:

View File

@@ -4,7 +4,7 @@ import { Disposable, Event, EventEmitter, ExtensionContext, FileSystemWatcher, l
import { CommandContext, setCommandContext } from './commands'; import { CommandContext, setCommandContext } from './commands';
import { CodeLensVisibility, IConfig } from './configuration'; import { CodeLensVisibility, IConfig } from './configuration';
import { DocumentSchemes, ExtensionKey } from './constants'; import { DocumentSchemes, ExtensionKey } from './constants';
import { Git, GitBlameParser, GitBranch, GitCommit, GitDiffParser, GitLogCommit, GitLogParser, GitRemote, GitStashParser, GitStatusFile, GitStatusParser, IGit, IGitAuthor, IGitBlame, IGitBlameLine, IGitBlameLines, IGitDiff, IGitLog, IGitStash, IGitStatus } from './git/git'; import { Git, GitBlameParser, GitBranch, GitCommit, GitDiffParser, GitLogCommit, GitLogParser, GitRemote, GitStashParser, GitStatusFile, GitStatusParser, IGit, IGitAuthor, IGitBlame, IGitBlameLine, IGitBlameLines, IGitDiff, IGitLog, IGitStash, IGitStatus, setDefaultEncoding } from './git/git';
import { GitUri, IGitCommitInfo, IGitUriData } from './git/gitUri'; import { GitUri, IGitCommitInfo, IGitUriData } from './git/gitUri';
import { GitCodeLensProvider } from './gitCodeLensProvider'; import { GitCodeLensProvider } from './gitCodeLensProvider';
import { Logger } from './logger'; import { Logger } from './logger';
@@ -43,7 +43,6 @@ class GitCacheEntry {
} }
interface ICachedItem<T> { interface ICachedItem<T> {
//date: Date;
item: Promise<T>; item: Promise<T>;
errorMessage?: string; errorMessage?: string;
} }
@@ -130,6 +129,9 @@ export class GitService extends Disposable {
} }
private _onConfigurationChanged() { private _onConfigurationChanged() {
const encoding = workspace.getConfiguration('files').get<string>('encoding', 'utf8');
setDefaultEncoding(encoding);
const cfg = workspace.getConfiguration().get<IConfig>(ExtensionKey)!; const cfg = workspace.getConfiguration().get<IConfig>(ExtensionKey)!;
const codeLensChanged = !Objects.areEquivalent(cfg.codeLens, this.config && this.config.codeLens); const codeLensChanged = !Objects.areEquivalent(cfg.codeLens, this.config && this.config.codeLens);
@@ -238,7 +240,7 @@ export class GitService extends Disposable {
} }
private async _fileExists(repoPath: string, fileName: string): Promise<boolean> { private async _fileExists(repoPath: string, fileName: string): Promise<boolean> {
return await new Promise<boolean>((resolve, reject) => fs.exists(path.resolve(repoPath, fileName), e => resolve(e))); return await new Promise<boolean>((resolve, reject) => fs.exists(path.resolve(repoPath, fileName), resolve));
} }
async findNextCommit(repoPath: string, fileName: string, sha?: string): Promise<GitLogCommit | undefined> { async findNextCommit(repoPath: string, fileName: string, sha?: string): Promise<GitLogCommit | undefined> {
@@ -319,7 +321,7 @@ export class GitService extends Disposable {
} }
async getBlameForFile(uri: GitUri): Promise<IGitBlame | undefined> { async getBlameForFile(uri: GitUri): Promise<IGitBlame | undefined> {
let key: string = 'blame'; let key = 'blame';
if (uri.sha !== undefined) { if (uri.sha !== undefined) {
key += `:${uri.sha}`; key += `:${uri.sha}`;
} }
@@ -369,7 +371,6 @@ export class GitService extends Disposable {
Logger.log(`Add blame cache for '${entry.key}:${key}'`); Logger.log(`Add blame cache for '${entry.key}:${key}'`);
entry.set<ICachedBlame>(key, { entry.set<ICachedBlame>(key, {
//date: new Date(),
item: promise item: promise
} as ICachedBlame); } as ICachedBlame);
} }
@@ -400,7 +401,6 @@ export class GitService extends Disposable {
Logger.log(`Replace blame cache with empty promise for '${entry.key}:${key}'`); Logger.log(`Replace blame cache with empty promise for '${entry.key}:${key}'`);
entry.set<ICachedBlame>(key, { entry.set<ICachedBlame>(key, {
//date: new Date(),
item: GitService.EmptyPromise, item: GitService.EmptyPromise,
errorMessage: msg errorMessage: msg
} as ICachedBlame); } as ICachedBlame);
@@ -519,7 +519,7 @@ export class GitService extends Disposable {
const commitCount = blame.commits.size; const commitCount = blame.commits.size;
const locations: Array<Location> = []; const locations: Location[] = [];
Iterables.forEach(blame.commits.values(), (c, i) => { Iterables.forEach(blame.commits.values(), (c, i) => {
if (c.isUncommitted) return; if (c.isUncommitted) return;
@@ -567,7 +567,7 @@ export class GitService extends Disposable {
} }
async getDiffForFile(repoPath: string | undefined, fileName: string, sha1?: string, sha2?: string): Promise<IGitDiff | undefined> { async getDiffForFile(repoPath: string | undefined, fileName: string, sha1?: string, sha2?: string): Promise<IGitDiff | undefined> {
let key: string = 'diff'; let key = 'diff';
if (sha1 !== undefined) { if (sha1 !== undefined) {
key += `:${sha1}`; key += `:${sha1}`;
} }
@@ -605,7 +605,6 @@ export class GitService extends Disposable {
Logger.log(`Add log cache for '${entry.key}:${key}'`); Logger.log(`Add log cache for '${entry.key}:${key}'`);
entry.set<ICachedDiff>(key, { entry.set<ICachedDiff>(key, {
//date: new Date(),
item: promise item: promise
} as ICachedDiff); } as ICachedDiff);
} }
@@ -627,7 +626,6 @@ export class GitService extends Disposable {
Logger.log(`Replace diff cache with empty promise for '${entry.key}:${key}'`); Logger.log(`Replace diff cache with empty promise for '${entry.key}:${key}'`);
entry.set<ICachedDiff>(key, { entry.set<ICachedDiff>(key, {
//date: new Date(),
item: GitService.EmptyPromise, item: GitService.EmptyPromise,
errorMessage: msg errorMessage: msg
} as ICachedDiff); } as ICachedDiff);
@@ -729,7 +727,7 @@ export class GitService extends Disposable {
} }
async getLogForFile(repoPath: string | undefined, fileName: string, sha?: string, maxCount?: number, range?: Range, reverse: boolean = false): Promise<IGitLog | undefined> { async getLogForFile(repoPath: string | undefined, fileName: string, sha?: string, maxCount?: number, range?: Range, reverse: boolean = false): Promise<IGitLog | undefined> {
let key: string = 'log'; let key = 'log';
if (sha !== undefined) { if (sha !== undefined) {
key += `:${sha}`; key += `:${sha}`;
} }
@@ -785,7 +783,6 @@ export class GitService extends Disposable {
Logger.log(`Add log cache for '${entry.key}:${key}'`); Logger.log(`Add log cache for '${entry.key}:${key}'`);
entry.set<ICachedLog>(key, { entry.set<ICachedLog>(key, {
//date: new Date(),
item: promise item: promise
} as ICachedLog); } as ICachedLog);
} }
@@ -813,7 +810,6 @@ export class GitService extends Disposable {
Logger.log(`Replace log cache with empty promise for '${entry.key}:${key}'`); Logger.log(`Replace log cache with empty promise for '${entry.key}:${key}'`);
entry.set<ICachedLog>(key, { entry.set<ICachedLog>(key, {
//date: new Date(),
item: GitService.EmptyPromise, item: GitService.EmptyPromise,
errorMessage: msg errorMessage: msg
} as ICachedLog); } as ICachedLog);
@@ -833,7 +829,7 @@ export class GitService extends Disposable {
const commitCount = log.commits.size; const commitCount = log.commits.size;
const locations: Array<Location> = []; const locations: Location[] = [];
Iterables.forEach(log.commits.values(), (c, i) => { Iterables.forEach(log.commits.values(), (c, i) => {
if (c.isUncommitted) return; if (c.isUncommitted) return;

View File

@@ -1,6 +1,6 @@
'use strict'; 'use strict';
import { CancellationTokenSource, commands, Disposable, QuickPickItem, QuickPickOptions, TextDocumentShowOptions, TextEditor, Uri, window, workspace } from 'vscode'; import { CancellationTokenSource, commands, Disposable, QuickPickItem, QuickPickOptions, TextDocumentShowOptions, TextEditor, Uri, window, workspace } from 'vscode';
import { Commands, Keyboard, Keys, KeyboardScope, KeyMapping, openEditor } from '../commands'; import { Commands, Keyboard, KeyboardScope, KeyMapping, Keys, openEditor } from '../commands';
import { IAdvancedConfig } from '../configuration'; import { IAdvancedConfig } from '../configuration';
import { ExtensionKey } from '../constants'; import { ExtensionKey } from '../constants';
import { GitCommit, GitLogCommit, GitStashCommit } from '../gitService'; import { GitCommit, GitLogCommit, GitStashCommit } from '../gitService';

View File

@@ -30,7 +30,7 @@ export class OpenRemotesCommandQuickPickItem extends CommandQuickPickItem {
constructor(remotes: GitRemote[], resource: RemoteResource, goBackCommand?: CommandQuickPickItem) { constructor(remotes: GitRemote[], resource: RemoteResource, goBackCommand?: CommandQuickPickItem) {
const name = getNameFromRemoteResource(resource); const name = getNameFromRemoteResource(resource);
let description: string = ''; let description = '';
switch (resource.type) { switch (resource.type) {
case 'branch': case 'branch':
description = `$(git-branch) ${resource.branch}`; description = `$(git-branch) ${resource.branch}`;

View File

@@ -16,7 +16,7 @@ export class OpenStatusFileCommandQuickPickItem extends OpenFileCommandQuickPick
directory = ''; directory = '';
} }
let description = (status.status === 'R' && status.originalFileName) const description = (status.status === 'R' && status.originalFileName)
? `${directory} \u00a0\u2190\u00a0 ${status.originalFileName}` ? `${directory} \u00a0\u2190\u00a0 ${status.originalFileName}`
: directory; : directory;
@@ -211,7 +211,6 @@ export class RepoStatusQuickPick {
])); ]));
} }
if (goBackCommand) { if (goBackCommand) {
items.splice(0, 0, goBackCommand); items.splice(0, 0, goBackCommand);
} }

View File

@@ -55,7 +55,7 @@ export namespace Iterables {
} }
export function join(source: Iterable<any>, separator: string): string { export function join(source: Iterable<any>, separator: string): string {
let value: string = ''; let value = '';
const iterator = source[Symbol.iterator](); const iterator = source[Symbol.iterator]();
let next = iterator.next(); let next = iterator.next();

View File

@@ -1,5 +1,4 @@
'use strict'; 'use strict';
//import { isEqual as _isEqual } from 'lodash';
const _isEqual = require('lodash.isequal'); const _isEqual = require('lodash.isequal');
export namespace Objects { export namespace Objects {
@@ -8,13 +7,13 @@ export namespace Objects {
} }
export function* entries(o: any): IterableIterator<[string, any]> { export function* entries(o: any): IterableIterator<[string, any]> {
for (let key in o) { for (const key in o) {
yield [key, o[key]]; yield [key, o[key]];
} }
} }
export function flatten(o: any, prefix: string = '', stringify: boolean = false): { [key: string]: any } { export function flatten(o: any, prefix: string = '', stringify: boolean = false): { [key: string]: any } {
let flattened = Object.create(null); const flattened = Object.create(null);
_flatten(flattened, prefix, o, stringify); _flatten(flattened, prefix, o, stringify);
return flattened; return flattened;
} }
@@ -37,7 +36,7 @@ export namespace Objects {
} }
} }
else if (Array.isArray(value)) { else if (Array.isArray(value)) {
let len = value.length; const len = value.length;
for (let i = 0; i < len; i++) { for (let i = 0; i < len; i++) {
_flatten(flattened, `${key}[${i}]`, value[i], stringify); _flatten(flattened, `${key}[${i}]`, value[i], stringify);
} }
@@ -47,7 +46,7 @@ export namespace Objects {
} }
else { else {
let isEmpty = true; let isEmpty = true;
for (let p in value) { for (const p in value) {
isEmpty = false; isEmpty = false;
_flatten(flattened, key ? `${key}.${p}` : p, value[p], stringify); _flatten(flattened, key ? `${key}.${p}` : p, value[p], stringify);
} }

View File

@@ -1,5 +1,4 @@
'use strict'; 'use strict';
//import { escapeRegExp as _escapeRegExp } from 'lodash';
const _escapeRegExp = require('lodash.escaperegexp'); const _escapeRegExp = require('lodash.escaperegexp');
export namespace Strings { export namespace Strings {

View File

@@ -1,5 +1,5 @@
'use strict'; 'use strict';
import { env, Disposable, version, workspace } from 'vscode'; import { Disposable, env, version, workspace } from 'vscode';
import * as os from 'os'; import * as os from 'os';
let _reporter: TelemetryReporter; let _reporter: TelemetryReporter;

View File

@@ -1,7 +1,7 @@
{ {
"compilerOptions": { "compilerOptions": {
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"lib": [ "es6" ], "lib": [ "es2015" ],
"module": "commonjs", "module": "commonjs",
"noFallthroughCasesInSwitch": true, "noFallthroughCasesInSwitch": true,
"noImplicitReturns": true, "noImplicitReturns": true,
@@ -12,7 +12,7 @@
"skipLibCheck": true, "skipLibCheck": true,
"sourceMap": true, "sourceMap": true,
"strict": true, "strict": true,
"target": "es6" "target": "es2015"
}, },
"exclude": [ "exclude": [
"node_modules", "node_modules",

View File

@@ -1,22 +1,52 @@
{ {
"rules": { "rules": {
"arrow-parens": false, "adjacent-overload-signatures": true,
"array-type": [
true,
"array"
],
"arrow-parens": [
true,
"ban-single-arg-parens"
],
"arrow-return-shorthand": true,
"class-name": true, "class-name": true,
"comment-format": [ "comment-format": [
false true,
"check-space"
],
"curly": [
true,
"ignore-same-line"
], ],
"curly": false,
"indent": [ "indent": [
true, true,
"spaces" "spaces"
], ],
"interface-over-type-literal": true,
"new-parens": true, "new-parens": true,
"no-duplicate-variable": true, "no-angle-bracket-type-assertion": true,
"no-consecutive-blank-lines": [
true,
1
],
"no-default-export": true,
"no-eval": true, "no-eval": true,
"no-for-in-array": false, // "no-for-in-array": true,
"no-inferrable-types": [
true,
"ignore-params",
"ignore-properties"
],
"no-internal-module": true, "no-internal-module": true,
"no-invalid-template-strings": true,
"no-irregular-whitespace": true,
"no-reference": true, "no-reference": true,
"no-string-throw": true,
"no-trailing-whitespace": true, "no-trailing-whitespace": true,
"no-unnecessary-callback-wrapper": true,
// "no-unnecessary-qualifier": true,
// "no-unsafe-any": true,
"no-unsafe-finally": true, "no-unsafe-finally": true,
"no-unused-expression": false, "no-unused-expression": false,
"no-var-keyword": true, "no-var-keyword": true,
@@ -35,11 +65,18 @@
"ignore-for-loop" "ignore-for-loop"
], ],
"ordered-imports": [ "ordered-imports": [
false, true,
{ {
"import-sources-order": "any",
"named-imports-order": "case-insensitive" "named-imports-order": "case-insensitive"
} }
], ],
"prefer-const": true,
"prefer-for-of": true,
"prefer-template": [
true,
"allow-single-concat"
],
"quotemark": [ "quotemark": [
true, true,
"single", "single",
@@ -50,6 +87,16 @@
true, true,
"always" "always"
], ],
"space-before-function-paren": [
true,
{
"anonymous": "never",
"named": "never",
"asyncArrow": "always"
}
],
// "strict-boolean-expressions": true,
// "strict-type-predicates": true,
"trailing-comma": [ "trailing-comma": [
true, true,
{ {
@@ -71,6 +118,7 @@
"variable-declaration": "nospace" "variable-declaration": "nospace"
} }
], ],
"typeof-compare": true,
"use-isnan": true, "use-isnan": true,
"variable-name": [ "variable-name": [
true, true,