From 23f447c0ed472f843b80f779c5f873ffa5a12417 Mon Sep 17 00:00:00 2001 From: Matt Wise Date: Sun, 11 Feb 2024 23:19:14 -0600 Subject: [PATCH 1/3] fix s3 downloads resulting in flat folder structure Signed-off-by: Matt Wise --- packages/backend-common/src/reading/AwsS3UrlReader.ts | 3 ++- .../src/reading/tree/ReadableArrayResponse.ts | 11 ++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/backend-common/src/reading/AwsS3UrlReader.ts b/packages/backend-common/src/reading/AwsS3UrlReader.ts index 23ef0f7b27..3ba4eebb48 100644 --- a/packages/backend-common/src/reading/AwsS3UrlReader.ts +++ b/packages/backend-common/src/reading/AwsS3UrlReader.ts @@ -46,6 +46,7 @@ import { import { AbortController } from '@aws-sdk/abort-controller'; import { ReadUrlResponseFactory } from './ReadUrlResponseFactory'; import { Readable } from 'stream'; +import { relative } from 'path/posix'; export const DEFAULT_REGION = 'us-east-1'; @@ -345,7 +346,7 @@ export class AwsS3UrlReader implements UrlReader { responses.push({ data: s3ObjectData, - path: String(allObjects[i]), + path: relative(path, String(allObjects[i])), lastModifiedAt: response?.LastModified ?? undefined, }); } diff --git a/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts b/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts index 1429931142..3c8bfd1fbc 100644 --- a/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts +++ b/packages/backend-common/src/reading/tree/ReadableArrayResponse.ts @@ -15,7 +15,7 @@ */ import concatStream from 'concat-stream'; -import platformPath, { basename } from 'path'; +import platformPath, { dirname } from 'path'; import getRawBody from 'raw-body'; import fs from 'fs-extra'; @@ -96,12 +96,9 @@ export class ReadableArrayResponse implements ReadTreeResponse { for (let i = 0; i < this.stream.length; i++) { if (!this.stream[i].path.endsWith('/')) { - await pipeline( - this.stream[i].data, - fs.createWriteStream( - platformPath.join(dir, basename(this.stream[i].path)), - ), - ); + const filePath = platformPath.join(dir, this.stream[i].path); + await fs.mkdir(dirname(filePath), { recursive: true }); + await pipeline(this.stream[i].data, fs.createWriteStream(filePath)); } } From 497382cc184633729e7c71e3bfd960257f344b83 Mon Sep 17 00:00:00 2001 From: Matt Wise Date: Mon, 12 Feb 2024 01:20:46 -0600 Subject: [PATCH 2/3] update unit test for ReadableArrayResponse to handle subdir/relativePath Signed-off-by: Matt Wise --- .../src/reading/tree/ReadableArrayResponse.test.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts b/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts index 0a27bdf09c..e2bfe1af59 100644 --- a/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts +++ b/packages/backend-common/src/reading/tree/ReadableArrayResponse.test.ts @@ -19,6 +19,7 @@ import path from 'path'; import { FromReadableArrayOptions } from '../types'; import { ReadableArrayResponse } from './ReadableArrayResponse'; import { createMockDirectory } from '@backstage/backend-test-utils'; +import { relative } from 'path/posix'; const name1 = 'file1.yaml'; const file1 = fs.readFileSync( @@ -74,9 +75,12 @@ describe('ReadableArrayResponse', () => { }); it('should extract entire archive into directory', async () => { + const relativePath1 = relative(sourceDir.path, path1); + const relativePath2 = relative(sourceDir.path, path2); + const arr: FromReadableArrayOptions = [ - { data: createReadStream(path1), path: path1 }, - { data: createReadStream(path2), path: path2 }, + { data: createReadStream(path1), path: relativePath1 }, + { data: createReadStream(path2), path: relativePath2 }, ]; const res = new ReadableArrayResponse(arr, targetDir.path, 'etag'); From 842171ababafb851264349cf3540dd6e0e2c7d6f Mon Sep 17 00:00:00 2001 From: Matt Wise Date: Mon, 12 Feb 2024 15:35:15 -0600 Subject: [PATCH 3/3] add changeset Signed-off-by: Matt Wise --- .changeset/brown-peaches-hunt.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/brown-peaches-hunt.md diff --git a/.changeset/brown-peaches-hunt.md b/.changeset/brown-peaches-hunt.md new file mode 100644 index 0000000000..fc10acc211 --- /dev/null +++ b/.changeset/brown-peaches-hunt.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Fix a bug with S3 Fetch that caused all objects to be flattened within a single folder on the local file system.