Skip to content

Commit df73086

Browse files
authored
fix(amazonq): allow customer to modify root source folder (#4985)
1 parent d5211b7 commit df73086

File tree

4 files changed

+30
-5
lines changed

4 files changed

+30
-5
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Bug Fix",
3+
"description": "Fixes an issue where the /dev chat wouldn't let customers modify the source folder when exceeding the size limit"
4+
}

packages/core/src/amazonqFeatureDev/util/files.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { CurrentWsFolders } from '../types'
1616
import { ToolkitError } from '../../shared/errors'
1717
import { AmazonqCreateUpload, Metric } from '../../shared/telemetry/telemetry'
1818
import { TelemetryHelper } from './telemetryHelper'
19+
import { maxRepoSizeBytes } from '../constants'
1920

2021
const getSha256 = (file: Buffer) => createHash('sha256').update(file).digest('base64')
2122

@@ -29,7 +30,7 @@ export async function prepareRepoData(
2930
span: Metric<AmazonqCreateUpload>
3031
) {
3132
try {
32-
const files = await collectFiles(repoRootPaths, workspaceFolders, true)
33+
const files = await collectFiles(repoRootPaths, workspaceFolders, true, maxRepoSizeBytes)
3334
const zip = new AdmZip()
3435

3536
let totalBytes = 0
@@ -55,8 +56,8 @@ export async function prepareRepoData(
5556
}
5657
} catch (error) {
5758
getLogger().debug(`featureDev: Failed to prepare repo: ${error}`)
58-
if (error instanceof ContentLengthError) {
59-
throw error
59+
if (error instanceof ToolkitError && error.code === 'ContentLengthError') {
60+
throw new ContentLengthError()
6061
}
6162
throw new PrepareRepoFailedError()
6263
}

packages/core/src/shared/utilities/workspaceUtils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { getGlobDirExcludedPatterns } from '../fs/watchedFiles'
1616
import { sanitizeFilename } from './textUtilities'
1717
import { GitIgnoreAcceptor } from '@gerhobbelt/gitignore-parser'
1818
import * as parser from '@gerhobbelt/gitignore-parser'
19+
import { fsCommon } from '../../srcShared/fs'
1920

2021
type GitIgnoreRelativeAcceptor = {
2122
folderPath: string
@@ -351,7 +352,7 @@ export async function collectFiles(
351352
continue
352353
}
353354

354-
const fileStat = await vscode.workspace.fs.stat(file)
355+
const fileStat = await fsCommon.stat(file)
355356
if (totalSizeBytes + fileStat.size > maxSize) {
356357
throw new ToolkitError(
357358
'The project you have selected for source code is too large to use as context. Please select a different folder to use',

packages/core/src/test/amazonqFeatureDev/util/files.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
5+
import * as vscode from 'vscode'
66
import assert from 'assert'
77
import { prepareRepoData } from '../../../amazonqFeatureDev/util/files'
88
import { createTestWorkspace } from '../../testUtil'
99
import { TelemetryHelper } from '../../../amazonqFeatureDev/util/telemetryHelper'
1010
import { AmazonqCreateUpload, Metric } from '../../../shared/telemetry/telemetry'
11+
import { ContentLengthError } from '../../../amazonqFeatureDev/errors'
12+
import { maxRepoSizeBytes } from '../../../amazonqFeatureDev/constants'
13+
import sinon from 'sinon'
14+
import { fsCommon } from '../../../srcShared/fs'
1115

1216
describe('file utils', () => {
1317
describe('prepareRepoData', function () {
@@ -28,5 +32,20 @@ describe('file utils', () => {
2832
assert.strictEqual(result.zipFileChecksum.length, 44)
2933
assert.strictEqual(telemetry.repositorySize, 24)
3034
})
35+
36+
// Test the logic that allows the customer to modify root source folder
37+
it('prepareRepoData throws a ContentLengthError code when repo is too big', async function () {
38+
const workspace = await createTestWorkspace(1, {})
39+
const telemetry = new TelemetryHelper()
40+
41+
sinon.stub(fsCommon, 'stat').resolves({ size: 2 * maxRepoSizeBytes } as vscode.FileStat)
42+
await assert.rejects(
43+
() =>
44+
prepareRepoData([workspace.uri.fsPath], [workspace], telemetry, {
45+
record: () => {},
46+
} as unknown as Metric<AmazonqCreateUpload>),
47+
ContentLengthError
48+
)
49+
})
3150
})
3251
})

0 commit comments

Comments
 (0)