Skip to content

Commit e8cb6ff

Browse files
committed
Implement file uploads
1 parent 2be452d commit e8cb6ff

2 files changed

Lines changed: 351 additions & 232 deletions

File tree

scripts/vscode.patch

Lines changed: 141 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,30 @@
1+
diff --git a/src/vs/base/common/buffer.ts b/src/vs/base/common/buffer.ts
2+
index 7b4e9cc8d6..7722cb12c6 100644
3+
--- a/src/vs/base/common/buffer.ts
4+
+++ b/src/vs/base/common/buffer.ts
5+
@@ -138,7 +138,7 @@ export interface VSBufferReadable {
6+
* Read data from the underlying source. Will return
7+
* null to indicate that no more data can be read.
8+
*/
9+
- read(): VSBuffer | null;
10+
+ read(): VSBuffer | null | Promise<VSBuffer | null>;
11+
}
12+
13+
/**
14+
@@ -185,11 +185,11 @@ export interface VSBufferReadableStream {
15+
/**
16+
* Helper to fully read a VSBuffer readable into a single buffer.
17+
*/
18+
-export function readableToBuffer(readable: VSBufferReadable): VSBuffer {
19+
+export async function readableToBuffer(readable: VSBufferReadable): Promise<VSBuffer> {
20+
const chunks: VSBuffer[] = [];
21+
22+
let chunk: VSBuffer | null;
23+
- while (chunk = readable.read()) {
24+
+ while (chunk = await readable.read()) {
25+
chunks.push(chunk);
26+
}
27+
128
diff --git a/src/vs/editor/browser/services/openerService.ts b/src/vs/editor/browser/services/openerService.ts
229
index c175034f96..de7e29906a 100644
330
--- a/src/vs/editor/browser/services/openerService.ts
@@ -311,6 +338,36 @@ index 8e1b68eb36..2b6a0d5b15 100644
311338
+ return true;
312339
+ }
313340
+}
341+
diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts
342+
index 2054ceece3..f99dfd0b73 100644
343+
--- a/src/vs/workbench/browser/dnd.ts
344+
+++ b/src/vs/workbench/browser/dnd.ts
345+
@@ -31,6 +31,7 @@ import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsSe
346+
import { IRecentFile } from 'vs/platform/history/common/history';
347+
import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing';
348+
import { withNullAsUndefined } from 'vs/base/common/types';
349+
+import { IUploadService } from 'vs/server/src/upload';
350+
351+
export interface IDraggedResource {
352+
resource: URI;
353+
@@ -166,14 +167,15 @@ export class ResourcesDropHandler {
354+
@IUntitledEditorService private readonly untitledEditorService: IUntitledEditorService,
355+
@IEditorService private readonly editorService: IEditorService,
356+
@IConfigurationService private readonly configurationService: IConfigurationService,
357+
- @IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService
358+
+ @IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService,
359+
+ @IUploadService private readonly uploadService: IUploadService,
360+
) {
361+
}
362+
363+
async handleDrop(event: DragEvent, resolveTargetGroup: () => IEditorGroup | undefined, afterDrop: (targetGroup: IEditorGroup | undefined) => void, targetIndex?: number): Promise<void> {
364+
const untitledOrFileResources = extractResources(event).filter(r => this.fileService.canHandleResource(r.resource) || r.resource.scheme === Schemas.untitled);
365+
if (!untitledOrFileResources.length) {
366+
- return;
367+
+ return this.uploadService.handleDrop(event, resolveTargetGroup, afterDrop, targetIndex);
368+
}
369+
370+
// Make the window active to handle the drop properly within
314371
diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts
315372
index 1986fb6642..1bf169a4b4 100644
316373
--- a/src/vs/workbench/browser/web.main.ts
@@ -357,10 +414,10 @@ index 1986fb6642..1bf169a4b4 100644
357414
\ No newline at end of file
358415
+}
359416
diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts
360-
index b253e573ae..bde667d045 100644
417+
index b253e573ae..e23d9c970e 100644
361418
--- a/src/vs/workbench/browser/web.simpleservices.ts
362419
+++ b/src/vs/workbench/browser/web.simpleservices.ts
363-
@@ -53,6 +53,11 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
420+
@@ -53,6 +53,14 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
364421
import { ParsedArgs } from 'vs/platform/environment/common/environment';
365422
import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings';
366423
import { IProcessEnvironment } from 'vs/base/common/platform';
@@ -369,10 +426,13 @@ index b253e573ae..bde667d045 100644
369426
+import { ExtensionGalleryChannelClient } from 'vs/platform/extensionManagement/node/extensionGalleryIpc';
370427
+import { TelemetryChannelClient } from 'vs/platform/telemetry/node/telemetryIpc';
371428
+import { IProductService } from 'vs/platform/product/common/product';
429+
+import { IUploadService, UploadService } from 'vs/server/src/upload';
430+
+
431+
+registerSingleton(IUploadService, UploadService, true);
372432

373433
//#region Backup File
374434

375-
@@ -125,13 +130,11 @@ export class SimpleClipboardService implements IClipboardService {
435+
@@ -125,13 +133,11 @@ export class SimpleClipboardService implements IClipboardService {
376436
writeText(text: string, type?: string): void { }
377437

378438
readText(type?: string): string {
@@ -388,7 +448,7 @@ index b253e573ae..bde667d045 100644
388448
}
389449

390450
writeFindText(text: string): void { }
391-
@@ -239,7 +242,17 @@ export class SimpleExtensionGalleryService implements IExtensionGalleryService {
451+
@@ -239,7 +245,17 @@ export class SimpleExtensionGalleryService implements IExtensionGalleryService {
392452
}
393453
}
394454

@@ -407,7 +467,7 @@ index b253e573ae..bde667d045 100644
407467

408468
//#endregion
409469

410-
@@ -262,7 +275,7 @@ export class SimpleExtensionsWorkbenchService implements IExtensionsWorkbenchSer
470+
@@ -262,7 +278,7 @@ export class SimpleExtensionsWorkbenchService implements IExtensionsWorkbenchSer
411471
checkForUpdates: any;
412472
allowedBadgeProviders: string[];
413473
}
@@ -416,7 +476,7 @@ index b253e573ae..bde667d045 100644
416476
//#endregion
417477

418478
//#region ICommentService
419-
@@ -375,7 +388,10 @@ export class SimpleExtensionTipsService implements IExtensionTipsService {
479+
@@ -375,7 +391,10 @@ export class SimpleExtensionTipsService implements IExtensionTipsService {
420480
}
421481

422482
getAllIgnoredRecommendations(): { global: string[]; workspace: string[]; } {
@@ -428,7 +488,7 @@ index b253e573ae..bde667d045 100644
428488
}
429489
}
430490

431-
@@ -436,7 +452,16 @@ export class SimpleExtensionManagementService implements IExtensionManagementSer
491+
@@ -436,7 +455,16 @@ export class SimpleExtensionManagementService implements IExtensionManagementSer
432492
}
433493
}
434494

@@ -446,7 +506,7 @@ index b253e573ae..bde667d045 100644
446506

447507
//#endregion
448508

449-
@@ -680,7 +705,15 @@ export class SimpleTelemetryService implements ITelemetryService {
509+
@@ -680,7 +708,15 @@ export class SimpleTelemetryService implements ITelemetryService {
450510
}
451511
}
452512

@@ -463,7 +523,7 @@ index b253e573ae..bde667d045 100644
463523

464524
//#endregion
465525

466-
@@ -1288,4 +1321,4 @@ class SimpleTunnelService implements ITunnelService {
526+
@@ -1288,4 +1324,4 @@ class SimpleTunnelService implements ITunnelService {
467527

468528
registerSingleton(ITunnelService, SimpleTunnelService);
469529

@@ -1050,6 +1110,49 @@ index c08a6e37c1..31640d7e66 100644
10501110
}
10511111
return this._extensionAllowedBadgeProviders;
10521112
}
1113+
diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts
1114+
index 88ad0027e9..17476d5f26 100644
1115+
--- a/src/vs/workbench/contrib/files/browser/files.contribution.ts
1116+
+++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts
1117+
@@ -200,7 +200,7 @@ configurationRegistry.registerConfiguration({
1118+
'files.exclude': {
1119+
'type': 'object',
1120+
'markdownDescription': nls.localize('exclude', "Configure glob patterns for excluding files and folders. For example, the files explorer decides which files and folders to show or hide based on this setting. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)."),
1121+
- 'default': { '**/.git': true, '**/.svn': true, '**/.hg': true, '**/CVS': true, '**/.DS_Store': true },
1122+
+ 'default': { '**/.git': true, '**/.svn': true, '**/.hg': true, '**/CVS': true, '**/.DS_Store': true, '**/.code-server-partial-upload-*': true },
1123+
'scope': ConfigurationScope.RESOURCE,
1124+
'additionalProperties': {
1125+
'anyOf': [
1126+
diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts
1127+
index 4592b3918e..346292d086 100644
1128+
--- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts
1129+
+++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts
1130+
@@ -46,6 +46,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic
1131+
import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces';
1132+
import { findValidPasteFileTarget } from 'vs/workbench/contrib/files/browser/fileActions';
1133+
import { FuzzyScore, createMatches } from 'vs/base/common/filters';
1134+
+import { IUploadService } from 'vs/server/src/upload';
1135+
1136+
export class ExplorerDelegate implements IListVirtualDelegate<ExplorerItem> {
1137+
1138+
@@ -453,7 +454,8 @@ export class FileDragAndDrop implements ITreeDragAndDrop<ExplorerItem> {
1139+
@IInstantiationService private instantiationService: IInstantiationService,
1140+
@ITextFileService private textFileService: ITextFileService,
1141+
@IWindowService private windowService: IWindowService,
1142+
- @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService
1143+
+ @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService,
1144+
+ @IUploadService private readonly uploadService: IUploadService,
1145+
) {
1146+
this.toDispose = [];
1147+
1148+
@@ -615,6 +617,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop<ExplorerItem> {
1149+
1150+
1151+
private async handleExternalDrop(data: DesktopDragAndDropData, target: ExplorerItem, originalEvent: DragEvent): Promise<void> {
1152+
+ return this.uploadService.handleExternalDrop(data, target, originalEvent);
1153+
const droppedResources = extractResources(originalEvent, true);
1154+
// Check for dropped external files to be folders
1155+
const result = await this.fileService.resolveAll(droppedResources);
10531156
diff --git a/src/vs/workbench/contrib/remote/common/remote.contribution.ts b/src/vs/workbench/contrib/remote/common/remote.contribution.ts
10541157
index 9235c739fb..32d203eb32 100644
10551158
--- a/src/vs/workbench/contrib/remote/common/remote.contribution.ts
@@ -1148,6 +1251,35 @@ index 611ab9aec9..4e4bea89be 100644
11481251
-registerSingleton(IExtensionManagementServerService, ExtensionManagementServerService);
11491252
\ No newline at end of file
11501253
+registerSingleton(IExtensionManagementServerService, ExtensionManagementServerService);
1254+
diff --git a/src/vs/workbench/services/files/common/fileService.ts b/src/vs/workbench/services/files/common/fileService.ts
1255+
index a788aadc1f..09e6947fb7 100644
1256+
--- a/src/vs/workbench/services/files/common/fileService.ts
1257+
+++ b/src/vs/workbench/services/files/common/fileService.ts
1258+
@@ -859,7 +859,7 @@ export class FileService extends Disposable implements IFileService {
1259+
let posInFile = 0;
1260+
1261+
let chunk: VSBuffer | null;
1262+
- while (chunk = readable.read()) {
1263+
+ while (chunk = await readable.read()) {
1264+
await this.doWriteBuffer(provider, handle, chunk, chunk.byteLength, posInFile, 0);
1265+
1266+
posInFile += chunk.byteLength;
1267+
@@ -888,7 +888,7 @@ export class FileService extends Disposable implements IFileService {
1268+
if (bufferOrReadable instanceof VSBuffer) {
1269+
buffer = bufferOrReadable;
1270+
} else {
1271+
- buffer = readableToBuffer(bufferOrReadable);
1272+
+ buffer = await readableToBuffer(bufferOrReadable);
1273+
}
1274+
1275+
return provider.writeFile(resource, buffer.buffer, { create: true, overwrite: true });
1276+
@@ -1026,4 +1026,4 @@ export class FileService extends Disposable implements IFileService {
1277+
}
1278+
1279+
//#endregion
1280+
-}
1281+
\ No newline at end of file
1282+
+}
11511283
diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts
11521284
index c28adc0ad9..4517c308da 100644
11531285
--- a/src/vs/workbench/workbench.web.main.ts

0 commit comments

Comments
 (0)