Skip to content

Commit 980ccbb

Browse files
fix(s3): filesystem provider is not case-sensitive #3277
Problem: The s3 filesystem provider is not case-sensitive, so requesting a path like /aws/Test/temp.json matches /aws/test/temp.json. Solution: Set the case sensitive flag when registering the filesystem provider. Signed-off-by: Nikolas Komonen <[email protected]>
1 parent 3a22329 commit 980ccbb

File tree

2 files changed

+52
-6
lines changed

2 files changed

+52
-6
lines changed

src/s3/activation.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ export async function activate(ctx: ExtContext): Promise<void> {
3939

4040
ctx.extensionContext.subscriptions.push(manager)
4141
ctx.extensionContext.subscriptions.push(
42-
vscode.workspace.registerFileSystemProvider(s3EditScheme, fs),
43-
vscode.workspace.registerFileSystemProvider(s3ReadScheme, fs, { isReadonly: true }),
42+
vscode.workspace.registerFileSystemProvider(s3EditScheme, fs, { isCaseSensitive: true }),
43+
vscode.workspace.registerFileSystemProvider(s3ReadScheme, fs, { isReadonly: true, isCaseSensitive: true }),
4444
Commands.register('aws.s3.copyPath', async (node: S3FolderNode | S3FileNode) => {
4545
await copyPathCommand(node)
4646
}),

src/test/s3/util/fileViewerManager.test.ts

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,13 @@ describe('FileViewerManager', function () {
187187
return window.visibleTextEditors.filter(e => e.document.fileName.endsWith(documentName))
188188
}
189189

190+
function registerFileSystemProviders(isCaseSensitive: boolean = true): vscode.Disposable[] {
191+
return [
192+
vscode.workspace.registerFileSystemProvider(editScheme, fs, { isCaseSensitive }),
193+
vscode.workspace.registerFileSystemProvider(readScheme, fs, { isReadonly: true, isCaseSensitive }),
194+
]
195+
}
196+
190197
beforeEach(function () {
191198
s3 = createS3()
192199
fs = new VirualFileSystem()
@@ -196,10 +203,7 @@ describe('FileViewerManager', function () {
196203
edit: editScheme,
197204
})
198205

199-
disposables = [
200-
vscode.workspace.registerFileSystemProvider(editScheme, fs),
201-
vscode.workspace.registerFileSystemProvider(readScheme, fs, { isReadonly: true }),
202-
]
206+
disposables = registerFileSystemProviders()
203207
})
204208

205209
afterEach(async function () {
@@ -303,5 +307,47 @@ describe('FileViewerManager', function () {
303307
const err = await fileViewerManager.openInReadMode({ ...file, bucket }).catch(e => e)
304308
assert.ok(err instanceof ToolkitError)
305309
})
310+
311+
it('is case-sensitive for file names', async function () {
312+
// Create and assert content of file with lowercase name
313+
const lowerCaseFileContent = 'lowercaseContent'
314+
const lowerCaseFile = makeFile('myFile.txt', Buffer.from(lowerCaseFileContent, 'utf-8'))
315+
s3.addFile(lowerCaseFile)
316+
await fileViewerManager.openInReadMode({ ...lowerCaseFile, bucket })
317+
await assertTextEditorContains(lowerCaseFileContent)
318+
319+
// Create similarily named file, but with different uppercase in name
320+
const upperCaseFileContent = 'uppercaseContent'
321+
const upperCaseFile = makeFile('MyFile.txt', Buffer.from(upperCaseFileContent, 'utf-8'))
322+
s3.addFile(upperCaseFile)
323+
await fileViewerManager.openInReadMode({ ...upperCaseFile, bucket })
324+
await assertTextEditorContains(upperCaseFileContent)
325+
})
326+
})
327+
328+
describe('file uri case insensitivity', function () {
329+
beforeEach(function () {
330+
vscode.Disposable.from(...disposables).dispose()
331+
// Case insensitive file system providers
332+
disposables = registerFileSystemProviders(false)
333+
})
334+
335+
it('opens an existing file since names are the same', async function () {
336+
// Create and assert content of file with lowercase name
337+
const lowerCaseFileContent = 'lowercaseContent'
338+
const lowerCaseFile = makeFile('file.txt', Buffer.from(lowerCaseFileContent, 'utf-8'))
339+
s3.addFile(lowerCaseFile)
340+
await fileViewerManager.openInReadMode({ ...lowerCaseFile, bucket })
341+
await assertTextEditorContains(lowerCaseFileContent)
342+
343+
// Create similarily named file, but with uppercase character
344+
const upperCaseFileContent = 'uppercaseContent'
345+
const upperCaseFile = makeFile('File.txt', Buffer.from(upperCaseFileContent, 'utf-8'))
346+
s3.addFile(upperCaseFile)
347+
348+
// Attempt to open uppercase file opens existing lowercase file instead
349+
await fileViewerManager.openInReadMode({ ...upperCaseFile, bucket })
350+
await assertTextEditorContains(lowerCaseFileContent)
351+
})
306352
})
307353
})

0 commit comments

Comments
 (0)