19657025fSTomasz Sapetaimport chalk from 'chalk'; 29657025fSTomasz Sapetaimport fs from 'fs-extra'; 3*a272999eSBartosz Kaszubowskiimport path from 'path'; 4*a272999eSBartosz Kaszubowski 59657025fSTomasz Sapetaimport { toRepoPath, findFiles } from '../utils'; 6*a272999eSBartosz Kaszubowskiimport { Task } from './Task'; 79657025fSTomasz Sapeta 89657025fSTomasz Sapetaexport type CopyFilesSettings = { 99657025fSTomasz Sapeta from?: string; 109657025fSTomasz Sapeta subDirectory?: string; 119657025fSTomasz Sapeta filePattern: string | string[]; 129657025fSTomasz Sapeta to: string; 139657025fSTomasz Sapeta}; 149657025fSTomasz Sapeta 159657025fSTomasz Sapeta/** 169657025fSTomasz Sapeta * A task which will copy files from `workingDirectory()/subDirectory/filePatterns` to the provided path. 179657025fSTomasz Sapeta * 189657025fSTomasz Sapeta * It's searching for file names which match `filePatterns` and then it copies them into `to/<matched_part_of_file_name>`. 199657025fSTomasz Sapeta * So the `subDirectory` part won't be copied. 209657025fSTomasz Sapeta * 219657025fSTomasz Sapeta * If for this file structure: 229657025fSTomasz Sapeta * 239657025fSTomasz Sapeta * ``` 249657025fSTomasz Sapeta * android/ 259657025fSTomasz Sapeta * src/ 269657025fSTomasz Sapeta * main.java 279657025fSTomasz Sapeta * lib/ 289657025fSTomasz Sapeta * lib.java 299657025fSTomasz Sapeta * ``` 309657025fSTomasz Sapeta * 319657025fSTomasz Sapeta * you runs CopyFiles with: 329657025fSTomasz Sapeta * ``` 339657025fSTomasz Sapeta * { 349657025fSTomasz Sapeta * from: 'android', 359657025fSTomasz Sapeta * subDirectory: 'src|lib', 369657025fSTomasz Sapeta * to: 'copied', 379657025fSTomasz Sapeta * filePatterns: '*' 389657025fSTomasz Sapeta * } 399657025fSTomasz Sapeta * ``` 409657025fSTomasz Sapeta * you gets: 419657025fSTomasz Sapeta * ``` 429657025fSTomasz Sapeta * android/ 439657025fSTomasz Sapeta * src/ 449657025fSTomasz Sapeta * main.java 459657025fSTomasz Sapeta * lib/ 469657025fSTomasz Sapeta * lib.java 479657025fSTomasz Sapeta * lib/ 489657025fSTomasz Sapeta * main.java 499657025fSTomasz Sapeta * lib.java 509657025fSTomasz Sapeta * ``` 519657025fSTomasz Sapeta */ 529657025fSTomasz Sapetaexport class CopyFiles extends Task { 539657025fSTomasz Sapeta private from?: string; 549657025fSTomasz Sapeta private subDirectory?: string; 559657025fSTomasz Sapeta private readonly filePattern: string[]; 569657025fSTomasz Sapeta private readonly to: string; 579657025fSTomasz Sapeta 589657025fSTomasz Sapeta /** 599657025fSTomasz Sapeta * Using `from` key, you can override the work directory. 609657025fSTomasz Sapeta * @param settings 619657025fSTomasz Sapeta */ 629657025fSTomasz Sapeta constructor({ from, subDirectory, filePattern, to }: CopyFilesSettings) { 639657025fSTomasz Sapeta super(); 649657025fSTomasz Sapeta this.from = from; 659657025fSTomasz Sapeta this.subDirectory = subDirectory; 669657025fSTomasz Sapeta this.to = toRepoPath(to); 679657025fSTomasz Sapeta if (typeof filePattern === 'string') { 689657025fSTomasz Sapeta this.filePattern = [filePattern]; 699657025fSTomasz Sapeta } else { 709657025fSTomasz Sapeta this.filePattern = filePattern; 719657025fSTomasz Sapeta } 729657025fSTomasz Sapeta } 739657025fSTomasz Sapeta 74*a272999eSBartosz Kaszubowski protected overrideWorkingDirectory(): string { 75*a272999eSBartosz Kaszubowski return this.from || '<workingDirectory>'; 769657025fSTomasz Sapeta } 779657025fSTomasz Sapeta 789657025fSTomasz Sapeta async execute() { 799657025fSTomasz Sapeta const workDirectory = this.getWorkingDirectory(); 809657025fSTomasz Sapeta 819657025fSTomasz Sapeta for (const pattern of this.filePattern) { 829657025fSTomasz Sapeta const subPath = this.subDirectory 839657025fSTomasz Sapeta ? path.join(workDirectory, this.subDirectory) 849657025fSTomasz Sapeta : workDirectory; 859657025fSTomasz Sapeta 869657025fSTomasz Sapeta this.logSubStep( 87*a272999eSBartosz Kaszubowski ` copy ${chalk.green(this.overrideWorkingDirectory())}/${chalk.green( 889657025fSTomasz Sapeta this.subDirectory ? this.subDirectory + '/' : '' 899657025fSTomasz Sapeta )}${chalk.yellow(pattern)} into ${chalk.magenta(this.to)}` 909657025fSTomasz Sapeta ); 919657025fSTomasz Sapeta 929657025fSTomasz Sapeta const files = await findFiles(subPath, pattern); 939657025fSTomasz Sapeta await Promise.all( 949657025fSTomasz Sapeta files.map(async (file) => { 959657025fSTomasz Sapeta const relativeFilePath = path.relative(subPath, file); 969657025fSTomasz Sapeta const destinationFullPath = path.join(this.to, relativeFilePath); 979657025fSTomasz Sapeta 989657025fSTomasz Sapeta await fs.mkdirs(path.dirname(destinationFullPath)); 999657025fSTomasz Sapeta return await fs.copy(file, destinationFullPath); 1009657025fSTomasz Sapeta }) 1019657025fSTomasz Sapeta ); 1029657025fSTomasz Sapeta } 1039657025fSTomasz Sapeta } 1049657025fSTomasz Sapeta} 105