diff --git a/packages/backend-common/src/reading/GithubUrlReader.test.ts b/packages/backend-common/src/reading/GithubUrlReader.test.ts index 7552547924..e165745790 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.test.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.test.ts @@ -293,7 +293,7 @@ describe('GithubUrlReader', () => { ); mockfs(); - const directory = await response.dir('/tmp/fs'); + const directory = await response.dir({ targetDir: '/tmp/fs' }); const writtenToDirectory = fs.existsSync(directory); const paths = await recursive(directory); diff --git a/packages/backend-common/src/reading/GithubUrlReader.ts b/packages/backend-common/src/reading/GithubUrlReader.ts index 41db541f7f..e3a47ee420 100644 --- a/packages/backend-common/src/reading/GithubUrlReader.ts +++ b/packages/backend-common/src/reading/GithubUrlReader.ts @@ -18,7 +18,13 @@ import { Config } from '@backstage/config'; import parseGitUri from 'git-url-parse'; import fetch from 'cross-fetch'; import { NotFoundError } from '../errors'; -import { ReaderFactory, ReadTreeResponse, UrlReader, File } from './types'; +import { + ReaderFactory, + ReadTreeResponse, + UrlReader, + File, + ReadTreeResponseDirOptions, +} from './types'; import tar from 'tar'; import fs from 'fs-extra'; import concatStream from 'concat-stream'; @@ -294,9 +300,10 @@ export class GithubUrlReader implements UrlReader { resolve(Buffer.from('Archive is not yet implemented')), ); }, - dir: (outDir: string | undefined) => { + dir: (options?: ReadTreeResponseDirOptions) => { const targetDirectory = - outDir || fs.mkdtempSync(path.join(os.tmpdir(), 'backstage-')); + options?.targetDir || + fs.mkdtempSync(path.join(os.tmpdir(), 'backstage-')); return new Promise((res, rej) => { Promise.all( diff --git a/packages/backend-common/src/reading/types.ts b/packages/backend-common/src/reading/types.ts index d9fa5d839e..8a78e9d65f 100644 --- a/packages/backend-common/src/reading/types.ts +++ b/packages/backend-common/src/reading/types.ts @@ -17,6 +17,11 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; +export type ReadTreeOptions = { + /** A filter that can be used to select which files should be extracted. By default all files are extracted */ + filter?(path: string): boolean; +}; + /** * A generic interface for fetching plain data from URLs. */ @@ -48,8 +53,13 @@ export type File = { content(): Promise; }; +export type ReadTreeResponseDirOptions = { + /** The directory to write files to. Defaults to the OS tmpdir or `backend.workingDirectory` if set in config */ + targetDir?: string; +}; + export type ReadTreeResponse = { files(): Promise; archive(): Promise; - dir(outDir?: string): Promise; + dir(options?: ReadTreeResponseDirOptions): Promise; };