From 2aba876807c7d38d09c3259b2cb878c67ea3d0f3 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 17 Feb 2025 14:08:54 +0800 Subject: [PATCH] feat: support copy relative path from link files (#4367) * feat: support copy relative path from link files * chore: add @opensumi/ide-utils dependency * chore: reorder @opensumi/ide-utils dependency * chore: update test coverage exclusions for notebook module * fix: handle leading separators in TreeNode paths and use fsPath for URIs --- jest.config.js | 3 ++- packages/components/src/recycle-tree/tree/TreeNode.ts | 6 ++++-- packages/file-tree-next/package.json | 1 + .../file-tree-next/src/browser/file-tree-contribution.ts | 9 ++++++++- .../src/browser/opened-editor-node.define.ts | 2 +- .../src/browser/services/opened-editor-tree.service.ts | 8 ++++---- yarn.lock | 1 + 7 files changed, 21 insertions(+), 9 deletions(-) diff --git a/jest.config.js b/jest.config.js index 43ce37b480..20f3e2e048 100644 --- a/jest.config.js +++ b/jest.config.js @@ -17,8 +17,9 @@ const baseConfig = { // 部分contribution文件为-contribution结尾 '!packages/**/*-contribution.ts', '!packages/startup/**/*.ts', - // Test 功能暂未完成 + // Test, Notebook 模块暂不覆盖 '!packages/testing/**/*.ts', + '!packages/notebook/**/*.ts', // CLI 不需要测试 '!packages/remote-cli/**/*.ts', '!packages/core-electron-main/**/*.ts', diff --git a/packages/components/src/recycle-tree/tree/TreeNode.ts b/packages/components/src/recycle-tree/tree/TreeNode.ts index 94261c5671..1fc0dbad8e 100644 --- a/packages/components/src/recycle-tree/tree/TreeNode.ts +++ b/packages/components/src/recycle-tree/tree/TreeNode.ts @@ -236,9 +236,11 @@ export class TreeNode implements ITreeNode { get path(): string { if (!this._path) { if (!this.parent) { - this._path = new Path(`${Path.separator}${this.name}`).toString(); + this._path = this.name.startsWith(Path.separator) ? this.name : `${Path.separator}${this.name}`; } else { - this._path = new Path(this.parent.path).join(this.name).toString(); + this._path = this.name.startsWith(Path.separator) + ? `${this.parent.path}${this.name}` + : `${this.parent.path}${Path.separator}${this.name}`; } } return this._path; diff --git a/packages/file-tree-next/package.json b/packages/file-tree-next/package.json index f4496f9d3e..aae6539306 100644 --- a/packages/file-tree-next/package.json +++ b/packages/file-tree-next/package.json @@ -32,6 +32,7 @@ "@opensumi/ide-overlay": "workspace:*", "@opensumi/ide-terminal-next": "workspace:*", "@opensumi/ide-theme": "workspace:*", + "@opensumi/ide-utils": "workspace:*", "@opensumi/ide-workspace": "workspace:*", "@opensumi/ide-workspace-edit": "workspace:*" } diff --git a/packages/file-tree-next/src/browser/file-tree-contribution.ts b/packages/file-tree-next/src/browser/file-tree-contribution.ts index bf0ff5170c..f7649fe4e6 100644 --- a/packages/file-tree-next/src/browser/file-tree-contribution.ts +++ b/packages/file-tree-next/src/browser/file-tree-contribution.ts @@ -50,6 +50,7 @@ import { EXPLORER_CONTAINER_ID } from '@opensumi/ide-explorer/lib/browser/explor import { IMainLayoutService, IViewsRegistry, MainLayoutContribution } from '@opensumi/ide-main-layout'; import { ViewContentGroups } from '@opensumi/ide-main-layout/lib/browser/views-registry'; import { IOpenDialogOptions, ISaveDialogOptions, IWindowDialogService } from '@opensumi/ide-overlay'; +import { Path } from '@opensumi/ide-utils/lib/path'; import { IWorkspaceService, UNTITLED_WORKSPACE } from '@opensumi/ide-workspace'; import { IFileTreeService, PasteTypes, RESOURCE_VIEW_ID } from '../common'; @@ -778,9 +779,15 @@ export class FileTreeContribution } if (uri.scheme === DIFF_SCHEME) { const query = uri.getParsedQuery(); - // 需要file scheme才能与工作区计算相对路径 uri = new URI(query.modified).withScheme('file'); } + const node = this.fileTreeService.getNodeByPathOrUri(uri); + if (node) { + if (node.filestat.isInSymbolicDirectory) { + // 软链接文件需要通过直接通过文件树 Path 获取 + return await this.clipboardService.writeText(node.path.split(Path.separator).slice(2).join(Path.separator)); + } + } let rootUri: URI; if (this.fileTreeService.isMultipleWorkspace) { // 多工作区额外处理 diff --git a/packages/opened-editor/src/browser/opened-editor-node.define.ts b/packages/opened-editor/src/browser/opened-editor-node.define.ts index 93750fcdb8..0c7601b22e 100644 --- a/packages/opened-editor/src/browser/opened-editor-node.define.ts +++ b/packages/opened-editor/src/browser/opened-editor-node.define.ts @@ -70,7 +70,7 @@ export class EditorFile extends TreeNode { public dirty: boolean = false, parent: EditorFileGroup | undefined, ) { - super(tree as ITree, parent, undefined, { name: `${resource.uri.toString()}` }); + super(tree as ITree, parent, undefined, { name: `${resource.uri.codeUri.fsPath.toString()}` }); } get displayName() { diff --git a/packages/opened-editor/src/browser/services/opened-editor-tree.service.ts b/packages/opened-editor/src/browser/services/opened-editor-tree.service.ts index b154b9560a..dc0add64c0 100644 --- a/packages/opened-editor/src/browser/services/opened-editor-tree.service.ts +++ b/packages/opened-editor/src/browser/services/opened-editor-tree.service.ts @@ -127,16 +127,16 @@ export class OpenedEditorService extends Tree { .join(groupName) .join( resource && (resource as IResource).uri - ? (resource as IResource).uri.toString() - : (resource as URI).toString(), + ? (resource as IResource).uri.codeUri.fsPath + : (resource as URI).codeUri.fsPath, ) .toString(); } else { path = new Path(path) .join( resource && (resource as IResource).uri - ? (resource as IResource).uri.toString() - : (resource as URI).toString(), + ? (resource as IResource).uri.codeUri.fsPath + : (resource as URI).codeUri.fsPath, ) .toString(); } diff --git a/yarn.lock b/yarn.lock index 528552bd0b..b530f12fdb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3731,6 +3731,7 @@ __metadata: "@opensumi/ide-overlay": "workspace:*" "@opensumi/ide-terminal-next": "workspace:*" "@opensumi/ide-theme": "workspace:*" + "@opensumi/ide-utils": "workspace:*" "@opensumi/ide-workspace": "workspace:*" "@opensumi/ide-workspace-edit": "workspace:*" languageName: unknown