From 6b96d911f0dffa6e7f9c822f2d4813377b92f49e Mon Sep 17 00:00:00 2001 From: "bobo.yang" Date: Mon, 21 Aug 2023 11:52:00 +0800 Subject: [PATCH] Implement updateLastModifyTime function and status bar item - Added a new function updateLastModifyTime in askCodeUtil.ts to update the last modification time of files. - The function ignores hidden files and directories (those starting with '.'). - The function creates the directory if it does not exist before writing the file. - Added a new status bar item for AskCode in statusBarView.ts. - The status bar item checks the indexing status every 10 seconds and updates its tooltip and command accordingly. --- src/contributes/commands.ts | 6 ++++ src/extension.ts | 3 +- src/panel/statusBarView.ts | 33 ++++++++++++++++-- src/util/askCodeUtil.ts | 68 +++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 src/util/askCodeUtil.ts diff --git a/src/contributes/commands.ts b/src/contributes/commands.ts index 02dea87..8238644 100644 --- a/src/contributes/commands.ts +++ b/src/contributes/commands.ts @@ -10,6 +10,7 @@ import { isValidApiKey } from '../handler/historyMessagesBase'; import { logger } from '../util/logger'; import { CommandRun } from '../util/commonUtil'; +import { updateIndexingStatus, updateLastModifyTime } from '../util/askCodeUtil'; let indexProcess: CommandRun | null = null; @@ -236,11 +237,15 @@ export function registerAskCodeIndexStartCommand(context: vscode.ExtensionContex const pythonPath = config.pythonPath; const supportedFileTypes = config.supportedFileTypes; + updateIndexingStatus("started"); + if (!pythonVirtualEnv) { await installAskCode(pythonPath, supportedFileTypes); } else { await indexCode(pythonVirtualEnv, supportedFileTypes); } + + updateIndexingStatus("stopped"); }); context.subscriptions.push(disposable); } @@ -332,6 +337,7 @@ async function indexCode(pythonVirtualEnv, supportedFileTypes) { return; } + updateLastModifyTime(); logger.channel()?.info(`index finished.`); vscode.window.showInformationMessage('Indexing finished.'); } diff --git a/src/extension.ts b/src/extension.ts index 70cad2d..8c2a9b4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -24,7 +24,7 @@ import { regDevChatView, regTopicView } from './contributes/views'; import ExtensionContextHolder from './util/extensionContext'; import { logger } from './util/logger'; import { LoggerChannelVscode } from './util/logger_vscode'; -import { createStatusBarItem } from './panel/statusBarView'; +import { createStatusBarItem, createAskCodeStatusBarItem } from './panel/statusBarView'; import { UiUtilWrapper } from './util/uiUtil'; import { UiUtilVscode } from './util/uiUtil_vscode'; @@ -49,6 +49,7 @@ function activate(context: vscode.ExtensionContext) { registerStatusBarItemClickCommand(context); createStatusBarItem(context); + createAskCodeStatusBarItem(context); regTopicDeleteCommand(context); regAddTopicCommand(context); diff --git a/src/panel/statusBarView.ts b/src/panel/statusBarView.ts index 6347ef5..234cab2 100644 --- a/src/panel/statusBarView.ts +++ b/src/panel/statusBarView.ts @@ -1,12 +1,12 @@ import * as vscode from 'vscode'; import { dependencyCheck } from './statusBarViewBase'; -import { logger } from '@/util/logger'; +import { isIndexingStopped, isNeedIndexingCode } from '../util/askCodeUtil'; export function createStatusBarItem(context: vscode.ExtensionContext): vscode.StatusBarItem { const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100); - + // Set the status bar item properties statusBarItem.text = `$(warning)DevChat`; statusBarItem.tooltip = 'DevChat is checking ..., please wait'; @@ -66,4 +66,33 @@ export function createStatusBarItem(context: vscode.ExtensionContext): vscode.St context.subscriptions.push(statusBarItem); return statusBarItem; +} + +export function createAskCodeStatusBarItem(context: vscode.ExtensionContext): vscode.StatusBarItem { + const askCodeBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100); + + askCodeBarItem.text = `AskCode`; + askCodeBarItem.tooltip = `Wait for check status for /ask-code`; + askCodeBarItem.command = undefined; + + setInterval(async () => { + if (isIndexingStopped()) { + if (isNeedIndexingCode()) { + askCodeBarItem.tooltip = `Click to index code for /ask-code`; + askCodeBarItem.command = 'DevChat.AskCodeIndexStart'; + } else { + askCodeBarItem.tooltip = `No need to index code for /ask-code`; + askCodeBarItem.command = undefined; + } + + } else { + askCodeBarItem.tooltip = `Click to stop indexing code for /ask-code`; + askCodeBarItem.command = 'DevChat.AskCodeIndexStop'; + } + }, 10000); + + askCodeBarItem.show(); + context.subscriptions.push(askCodeBarItem); + + return askCodeBarItem; } \ No newline at end of file diff --git a/src/util/askCodeUtil.ts b/src/util/askCodeUtil.ts new file mode 100644 index 0000000..dca7e44 --- /dev/null +++ b/src/util/askCodeUtil.ts @@ -0,0 +1,68 @@ +/* +Util for askCode +*/ + +import * as fs from 'fs'; +import * as path from 'path'; +import { UiUtilWrapper } from './uiUtil'; + +let indexingStatus = 'stopped'; // 'started' | 'indexing' | 'stopped' + +export function updateLastModifyTime() { + const workspaceFolder = UiUtilWrapper.workspaceFoldersFirstPath(); + if (!workspaceFolder) { + return; + } + + let files = fs.readdirSync(workspaceFolder).filter(file => !file.startsWith('.')); + + let lastModifyTime = {}; + for (let file of files) { + let stats = fs.statSync(path.join(workspaceFolder, file)); + lastModifyTime[file] = stats.mtime.toUTCString(); + } + + fs.writeFileSync(path.join(workspaceFolder, '.chat', '.lastModifyTime.json'), JSON.stringify(lastModifyTime)); +} + +export function isNeedIndexingCode() { + const workspaceFolder = UiUtilWrapper.workspaceFoldersFirstPath(); + if (!workspaceFolder) { + return false; + } + + let lastModifyTimeFile = path.join(workspaceFolder, '.chat', '.lastModifyTime.json'); + if (!fs.existsSync(lastModifyTimeFile)) { + return true; + } + + let files = fs.readdirSync(workspaceFolder).filter(file => !file.startsWith('.')); + + // load lastModifyTime from .chat/.lastModifyTime.json + let lastModifyTime = {}; + if (fs.existsSync(lastModifyTimeFile)) { + lastModifyTime = JSON.parse(fs.readFileSync(lastModifyTimeFile, 'utf-8')); + } + + for (let file of files) { + let stats = fs.statSync(path.join(workspaceFolder, file)); + if (!lastModifyTime[file] || stats.mtime.toUTCString() !== lastModifyTime[file]) { + return true; + } + } + if (Object.keys(lastModifyTime).length !== files.length) { + return true; + } + return false; +} + +export function updateIndexingStatus(status: string) { + if (status === "started") { + updateLastModifyTime(); + } + indexingStatus = status; +} + +export function isIndexingStopped() { + return indexingStatus === 'stopped'; +}