/usr/lib/nodejs/grunt-contrib-copy/tasks/copy.js is in node-grunt-contrib-copy 1.0.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | /*
* grunt-contrib-copy
* http://gruntjs.com/
*
* Copyright (c) 2016 Chris Talkington, contributors
* Licensed under the MIT license.
* https://github.com/gruntjs/grunt-contrib-copy/blob/master/LICENSE-MIT
*/
'use strict';
module.exports = function(grunt) {
var path = require('path');
var fs = require('fs');
var chalk = require('chalk');
var fileSyncCmp = require('file-sync-cmp');
var isWindows = process.platform === 'win32';
grunt.registerMultiTask('copy', 'Copy files.', function() {
var options = this.options({
encoding: grunt.file.defaultEncoding,
// processContent/processContentExclude deprecated renamed to process/noProcess
processContent: false,
processContentExclude: [],
timestamp: false,
mode: false
});
var copyOptions = {
encoding: options.encoding,
process: options.process || options.processContent,
noProcess: options.noProcess || options.processContentExclude
};
var detectDestType = function(dest) {
if (grunt.util._.endsWith(dest, '/')) {
return 'directory';
} else {
return 'file';
}
};
var unixifyPath = function(filepath) {
if (isWindows) {
return filepath.replace(/\\/g, '/');
} else {
return filepath;
}
};
var syncTimestamp = function (src, dest) {
var stat = fs.lstatSync(src);
if (path.basename(src) !== path.basename(dest)) {
return;
}
if (stat.isFile() && !fileSyncCmp.equalFiles(src, dest)) {
return;
}
var fd = fs.openSync(dest, isWindows ? 'r+' : 'r');
fs.futimesSync(fd, stat.atime, stat.mtime);
fs.closeSync(fd);
};
var isExpandedPair;
var dirs = {};
var tally = {
dirs: 0,
files: 0
};
this.files.forEach(function(filePair) {
isExpandedPair = filePair.orig.expand || false;
filePair.src.forEach(function(src) {
src = unixifyPath(src);
var dest = unixifyPath(filePair.dest);
if (detectDestType(dest) === 'directory') {
dest = isExpandedPair ? dest : path.join(dest, src);
}
if (grunt.file.isDir(src)) {
grunt.verbose.writeln('Creating ' + chalk.cyan(dest));
grunt.file.mkdir(dest);
if (options.mode !== false) {
fs.chmodSync(dest, (options.mode === true) ? fs.lstatSync(src).mode : options.mode);
}
if (options.timestamp) {
dirs[dest] = src;
}
tally.dirs++;
} else {
grunt.verbose.writeln('Copying ' + chalk.cyan(src) + ' -> ' + chalk.cyan(dest));
grunt.file.copy(src, dest, copyOptions);
syncTimestamp(src, dest);
if (options.mode !== false) {
fs.chmodSync(dest, (options.mode === true) ? fs.lstatSync(src).mode : options.mode);
}
tally.files++;
}
});
});
if (options.timestamp) {
Object.keys(dirs).sort(function (a, b) {
return b.length - a.length;
}).forEach(function (dest) {
syncTimestamp(dirs[dest], dest);
});
}
if (tally.dirs) {
grunt.log.write('Created ' + chalk.cyan(tally.dirs.toString()) + (tally.dirs === 1 ? ' directory' : ' directories'));
}
if (tally.files) {
grunt.log.write((tally.dirs ? ', copied ' : 'Copied ') + chalk.cyan(tally.files.toString()) + (tally.files === 1 ? ' file' : ' files'));
}
grunt.log.writeln();
});
};
|