summaryrefslogtreecommitdiff
path: root/std/fs/copy.ts
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2021-02-02 19:05:46 +0800
committerGitHub <noreply@github.com>2021-02-02 12:05:46 +0100
commit6abf126c2a7a451cded8c6b5e6ddf1b69c84055d (patch)
treefd94c013a19fcb38954844085821ec1601c20e18 /std/fs/copy.ts
parenta2b5d44f1aa9d64f448a2a3cc2001272e2f60b98 (diff)
chore: remove std directory (#9361)
This removes the std folder from the tree. Various parts of the tests are pretty tightly dependent on std (47 direct imports and 75 indirect imports, not counting the cli tests that use them as fixtures) so I've added std as a submodule for now.
Diffstat (limited to 'std/fs/copy.ts')
-rw-r--r--std/fs/copy.ts307
1 files changed, 0 insertions, 307 deletions
diff --git a/std/fs/copy.ts b/std/fs/copy.ts
deleted file mode 100644
index 05ea6056b..000000000
--- a/std/fs/copy.ts
+++ /dev/null
@@ -1,307 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-import * as path from "../path/mod.ts";
-import { ensureDir, ensureDirSync } from "./ensure_dir.ts";
-import { getFileInfoType, isSubdir } from "./_util.ts";
-import { assert } from "../_util/assert.ts";
-import { isWindows } from "../_util/os.ts";
-
-export interface CopyOptions {
- /**
- * overwrite existing file or directory. Default is `false`
- */
- overwrite?: boolean;
- /**
- * When `true`, will set last modification and access times to the ones of the
- * original source files.
- * When `false`, timestamp behavior is OS-dependent.
- * Default is `false`.
- */
- preserveTimestamps?: boolean;
-}
-
-interface InternalCopyOptions extends CopyOptions {
- /**
- * default is `false`
- */
- isFolder?: boolean;
-}
-
-async function ensureValidCopy(
- src: string,
- dest: string,
- options: InternalCopyOptions,
-): Promise<Deno.FileInfo | undefined> {
- let destStat: Deno.FileInfo;
-
- try {
- destStat = await Deno.lstat(dest);
- } catch (err) {
- if (err instanceof Deno.errors.NotFound) {
- return;
- }
- throw err;
- }
-
- if (options.isFolder && !destStat.isDirectory) {
- throw new Error(
- `Cannot overwrite non-directory '${dest}' with directory '${src}'.`,
- );
- }
- if (!options.overwrite) {
- throw new Error(`'${dest}' already exists.`);
- }
-
- return destStat;
-}
-
-function ensureValidCopySync(
- src: string,
- dest: string,
- options: InternalCopyOptions,
-): Deno.FileInfo | undefined {
- let destStat: Deno.FileInfo;
- try {
- destStat = Deno.lstatSync(dest);
- } catch (err) {
- if (err instanceof Deno.errors.NotFound) {
- return;
- }
- throw err;
- }
-
- if (options.isFolder && !destStat.isDirectory) {
- throw new Error(
- `Cannot overwrite non-directory '${dest}' with directory '${src}'.`,
- );
- }
- if (!options.overwrite) {
- throw new Error(`'${dest}' already exists.`);
- }
-
- return destStat;
-}
-
-/* copy file to dest */
-async function copyFile(
- src: string,
- dest: string,
- options: InternalCopyOptions,
-): Promise<void> {
- await ensureValidCopy(src, dest, options);
- await Deno.copyFile(src, dest);
- if (options.preserveTimestamps) {
- const statInfo = await Deno.stat(src);
- assert(statInfo.atime instanceof Date, `statInfo.atime is unavailable`);
- assert(statInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
- await Deno.utime(dest, statInfo.atime, statInfo.mtime);
- }
-}
-/* copy file to dest synchronously */
-function copyFileSync(
- src: string,
- dest: string,
- options: InternalCopyOptions,
-): void {
- ensureValidCopySync(src, dest, options);
- Deno.copyFileSync(src, dest);
- if (options.preserveTimestamps) {
- const statInfo = Deno.statSync(src);
- assert(statInfo.atime instanceof Date, `statInfo.atime is unavailable`);
- assert(statInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
- Deno.utimeSync(dest, statInfo.atime, statInfo.mtime);
- }
-}
-
-/* copy symlink to dest */
-async function copySymLink(
- src: string,
- dest: string,
- options: InternalCopyOptions,
-): Promise<void> {
- await ensureValidCopy(src, dest, options);
- const originSrcFilePath = await Deno.readLink(src);
- const type = getFileInfoType(await Deno.lstat(src));
- if (isWindows) {
- await Deno.symlink(originSrcFilePath, dest, {
- type: type === "dir" ? "dir" : "file",
- });
- } else {
- await Deno.symlink(originSrcFilePath, dest);
- }
- if (options.preserveTimestamps) {
- const statInfo = await Deno.lstat(src);
- assert(statInfo.atime instanceof Date, `statInfo.atime is unavailable`);
- assert(statInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
- await Deno.utime(dest, statInfo.atime, statInfo.mtime);
- }
-}
-
-/* copy symlink to dest synchronously */
-function copySymlinkSync(
- src: string,
- dest: string,
- options: InternalCopyOptions,
-): void {
- ensureValidCopySync(src, dest, options);
- const originSrcFilePath = Deno.readLinkSync(src);
- const type = getFileInfoType(Deno.lstatSync(src));
- if (isWindows) {
- Deno.symlinkSync(originSrcFilePath, dest, {
- type: type === "dir" ? "dir" : "file",
- });
- } else {
- Deno.symlinkSync(originSrcFilePath, dest);
- }
-
- if (options.preserveTimestamps) {
- const statInfo = Deno.lstatSync(src);
- assert(statInfo.atime instanceof Date, `statInfo.atime is unavailable`);
- assert(statInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
- Deno.utimeSync(dest, statInfo.atime, statInfo.mtime);
- }
-}
-
-/* copy folder from src to dest. */
-async function copyDir(
- src: string,
- dest: string,
- options: CopyOptions,
-): Promise<void> {
- const destStat = await ensureValidCopy(src, dest, {
- ...options,
- isFolder: true,
- });
-
- if (!destStat) {
- await ensureDir(dest);
- }
-
- if (options.preserveTimestamps) {
- const srcStatInfo = await Deno.stat(src);
- assert(srcStatInfo.atime instanceof Date, `statInfo.atime is unavailable`);
- assert(srcStatInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
- await Deno.utime(dest, srcStatInfo.atime, srcStatInfo.mtime);
- }
-
- for await (const entry of Deno.readDir(src)) {
- const srcPath = path.join(src, entry.name);
- const destPath = path.join(dest, path.basename(srcPath as string));
- if (entry.isSymlink) {
- await copySymLink(srcPath, destPath, options);
- } else if (entry.isDirectory) {
- await copyDir(srcPath, destPath, options);
- } else if (entry.isFile) {
- await copyFile(srcPath, destPath, options);
- }
- }
-}
-
-/* copy folder from src to dest synchronously */
-function copyDirSync(src: string, dest: string, options: CopyOptions): void {
- const destStat = ensureValidCopySync(src, dest, {
- ...options,
- isFolder: true,
- });
-
- if (!destStat) {
- ensureDirSync(dest);
- }
-
- if (options.preserveTimestamps) {
- const srcStatInfo = Deno.statSync(src);
- assert(srcStatInfo.atime instanceof Date, `statInfo.atime is unavailable`);
- assert(srcStatInfo.mtime instanceof Date, `statInfo.mtime is unavailable`);
- Deno.utimeSync(dest, srcStatInfo.atime, srcStatInfo.mtime);
- }
-
- for (const entry of Deno.readDirSync(src)) {
- assert(entry.name != null, "file.name must be set");
- const srcPath = path.join(src, entry.name);
- const destPath = path.join(dest, path.basename(srcPath as string));
- if (entry.isSymlink) {
- copySymlinkSync(srcPath, destPath, options);
- } else if (entry.isDirectory) {
- copyDirSync(srcPath, destPath, options);
- } else if (entry.isFile) {
- copyFileSync(srcPath, destPath, options);
- }
- }
-}
-
-/**
- * Copy a file or directory. The directory can have contents. Like `cp -r`.
- * Requires the `--allow-read` and `--allow-write` flag.
- * @param src the file/directory path.
- * Note that if `src` is a directory it will copy everything inside
- * of this directory, not the entire directory itself
- * @param dest the destination path. Note that if `src` is a file, `dest` cannot
- * be a directory
- * @param options
- */
-export async function copy(
- src: string,
- dest: string,
- options: CopyOptions = {},
-): Promise<void> {
- src = path.resolve(src);
- dest = path.resolve(dest);
-
- if (src === dest) {
- throw new Error("Source and destination cannot be the same.");
- }
-
- const srcStat = await Deno.lstat(src);
-
- if (srcStat.isDirectory && isSubdir(src, dest)) {
- throw new Error(
- `Cannot copy '${src}' to a subdirectory of itself, '${dest}'.`,
- );
- }
-
- if (srcStat.isSymlink) {
- await copySymLink(src, dest, options);
- } else if (srcStat.isDirectory) {
- await copyDir(src, dest, options);
- } else if (srcStat.isFile) {
- await copyFile(src, dest, options);
- }
-}
-
-/**
- * Copy a file or directory. The directory can have contents. Like `cp -r`.
- * Requires the `--allow-read` and `--allow-write` flag.
- * @param src the file/directory path.
- * Note that if `src` is a directory it will copy everything inside
- * of this directory, not the entire directory itself
- * @param dest the destination path. Note that if `src` is a file, `dest` cannot
- * be a directory
- * @param options
- */
-export function copySync(
- src: string,
- dest: string,
- options: CopyOptions = {},
-): void {
- src = path.resolve(src);
- dest = path.resolve(dest);
-
- if (src === dest) {
- throw new Error("Source and destination cannot be the same.");
- }
-
- const srcStat = Deno.lstatSync(src);
-
- if (srcStat.isDirectory && isSubdir(src, dest)) {
- throw new Error(
- `Cannot copy '${src}' to a subdirectory of itself, '${dest}'.`,
- );
- }
-
- if (srcStat.isSymlink) {
- copySymlinkSync(src, dest, options);
- } else if (srcStat.isDirectory) {
- copyDirSync(src, dest, options);
- } else if (srcStat.isFile) {
- copyFileSync(src, dest, options);
- }
-}