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