From ee434a8596873f62b310d05191391a6033be62f5 Mon Sep 17 00:00:00 2001 From: Kortina Date: Sun, 20 Sep 2020 22:37:36 -0700 Subject: [PATCH 1/3] improve perf by respecting search.exclude, files.excluce, AND .gitignore --- package.json | 2 +- src/NoteWorkspace.ts | 8 +++-- src/extension.ts | 7 ++-- src/findNonIgnoredFiles.ts | 68 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 src/findNonIgnoredFiles.ts diff --git a/package.json b/package.json index c1d7c7b..24947b0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "vscode-markdown-notes", "displayName": "Markdown Notes", "description": "Navigate notes with [[wiki-links]], backlinks, and #tags (like Bear, Roam, etc). Automatically create notes from new inline [[wiki-links]]. Use Peek Definition to preview linked notes.", - "version": "0.0.19", + "version": "0.0.20", "publisher": "kortina", "repository": { "url": "https://github.com/kortina/vscode-markdown-notes.git", diff --git a/src/NoteWorkspace.ts b/src/NoteWorkspace.ts index 5b30b1f..70c2b63 100644 --- a/src/NoteWorkspace.ts +++ b/src/NoteWorkspace.ts @@ -1,6 +1,7 @@ import * as vscode from 'vscode'; import { basename, dirname, isAbsolute, join, normalize, relative } from 'path'; import { existsSync, writeFileSync } from 'fs'; +import findNonIgnoredFiles from './findNonIgnoredFiles'; const GithubSlugger = require('github-slugger'); const SLUGGER = new GithubSlugger(); @@ -468,9 +469,10 @@ export class NoteWorkspace { static async noteFiles(): Promise> { let that = this; - let files = (await vscode.workspace.findFiles('**/*')).filter( - (f) => f.scheme == 'file' && f.path.match(that.rxFileExtensions()) - ); + + // let files = await vscode.workspace.findFiles('**/*'); + let files = await findNonIgnoredFiles('**/*'); + files = files.filter((f) => f.scheme == 'file' && f.path.match(that.rxFileExtensions())); this.noteFileCache = files; return files; } diff --git a/src/extension.ts b/src/extension.ts index a5a4e54..7692332 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -68,8 +68,7 @@ export function activate(context: vscode.ExtensionContext) { // For more information on how this works. return { extendMarkdownIt(md: any) { - return md.use( - pluginSettings() - )} - }; + return md.use(pluginSettings()); + }, + }; } diff --git a/src/findNonIgnoredFiles.ts b/src/findNonIgnoredFiles.ts new file mode 100644 index 0000000..33df3ae --- /dev/null +++ b/src/findNonIgnoredFiles.ts @@ -0,0 +1,68 @@ +// "Here's an updated snippet which will return URIs of workspace files except +// for those ignored either by search.exclude or files.exclude or .gitignore." +// via: +// https://github.com/microsoft/vscode/issues/48674 +import { workspace, Uri } from 'vscode'; +import { exec, ExecException } from 'child_process'; +// import applicationInsights from './telemetry'; +import { join } from 'path'; + +// TODO: https://github.com/TomasHubelbauer/vscode-extension-findFilesWithExcludes +// TODO: https://github.com/Microsoft/vscode/issues/48674 for finding MarkDown files that VS Code considers not ignored +// TODO: https://github.com/Microsoft/vscode/issues/47645 for finding MarkDown files no matter the extension (VS Code language to extension) +// TODO: https://github.com/Microsoft/vscode/issues/11838 for maybe telling if file is MarkDown using an API +// TODO: https://github.com/Microsoft/vscode/blob/release/1.27/extensions/git/src/api/git.d.ts instead of Git shell if possible +export default async function findNonIgnoredFiles(pattern: string, checkGitIgnore = true) { + const exclude = [ + ...Object.keys((await workspace.getConfiguration('search', null).get('exclude')) || {}), + ...Object.keys((await workspace.getConfiguration('files', null).get('exclude')) || {}), + ].join(','); + + const uris = await workspace.findFiles(pattern, `{${exclude}}`); + if (!checkGitIgnore) { + return uris; + } + + const workspaceRelativePaths = uris.map((uri) => workspace.asRelativePath(uri, false)); + for (const workspaceDirectory of workspace.workspaceFolders!) { + const workspaceDirectoryPath = workspaceDirectory.uri.fsPath; + try { + const { stdout, stderr } = await new Promise<{ stdout: string; stderr: string }>( + (resolve, reject) => { + exec( + `git check-ignore ${workspaceRelativePaths.join(' ')}`, + { cwd: workspaceDirectoryPath }, + // https://git-scm.com/docs/git-check-ignore#_exit_status + (error: ExecException | null, stdout, stderr) => { + if (error && error.code !== 0 && error.code !== 1) { + reject(error); + return; + } + + resolve({ stdout, stderr }); + } + ); + } + ); + + if (stderr) { + throw new Error(stderr); + } + + for (const relativePath of stdout.split('\n')) { + const uri = Uri.file( + join(workspaceDirectoryPath, relativePath.slice(1, -1) /* Remove quotes */) + ); + const index = uris.findIndex((u) => u.fsPath === uri.fsPath); + if (index > -1) { + uris.splice(index, 1); + } + } + } catch (error) { + console.error('findNonIgnoredFiles-git-exec-error', error); + // applicationInsights.sendTelemetryEvent('findNonIgnoredFiles-git-exec-error'); + } + } + + return uris; +} From 9d7d6c86421fe807566d4420106652f8b6e8e1fd Mon Sep 17 00:00:00 2001 From: Kortina Date: Sun, 20 Sep 2020 22:54:10 -0700 Subject: [PATCH 2/3] refactor --- src/findNonIgnoredFiles.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/findNonIgnoredFiles.ts b/src/findNonIgnoredFiles.ts index 33df3ae..bf343cd 100644 --- a/src/findNonIgnoredFiles.ts +++ b/src/findNonIgnoredFiles.ts @@ -12,7 +12,10 @@ import { join } from 'path'; // TODO: https://github.com/Microsoft/vscode/issues/47645 for finding MarkDown files no matter the extension (VS Code language to extension) // TODO: https://github.com/Microsoft/vscode/issues/11838 for maybe telling if file is MarkDown using an API // TODO: https://github.com/Microsoft/vscode/blob/release/1.27/extensions/git/src/api/git.d.ts instead of Git shell if possible -export default async function findNonIgnoredFiles(pattern: string, checkGitIgnore = true) { +export default async function findNonIgnoredFiles( + pattern: string, + checkGitIgnore = true +): Promise { const exclude = [ ...Object.keys((await workspace.getConfiguration('search', null).get('exclude')) || {}), ...Object.keys((await workspace.getConfiguration('files', null).get('exclude')) || {}), @@ -22,7 +25,10 @@ export default async function findNonIgnoredFiles(pattern: string, checkGitIgnor if (!checkGitIgnore) { return uris; } + return filterGitIgnored(uris); +} +async function filterGitIgnored(uris: Uri[]): Promise { const workspaceRelativePaths = uris.map((uri) => workspace.asRelativePath(uri, false)); for (const workspaceDirectory of workspace.workspaceFolders!) { const workspaceDirectoryPath = workspaceDirectory.uri.fsPath; @@ -63,6 +69,5 @@ export default async function findNonIgnoredFiles(pattern: string, checkGitIgnor // applicationInsights.sendTelemetryEvent('findNonIgnoredFiles-git-exec-error'); } } - return uris; } From 9bdf3313e332c0e198b4bfb579c26cd4d9def48f Mon Sep 17 00:00:00 2001 From: Kortina Date: Sun, 20 Sep 2020 22:56:38 -0700 Subject: [PATCH 3/3] cleanup --- src/findNonIgnoredFiles.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/findNonIgnoredFiles.ts b/src/findNonIgnoredFiles.ts index bf343cd..550ff68 100644 --- a/src/findNonIgnoredFiles.ts +++ b/src/findNonIgnoredFiles.ts @@ -7,11 +7,6 @@ import { exec, ExecException } from 'child_process'; // import applicationInsights from './telemetry'; import { join } from 'path'; -// TODO: https://github.com/TomasHubelbauer/vscode-extension-findFilesWithExcludes -// TODO: https://github.com/Microsoft/vscode/issues/48674 for finding MarkDown files that VS Code considers not ignored -// TODO: https://github.com/Microsoft/vscode/issues/47645 for finding MarkDown files no matter the extension (VS Code language to extension) -// TODO: https://github.com/Microsoft/vscode/issues/11838 for maybe telling if file is MarkDown using an API -// TODO: https://github.com/Microsoft/vscode/blob/release/1.27/extensions/git/src/api/git.d.ts instead of Git shell if possible export default async function findNonIgnoredFiles( pattern: string, checkGitIgnore = true @@ -28,6 +23,7 @@ export default async function findNonIgnoredFiles( return filterGitIgnored(uris); } +// TODO: https://github.com/Microsoft/vscode/blob/release/1.27/extensions/git/src/api/git.d.ts instead of git shell if possible async function filterGitIgnored(uris: Uri[]): Promise { const workspaceRelativePaths = uris.map((uri) => workspace.asRelativePath(uri, false)); for (const workspaceDirectory of workspace.workspaceFolders!) {